                        ===========
                        MANUALS.TXT
                        ===========

This file contains updates to the Delphi books, online Help, and
interactive tutors and lists online text files.

CONTENTS:
1. ONLINE TEXT FILES

2. DELPHI BOOKS:
   Delphi User's Guide
   Delphi Component Writer's Guide
   Delphi Database Application Developer's Guide
   InterBase Language Reference
   Local InterBase Server User's Guide

3. ONLINE HELP

===========================================================================
1. ONLINE TEXT FILES
   The following online text files provide additional
   documentation:

     INSTALL.TXT  - Located in \DELPHI, contains information on
                    troubleshooting installation and
                    configuration problems.
     README.TXT   - Located in \DELPHI, includes late-breaking
                    information, compatibility notes, a list of
                    all example programs, and information on how
                    to get help from Borland.
     READRS.TXT   - Located in \RPTSMITH, README for ReportSmith.
     READIB.TXT   - Located in \IBLOCAL, README for the Local
                    InterBase Server.
     READLINK.TXT - Located in \IDAPI, README for the Borland
                    Database Engine.
     READDBD.TXT  - Located in \DBD, README for the Database
                    Desktop.
     FILELIST.TXT - Located in \DELPHI, contains a list of all
                    files installed by the SETUP program.
     DEPLOY.TXT   - Located in \DELPHI, contains important
                    information about licensing and
                    redistribution of Delphi, ReportSmith,
                    and InterBase applications.
     MANUALS.TXT  - This file.
     INIFILE.TXT  - Located in \DELPHI\DOC, tells you how to
                    customize Delphi via settings in
                    \WINDOWS\DELPHI.INI. Also provides section
                    naming conventions for component writers
                    wishing to store and retrieve design-time
                    information in DELPHI.INI.
     ASCIIDRV.TXT - Located in \DELPHI\DOC, provides information
                    about the ASCII text driver for the BDE.
     VB2DELPH.WRI - Located in \DELPHI\DOC, this technical paper
                    provides hints for Visual Basic who are
                    converting their projects to Delphi.
     TOOLINTF.PAS - Defines the Delphi Open Tools API which
                    allows your custom version control .DLL or
                    expert to interface with the Delphi
                    environment.
     VCSINTF.PAS  - Defines the interface you must provide so
                    Delphi can call your custom version control
                    DLL's entry points.
     VIRTINTF.PAS - Base classes for your custom version control
                    and experts to inherit from.
     EXPTINTF.PAS - Defines the interface you must provide so
                    Delphi can call your expert's entry points.
     ISTREAMS.PAS - Defines a virtual stream interface for
                    communicating data to the Delphi environment.
     DBCTRLS.PAS  - The source code to the DBCTRLS unit to help
                    you understand how to write data aware
                    controls.

2. DELPHI BOOKS

Delphi User's Guide
===================

Legal Page:
-----------
The REDIST.TXT file noted on this page is now called DEPLOY.TXT.

Chapter 5, Writing Object Pascal Code
-------------------------------------
Pages 168, 169, 170: To successfully run the examples on these
pages, add WinCrt to the Uses clause.

Chapter 10, Text Editor Example
-------------------------------
Page 308: The example step starting with "Add Printers..."
should read: "Add Printers and WinCrt to the uses clause".

Chapter 15, OLE example
-----------------------
Page 384: Figure 14.2, the DDE Info Dialog box, has changed in
the following ways: App is now labeled DdeService, Topic is now
labeled DdeTopic, and a Help button is located in the lower right
corner of the box.

Page 385: The first sentence on this page, beginning with "The
App and Topic boxes..."  should read "The DDEService and DDETopic
edit boxes...".

The OLE example application has changed in the following ways:
OLEObjectForm should have the following code attached to its
OnClose event handler:

procedure TOLEObjectForm.FormClose(Sender: TObject;
  var Action:TCloseAction);
begin
  Action := caFree;
end;

Without this code, MDI child windows will minimize by default
(instead of closing).

Page 420: The call to PasteSpecialDlg in the Edit|Paste Special
event handler should read:

  if PasteSpecialDlg(Self, OLEFrameForm.Fmts, 0, ClipFmt, DataHand,
                     Info) then...


Delphi Component Writer's Guide
===============================

Chapter 1, Overview of component creation
-----------------------------------------
Page 11: In the last paragraph on the page, both references to
TWinControl should be to TCustomControl.

Chapter 10, Creating a graphic control
--------------------------------------
Pages 94 and 98:
The Invalidate method does not take a parameter.

Chapter 11, Customizing a grid
------------------------------
Page 103:
The last line in the Create constructor should read

   Options := Options - [goRangeSelect] + [goDrawFocusSelected];

