| Bug # | Delphi versions | Description |
| 115 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Identically declared (pointer) variables not assignment compatible |
| 116 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Not compiler bugs but causing problem to many people: Name conflicts between units. Examples: Beep, DeleteFile, FindClose, TBitmap |
| 127 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Combining absolute and procedural variables is not always completely understood by the compiler |
| 139 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Compiler doesn't accept the 'nested' use of object types in type declarations anymore |
| 149 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
unit mxarrays not found; TSmallIntArray unknown identifier. This stuff is available only in the C/S version but the help of the Professional version also suggests it is available. The same goes for the decision cube component. |
| 157 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Unit order in USES clause |
| 451 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Functions returning small objects give erroneous compiling error message |
| 471 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
When doing a recursive compile to ensure USEd units are up to date, the compiler sometimes goes into a loop, eventually giving a Stack overflow error. |
| 499 | 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 |
Code with $IFDEFs in the class declaration of a TForm or TDataModule cannot be compiled, but in Delphi 4 there's a workaround |
Bug #115; last modified: before April 1998| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Gotcha | Gotcha | Gotcha | Gotcha | Gotcha | Gotcha | Gotcha | Gotcha |
This is not a bug but a feature; it's documented in the Types chapter of the Object Pascal Laguage Guide under "Identical and Compatible Types," two pointer types are compatible only when they point to identical types *and* the type-checked pointers compiler switch is enabled with the {$T+} directive.
procedure TForm1.FormCreate(Sender: TObject); var myptr : ^Byte; head : ^Byte; begin myptr := head; end;Delphi 3 (5.53) reports incompatible types on the line of assignment. Rewriting the variable declarations as
var myptr, head : ^Byte;will work around the problem. This problem does apply to all types (e.g. TMyRecord = record ... end;), not only generic types.
Bug #127; last modified: 12-Jul-98| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Unknown | Exists | Exists | Unknown | Unknown | Fixed | Fixed | Fixed |
program BadType;
{$APPTYPE Console}
{$DEFINE Bug}
uses
SysUtils;
type
IntProc = procedure(I: Integer);
PtrProc = procedure(P: Pointer);
var Proc1: IntProc;
var Proc2: PtrProc absolute Proc1;
procedure ShowInt(I: Integer);
begin
Writeln( 'I = ', I )
end;
var
P: Pointer = Nil;
begin
Proc1 := ShowInt;
{$IFDEF Bug}
Proc2(P)
{$ELSE} // Explicit typecast required
PtrProc(Proc2)(P)
{$ENDIF}
end.
The compiler gives an error message:
"Missing operator or semicolon" on the P of Proc2(P).
Bug #139; last modified: 11-Jul-98| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Absent | Exists | Unknown | Unknown | Fixed | Fixed | Fixed | Fixed |
type
TSomeObject = object
function Equal(Obj1, Obj2: TSomeObject): Boolean;
end; { TSomeObject }
The Delphi 2.01 compiler issues an error at the line containing function
Equal (at the reference of TSomeObject):
"Type not completely defined yet". PSomeObject=^TSomeObject;
TSomeObject=Object
function Equal(Obj1, Obj2: PSomeObject);
End;
now all you have to do is add an @ before each of the calling params. call:
Equal(@AnObj1, @AnObj2);
Bug #157; last modified: before April 1998| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Gotcha | N/A | N/A | N/A | Unknown | Unknown | Unknown | Unknown |
Bug #451; last modified: 28-Oct-98| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Absent | Exists | Exists | Exists | Exists | Exists | Exists | Exists |
This is a bug becasue:
const
n = 4; // 1 to 4 not ok. >= 5 ok !
type
obj= object
b: array [1..n] of byte;
procedure proc;
end;
procedure obj.proc;
begin end;
function func: obj;
begin end;
var x: byte;
begin
x:= func.b[1]; // ok
with func do proc; // ok
func.proc; // Error: Variable required !!!
end.
Bug #471; last modified: 6-Oct-98| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Unknown | Unknown | Unknown | Unknown | Exists | Unknown | Unknown | Unknown |
When doing a recursive compile to ensure USEd units are up to date, the compiler sometimes doesn't recognise this situation, and instead starts to go into a loop, eventually giving a Stack overflow error.
I ran into this with a large package containing 500+ files and couldn't reproduce it with a simple test case - but could reproduce it on demand in the original situation.
Bug #499; last modified: 30-Oct-98| 1.02 | 2.01 | 3.0 | 3.01 | 3.02 | 4.0 | 4.01 | 4.02 |
| Unknown | Gotcha | Gotcha | Gotcha | Gotcha | Gotcha | Gotcha | Gotcha |
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Unit2;
type
{$IFDEF MyCompilerDirective}
TForm3 = class(TForm)
{$Else}
{$IFDEF HandleParserError} ; {This never compiles. It's a work
around}{$ENDIF}
TForm3 = class(TForm2)
{$EndIF}
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.DFM}
end.
If you don't have the HandelParserError line,
It effects using IFDEF to change a Form or DataModule's ancestor in any form or
data module declaration.
The problem does not exist in declaring any class, only Forms and
DataModules.
The workaround only works in Delphi 4 (not Delphi 3 or Delphi 2).