341 lines
12 KiB
Plaintext
341 lines
12 KiB
Plaintext
Turbo Pascal 6.0
|
||
----------------
|
||
|
||
This file contains answers to commonly asked questions. See the README
|
||
file for suggestions on where to get more help. If you're programming
|
||
with Turbo Vision, make sure you look at TVISION.DOC for additional
|
||
information.
|
||
|
||
|
||
Floppy use
|
||
----------
|
||
Turbo Pascal 6.0 requires a dual-floppy system (a hard disk is
|
||
recommended). If you're using 720 kbyte floppies (or more), you can
|
||
put TURBO.EXE and TURBO.TPL on the same disk. If you're using 360
|
||
kbyte floppies, you'll need to put TURBO.EXE on Drive B: and TURBO.TPL
|
||
on your boot disk. Boot and then type B:TURBO. You can store your
|
||
source files on the same disk with TURBO.TPL. You can use TPUMOVER to
|
||
make TURBO.TPL smaller by removing units you don't use.
|
||
|
||
If you use the INSTALL program, make sure your floppies are completely
|
||
empty (no system files or COMMAND.COM) before installing. After
|
||
running INSTALL, you can copy TURBO.TPL onto a boot disk.
|
||
|
||
Turbo Pascal's online help system (TURBO.HLP) requires about 700
|
||
kbytes of disk storage and cannot be used on a system equipped
|
||
only with 360 kbyte floppy drives.
|
||
|
||
Once you have used INSTALL to build your working diskettes, you
|
||
can manually UNZIP other Turbo Pascal components (e.g. BGI, Turbo
|
||
Vision or the demo programs) onto other floppy diskettes.
|
||
|
||
|
||
FreePtr and FreeMin
|
||
-------------------
|
||
These Turbo Pascal 5.x identifiers are no longer needed by the new
|
||
heap manager. Simply delete references to FreeMin from your code. If
|
||
you're using routines that use FreePtr to compress the heap or perform
|
||
other implementation-dependent operations on the heap, you'll need to
|
||
update these routines for use with the new heap manager. (If you just
|
||
need to lower the top of memory in order to do an Exec, you can call
|
||
the SetMemTop procedure from the Turbo Vision Memory unit.) See
|
||
Chapter 16 in the Programmer's Guide for more information about how
|
||
the new heap manager works.
|
||
|
||
|
||
HeapError
|
||
---------
|
||
If you are using a HeapError function, make sure it returns
|
||
as quickly as possible when passed a Size value of 0:
|
||
|
||
function HeapError(Size: Word): Integer; far;
|
||
begin
|
||
if Size > 0 then
|
||
begin
|
||
{ ... perform HeapError processing here ... }
|
||
end;
|
||
end;
|
||
|
||
In version 6.0, HeapError is called with a value of 0 whenever an
|
||
allocation moves the HeapPtr upwards.
|
||
|
||
|
||
Mouse Support
|
||
-------------
|
||
Turbo Pascal's IDE and Turbo Vision require a mouse driver compatible
|
||
with Microsoft driver 6.x or later.
|
||
|
||
|
||
286 Code Generation Notes
|
||
-------------------------
|
||
Programs compiled with {$G+} do not check the processor at runtime to
|
||
determine whether it is 286-compatible. Trying to execute 80286
|
||
instructions on an 8086 or an 8088 will lock up the computer.
|
||
Refer to TEST286.PAS in \TP\DEMOS for an example of how to check
|
||
for the presence of a 286-compatible chip at runtime.
|
||
|
||
|
||
$X+ Is Global
|
||
-------------
|
||
The {$X+} compiler directive is global, so it must appear in the
|
||
source code before any declarations or program statements. A $X
|
||
directive elsewhere will cause an "Invalid Compiler Directive" error.
|
||
|
||
|
||
Non-static Constuctor Calls
|
||
---------------------------
|
||
When making inherited constructor calls from inside a method, always
|
||
use the TypeName.ConstructorName syntax. This allows the compiler to
|
||
statically call the inherited constructor and will not change the
|
||
"identity" of the calling object:
|
||
|
||
Correct:
|
||
...
|
||
TObject.Init; { always specify type name }
|
||
...
|
||
|
||
WRONG:
|
||
...
|
||
Init; { may change calling object's "identity" }
|
||
...
|
||
|
||
|
||
DOS Critical Error Handling
|
||
---------------------------
|
||
The IDE and Turbo Vision both provide critical error handling. Due to
|
||
problems with some versions of DOS, however, you may need to press ESC
|
||
several types to successfully cancel an operation after a critical
|
||
error has occurred (e.g. DRIVE NOT READY).
|
||
|
||
|
||
Iterator Methods
|
||
----------------
|
||
The ForEach, FirstThat and LastThat all take a local (nested), far
|
||
procedure or function as a parameter. Refer to Chapter 7 in the Turbo
|
||
Vision Guide for details.
|
||
|
||
Note: never use ForEach to delete items from a collection. The act of
|
||
deleting an item moves subsequent items forward and will result in
|
||
items being skipped.
|
||
|
||
|
||
Editor Swap File
|
||
----------------
|
||
The IDE creates a swap file for its virtual editor with the naming
|
||
convention of TPxxxx.$$$. Never delete this file while the IDE is
|
||
running (e.g. while in a DOS shell). However, if you reboot your
|
||
system while the IDE is running, it is safe to delete the swap file
|
||
before re-loading the IDE.
|
||
|
||
Note that the swap file grows but never shrinks while the IDE is
|
||
running. If you're editing a large file on a drive without much disk
|
||
space available, place the swap file on another drive (ideally a RAM
|
||
disk; use the /S command-line option at startup). If there is no other
|
||
drive available, and you've done an unusual amount of editing of large
|
||
files, you can exit and re-load the IDE and thus reduce the swap file
|
||
down to a normal size.
|
||
|
||
|
||
Inline Assembler Notes
|
||
----------------------
|
||
The built-in assembler works differently than Turbo Assembler in the
|
||
following case. In TASM, there is no distinction between an array of
|
||
some types and a single variable of this type:
|
||
|
||
MyVar DW ?
|
||
MyArray DW 10 DUP(?)
|
||
.
|
||
.
|
||
MOV AX,MyVar
|
||
MOV AX,MyArray[BX]
|
||
|
||
Using TASM on the above example, the type of both "MyVar" and
|
||
"MyArray" is WORD, and either can be loaded into a word-sized
|
||
register without a type cast.
|
||
|
||
This is not the case with Turbo Pascal's built-in assembler. In
|
||
Pascal, an array is not the same as a single variable, and a type
|
||
cast is required when accessing an element of an array, as
|
||
illustrated below:
|
||
|
||
var
|
||
MyVar: Word;
|
||
MyArray: array[0..9] of Word;
|
||
.
|
||
.
|
||
asm
|
||
MOV AX,MyVar
|
||
MOV AX,MyArray[BX].Word
|
||
MOV AX,WORD PTR MyArray[BX]
|
||
end;
|
||
|
||
|
||
Turbo Pascal 6.0 and the Toolboxes
|
||
----------------------------------
|
||
With the exception of the Turbo Editor Toolbox, the 4.0 toolboxes
|
||
will compile with Turbo Pascal 6.0. The Turbo Editor Toolbox
|
||
needs the minor source code changes described below in order to
|
||
work with the new heap manager:
|
||
|
||
MicroStar
|
||
---------
|
||
In MSVARS.PAS:
|
||
1) On line 219 after "var"
|
||
Add "FreePtr: Pointer;"
|
||
2) On line 295 after "begin"
|
||
Add "FreePtr := Ptr(Seg(HeapEnd^) - $1000, 0);"
|
||
In INVOKE.PAS:
|
||
1) On line 18 after "Dos"
|
||
Add ", MsVars"
|
||
|
||
FirstEd
|
||
-------
|
||
In EDVARS.PAS:
|
||
1) On line 139
|
||
Add "FreePtr: Pointer;"
|
||
On line 207
|
||
Add "FreePtr := Ptr(Seg(HeapEnd^) - $1000, 0);"
|
||
|
||
In addition, an updated version of BINED.OBJ is required for use
|
||
with version 6.0 and is available on CompuServe.
|
||
|
||
|
||
************************************************
|
||
Tech Support's Ten Most Commonly Asked Questions
|
||
************************************************
|
||
|
||
1. How do you read and write a file inside a Turbo Pascal
|
||
program?
|
||
|
||
Here's a program that creates a text file and then reads it
|
||
back:
|
||
|
||
program FileDemo;
|
||
var
|
||
FileVar: Text;
|
||
InString, OutString: String;
|
||
begin
|
||
OutString := 'Write this to a text file';
|
||
Assign(FileVar, 'TEST.TXT');
|
||
Rewrite(FileVar); { Creates new text file }
|
||
Writeln(FileVar, OutString);
|
||
Close(FileVar);
|
||
Assign(FileVar, 'TEST.TXT');
|
||
Reset(FileVar); { Opens existing text file }
|
||
Readln(FileVar, InString);
|
||
Close(FileVar);
|
||
end.
|
||
|
||
2. What is the GRAPH.TPU file?
|
||
|
||
GRAPH.TPU is the BGI unit found in BGI.ZIP on your distribution
|
||
diskettes. The INSTALL program puts it in \TP\BGI by default.
|
||
|
||
3. How do you send a program's output to the printer?
|
||
|
||
program Print;
|
||
uses Printer;
|
||
begin
|
||
Writeln(Lst, 'Hello Printer');
|
||
end.
|
||
|
||
4. Why am I getting a "Unit file format error" when I compile my
|
||
program with the new Turbo Pascal compiler?
|
||
|
||
You are using a unit that has been compiled with an earlier
|
||
version of Turbo Pascal. Re-build all your programs with Turbo
|
||
Pascal 6.0 using the command-line compiler's /B switch or using
|
||
the IDE's Compile|Build command.
|
||
|
||
Contact third-party vendors for updated TPU's if you don't
|
||
have the source code.
|
||
|
||
5. How do you calculate X to the power of Y?
|
||
|
||
function Power(X, Y: Real): Real;
|
||
begin
|
||
Power := Exp(Y * Ln(X));
|
||
end.
|
||
|
||
6. How come my program runs fine in the IDE and locks when run
|
||
from the DOS prompt?
|
||
|
||
This usually happens when you have uninitialized variables (for
|
||
another possible reason, refer to the next question).
|
||
|
||
7. I think my program is trashing memory. Which statements are the
|
||
likely culprits?
|
||
|
||
Here are some of the most common causes for out-of-bounds memory
|
||
writes:
|
||
|
||
Problem Suggestion
|
||
------- ----------
|
||
Array index out of range Turn on range checking {$R+}.
|
||
|
||
Uninitialized variable Initialize it, of course.
|
||
|
||
Pointers out of bounds Make sure you're not using
|
||
unallocated pointers or pointers
|
||
to blocks that have been
|
||
disposed.
|
||
|
||
Move, FillChar, BlockRead These routines all write to
|
||
memory without regard for
|
||
Pascal's normal size- and
|
||
type-checking. Make sure you're
|
||
specifying the correct amount of
|
||
data to be moved, filled or
|
||
read.
|
||
|
||
Indexing beyond the size If you're using relaxed var string
|
||
of a string checking {$V-}, make sure you're
|
||
not writing past the end of a
|
||
string (and onto neighboring
|
||
data).
|
||
|
||
8. Why doesn't the Exec procedure run the program I specify?
|
||
|
||
Make sure you define a maximum heap size using a $M compiler
|
||
directive at the beginning of your program. Refer to EXECDEMO.PAS
|
||
in \TP\DEMOS.
|
||
|
||
In addition to omitting a $M compiler directive, two other common
|
||
are common errors can be diagnosed easily by looking at the
|
||
value of DosError after a call to Exec:
|
||
|
||
DosError Explanation
|
||
-------- -----------
|
||
2 File not found. Specify the full path and program
|
||
name. If you're trying to execute an internal DOS
|
||
command (like DIR), you need to Exec COMMAND.COM
|
||
(see the Exec example in online help and the Library
|
||
Reference).
|
||
|
||
8 Not enough memory available to Exec the specified
|
||
program. Lower the amount of heap your program is
|
||
using (see \TP\DEMOS\EXECDEMO.PAS).
|
||
|
||
|
||
9. What do I do if Turbo Pascal gives an "out of memory" error?
|
||
|
||
If you're running out of memory using the IDE, you have many
|
||
configuration options available. Refer to P-146 in the User's
|
||
Guide for a comprehensive checklist.
|
||
|
||
If you're using the command-line compiler and running out of
|
||
memory during a compilation, first try the appropriate
|
||
suggestions on P-146 in the User's Guide. If you're still running
|
||
out of memory during compilation, you should probably TPCX.EXE,
|
||
the extended memory compiler available with Turbo Pascal 6.0
|
||
Professional.
|
||
|
||
10. How come I don't get the results that I expect when I
|
||
compare and print real numbers?
|
||
|
||
Floating point, or real numbers, are an approximation and small
|
||
rounding errors will occur during calculations and
|
||
transformations between numeric types. For a complete discussion
|
||
of this topic, refer to the section on comparing reals in Chapter
|
||
14 in the Programmer's Guide.
|
||
|