Page 107: The implementation of the IsLeapYear method is missing
one of its parentheses.  The correct implementation follows:

  function TSampleCalendar.IsLeapYear: Boolean;
  begin
    Result := (Year mod 4 = 0)
      and ((Year mod 100 <> 0)
      or (Year mod 400 = 0));
  end;

The DaysThisMonth method implementation is missing the
"TSampleCalendar."  in front of its identifier.

The identifier February in the implementation of DaysThisMonth
should be the number 2.

Chapter 12, Making a control data-aware
---------------------------------------
Page 116: The Calendar component on the Samples page already has
a ReadOnly property, so you do not need to add it if you start
with TCalendar instead of TSampleCalendar.

Page 117: The implementation of the UpdateCalendar method is
missing the "TDBCalendar."  in front of its identifier.

Page 118: You must add the DB and DBTables units to the uses
clause of the component's unit to access the data-awareness
features.


Delphi Database Application Developer's Guide
=============================================

Chapter 3, Using data access components and tools
--------------------------------------------------
Pages 68-69
The description of OnCalcFields and AutoCalcFields in
Chapter 3 is not correct.  For the correct description, see
online help.

Page 79
A dynamic set of TFields is created both at run time and
design time if a persistent set of TFields is not created at
design time with the Fields Editor.

Chapter 6, Building a client/server application
-----------------------------------------------
The description in Chapter 6 of Connected,
Database.KeepConnection and Session.KeepConnections is not
correct.  For the correct description, see online Help.

New information: The Resync method of TDataset enables you to
resynchronize datasets after direct calls to the Borland Database
engine, or after entering data to make sure the new data is
displayed in the form.

***
To execute an SQL statement containing a parameter that you don't
want to bind at run-time, precede the parameter name with a
double colon (for example, ::Parameter1). This is only necessary
in the rare case when you don't want the BDE to bind a value to
the parameter, for example in creating a stored procedure with a
TQuery.

***
In a master-detail form, adding a new record to the detail table
may cause a problem if there are linked NOT NULL fields in the
detail table.  In particular, Sybase servers will return an
error.  To avoid this, enter default values in the OnNewRecord
event.

***
There is a new type to encapsulate table locks:

  TLockType = (ltReadLock, ltWriteLock);

TTable has two new methods that take a TLockType argument:

  procedure LockTable(LockType: TLockType);
  procedure UnlockTable(LockType: TLockType);

These methods will lock the table and unlock the table,
respectively. You can place multiple locks of different types on
a table. For each lock placed, a corresponding call to
UnlockTable with the same lock type is required or the table will
remain locked. Read locks prevent other sessions from placing a
write lock; placing a write lock prevents other sessions from
placing ANY locks.

An exception will be raised if the table is closed or the
requested lock cannot be obtained. Locks only affect other
sessions. For example two TTable components in the same session
that refer to the same physical table share the same locks and a
LockTable performed on one will not prevent access by the other.

These methods are primarily intended for use with Paradox and
dBASE tables. For dBASE tables, read locks are automatically
promoted to write locks. For SQL tables, read and write are the
same and the behavior varies according to the server.

***
TStringField and TMemoField have a Boolean Transliterate
property. When Transliterate is False, Delphi does not
perform any  ANSI/OEM conversion.

***
TTable has a RenameTable method that renames the underlying
database table (for Paradox and dBASE tables only). This method
will rename all associated files (indexes, Blob files, and so
on).


InterBase Language Reference
============================

The InterBase Language Reference and Data Definition Guides were
created to accompany the InterBase Workgroup Server and contain
features that are unsupported on the Local InterBase Workgroup
Server. Refer to the READIB.TXT for a list unsupported features.

The reserved word 'DISPLAY' is not included in the list of
keywords in Appendix A of the InterBase Language Reference.


Local InterBase Server User's Guide
===================================

The dialog box that controls connecting to a database differs
from the explanation present in the User's Guide.  The User's
Guide does not show the Local and Remote server buttons (Page
40).  If those buttons are present, refer to the on-line help for
information.  Similarly, the discussion of creating a database
should mention that a database can be created on a remote server
as well as the local server (pages 40, 73).

User Name and password are required for connection to a remote
database server.  Refer to the online help for information on
connecting to remote databases.

The discussion on the Server/Database Tree should mention both
local and remote databases.  When Server Manager is used with
Local InterBase Server, only local branches of the tree are
accessible (page 139).  After a connection is made to a remote
server, the databases on the remote server are shown in Server
Manager windows.

