[fpc-devel] GetPropList and order of properties returned
Graeme Geldenhuys
graemeg at opensoft.homeip.net
Tue Dec 20 11:07:15 CET 2005
Hi,
What are the rules regarding the order of a unsorted list of published
properties using the GetPropList method, when inheritance has been used.
I had unit tests from a Delphi app that detected this difference.
Below is the results from Delphi and FPC. The first set has been
compiled with Delphi 7 and the second set of results from a exectable
compiled with FPC 2.0.1
As you can see, Delphi lists the properties from the root object out,
and FPC lists them from the outer object in. Which one is doing it
correctly, or is there no set rule?
[Delphi 7]
C:\Programming\Tests\GetPropList\D7_2>Project1.exe
Total property Count: 4
Property 1: Caption
Property 2: IntProp
Property 3: StrProp
Property 4: AnotherStrProp
---------------
[FPC 2.0.1]
C:\Programming\Tests\GetPropList\D7_2>Project1.exe
Total property Count: 4
Property 1: AnotherStrProp
Property 2: IntProp
Property 3: StrProp
Property 4: Caption
---------------
Here is the full source of the application
-------------------------------------------------
program project1;
{$IFDEF FPC}
{$mode objfpc}{$H+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
SysUtils,
TypInfo,
Classes;
type
TAObject = class(TPersistent)
private
FCaption: string;
published
property Caption: string read FCaption write FCaption;
end;
TBObject = class(TAObject)
private
FIntProp: Integer;
FStrProp: String;
published
property IntProp: Integer read FIntProp write FIntProp;
property StrProp: String read FStrProp write FStrProp;
end;
TCObject = class(TBObject)
private
FAStrProp: String;
published
property AnotherStrProp: String read FAStrProp write FAStrProp;
end;
procedure ShowProperties;
var
Obj: TCObject;
i: Longint;
lPropFilter: TTypeKinds;
lCount: Longint;
lSize: Integer;
lList: PPropList;
begin
Obj := TCObject.Create;
lPropFilter := [tkInteger, tkLString {$ifdef FPC}, tkAString{$endif}];
lCount := GetPropList(Obj.ClassInfo, lPropFilter, nil, false);
lSize := lCount * SizeOf(Pointer);
GetMem(lList, lSize);
Writeln('Total property Count: ' + IntToStr(lCount));
lCount := GetPropList(Obj.ClassInfo, lPropFilter, lList, false);
for i := 0 to lCount-1 do
begin
Writeln('Property '+IntToStr(i+1)+': ' + lList^[i]^.Name);
end;
FreeMem(lList);
Obj.Free;
Writeln('---------------');
end;
begin
ShowProperties;
end.
-------------------------------------------------
I'm running FPC 2.0.1 that came with Lazarus 0.9.10 on Windows 2000.
Regards,
- Graeme -
More information about the fpc-devel
mailing list