[lazarus] mwEdit Problems
Curtis White
osiriz at teleport.com
Thu Oct 21 00:42:43 EDT 1999
I came upon two problems in the cbUtils unit when working to compile mwEdit
that I don't know exactly how to fix. I don't know if they are compiler bugs or
something else. Can someone take a look at the following and tell me how I can
fix it for FPC?
In the cbUtils unit, are the following definitions:
TSpeedListObject = class
protected
FName: String;
FSpeedList: TSpeedStringList;
procedure SetName(const Value: String); virtual;
public
Property Name: String read FName write SetName;
{$IFDEF MWE_FPC}
constructor create(aname: string);
{$ELSE}
constructor create(name: string);
{$ENDIF}
destructor destroy; override;
property SpeedList: TSpeedStringList read FSpeedList write FSpeedList;
end;
PSpeedListObjects = ^TSpeedListObjects;
TSpeedListObjects = array [0..0] of TSpeedListObject;
TSpeedStringList = class
private
function GetText: string;
procedure SetText(const Value: string);
Protected
FOnChange: TNotifyEvent;
SumOfUsed: array [0..NbSubList-1] of integer;
datasUsed: array [0..NbSubList-1] of integer;
datas: array [0..NbSubList-1] of PSpeedListObjects;
lengthDatas: array [0..NbSubList-1] of integer;
procedure Changed; virtual;
function Get(Index: Integer): string; virtual;
function GetObject(Index: Integer): TSpeedListObject;
function GetCount: integer;
Function GetStringList: TStrings;
Procedure SetStringList(const value: TStrings);
public
Procedure NameChange(const obj: TSpeedListObject; const NewName: String);
Procedure ObjectDeleted(const obj: TSpeedListObject);
destructor Destroy; override;
constructor create;
function Add(const Value: TSpeedListObject): Integer;
procedure Clear;
function Find(const name: String): TSpeedListObject;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property Objects[Index: Integer]: TSpeedListObject read GetObject;
property Strings[Index: Integer]: string read Get; default;
property count: integer read GetCount;
Property StringList: TStrings read GetStringList write SetStringList;
property text: string read GetText write SetText;
end;
Then the function below implements the Add function.
function TSpeedStringList.Add(const Value: TSpeedListObject): Integer;
var
crc: integer;
i: integer;
begin
crc:= StringCrc(Value.Name) mod (High(Datas)+1);
if DatasUsed[crc]=lengthDatas[crc] then begin
{$IFDEF MWE_FPC}
ReallocMem(datas[crc], DatasUsed[crc],
(lengthDatas[crc]*2+1)*SizeOf(datas[1][0]));
{$ELSE}
ReallocMem(datas[crc], (lengthDatas[crc]*2+1)*SizeOf(datas[1][0]));
{$ENDIF}
lengthDatas[crc] := lengthDatas[crc]*2+1;
end;
Datas[crc][DatasUsed[crc]]:= Value;
result:= SumOfUsed[crc]+DatasUsed[crc];
inc(DatasUsed[crc]);
for i:= crc+1 to High(SumOfUsed) do
inc(SumOfUsed[i]);
Value.SpeedList:= Self;
end;
The first problem I had was in the constructor of the TSpeedListObject. It
passes in a parameter called "name". There is also a property called name. When
I tried to compile this, it had a problem because the compiler confused the
parameter with the property and gave me an error stating that Name was already
defined. I put in the MWE_FPC defines as above and renamed it to "aname" and it
compiles fine. Is this a possible bug in the compiler, or is it a bug in Delphi
that allows it?
The second problem is in the implementation of the Add method above. The
following line
Datas[crc][DatasUsed[crc]]:= Value;
causes the following compiler error
Incompatible types: got "TSPEEDLISTOBJECT" expected "TSPEEDLISTOBJECTS"
It looks to me like it is trying to do some sort of two dimensional array or
something. I don't understand what this is doing, so I don't know how to fix
it. Can someone explain what this is doing and how I an fix it to work in FPC?
Again, if you don't understand my message, just try compiling the cbUtils.pas
unit in the mwEdit directory. I am committing the changes I have made to CVS so
it will have the same code I am working on.
Curtis
More information about the Lazarus
mailing list