In Appendix C of the Local InterBase User's Guide (page 189), the
first sentence of the second paragraph states, "The database
(EMPLOYEE.GDB) is created with the data definition file,
CREATEDB.SQL".  That statement is no longer correct.  The
EMPLOYEE.GDB database is already built and included with Local
InterBase Server.  The user does not have to build it.

3. ONLINE HELP:

Installation Help
=================
Help for the first Delphi Installation Dialog box lists Turbo
Debugger as one of the products installed with Delphi. Turbo
Debugger is not included with this version of Delphi.

Run-Time Library information:
=============================
Run-Time Library examples that use Writeln: in order to use
Writeln you must add WinCrt to the Uses clause.

VCL information:
================
Please note the following new VCL information:

Cursor Property:
================
The crNone property value hides the cursor and is not listed in
the table in the "Cursor property" help topic:

  crNone = -1;

Add Method of TFieldDefs:
-------------------------
Declaration:
procedure Add(const Name: string; DataType: TFieldType; Size:
  Word; Required: Boolean);

The value of the Required parameter initializes the
TFieldDefs.Required property.

Hints property of TDBNavigator:
-------------------------------
Declaration:
property Hints: Tstrings;

Description:
The Hints property allows you to customize the help hints
for the buttons on the database navigator. Each hint is
a string. The first string in the string object becomes the
Help Hint for the first button on the navigator. The seventh
hint becomes the Help Hint for the seventh button (the Edit
button).
If you don't want to change the Help Hint for every
button, enter an empty string (") for the Help Hint you want
to stay the same, or simply leave the the line blank if you
are using the string list property editor of the Object Inspector
for the Hints property.

ItemAtPos method of TTabSet
---------------------------
Description:
The declaration in the online help should read:

  function ItemAtPos(Pos: TPoint): Integer;


GetDatabaseNames method of TSession:
------------------------------------
Description:
The GetDatabaseNames method clears the TStrings List parameter
and fills it with the names of all BDE and application-specific
aliases.

FormCount property of TScreen:
------------------------------
Description:
Run-time and read only. The FormCount property value contains the
number of forms in the TScreen.Forms property array.

OnShowHint property of TApplication:
------------------------------------
Description:
The OnShowHint event occurs when the application is about to
display a hint window for a Help Hint for a particular control.
By writing an event handler for OnShowHint, you can change the
appearance and behavior of the Help Hint. Use the HintStr, CanShow,
and HintInfo parameters of the TShowHintEvent method pointer
to modify the Help Hint and its window. The HintInfo parameter
is a record of type THintInfo.

Brush property of TCanvas
-------------------------
Description:
When you make changes to a bitmap that a Brush is referencing,
you need to force the Brush to update itself by setting its style
to bsSolid and then reassigning the bitmap to the brush:

  Canvas.Brush.Bitmap := MyBitmap;
  ...
  MyBitmap.Canvas.FillRect(Rect(0, 0, 8, 8));
  ...
  Canvas.Brush.Style := bsSolid;    { this line required }
  Canvas.Brush.Bitmap := MyBitmap;

CallExitProcs procedure in SysUtils unit
----------------------------------------
CallExitProcs executes all installed exit procedures. The exit
procedures are executed in reverse order of definition, i.e. the
last one installed is the first one to get executed. As the
procedures are executed, they are removed from the exit procedure
chain. Thus, following a call to CallExitProcs, the ExitProc
variable (defined in the System unit) will be NIL.

CallExitProcs is intended for use in the termination procedure of
a DLL. Refer to the \DELPHI\DEMOS\DB\BDEDLL directory for an
example of a DLL that uses CallExitProcs as part of its shutdown
handling.

Using StretchDIBits instead of Draw for bitmap printing
-------------------------------------------------------
Bitmap printing - When printing a bitmap, make sure to use the
Windows API routine StretchDIBits. For example, here's a function
that prints an arbitrary TBitmap at the specified X,Y location:

  procedure PrintBitmap(Bitmap: TBitmap; X, Y: Integer);
  var
    Info: PBitmapInfo;
    InfoSize: Integer;
    Image: Pointer;
    ImageSize: Longint;
  begin
    with Bitmap do
    begin
      GetDIBSizes(Handle, InfoSize, ImageSize);
      Info := MemAlloc(InfoSize);
      try
        Image := MemAlloc(ImageSize);
        try
          GetDIB(Handle, Palette, Info^, Image^);
          with Info^.bmiHeader do
            StretchDIBits(Printer.Canvas.Handle, X, Y, Width,
              Height, 0, 0, biWidth, biHeight, Image, Info^,
              DIB_RGB_COLORS, SRCCOPY);
        finally
          FreeMem(Image, ImageSize);
        end;
      finally
        FreeMem(Info, InfoSize);
      end;
    end;
  end;
-----------------------------------------------------------------
