Newsgroups : Borland : borland.public.delphi.rtl.win32 : 2006 Sep : Help with RTTI and tkDynarray

www.cryer.info
Managed Newsgroup Archive

Help with RTTI and tkDynarray

Subject:Help with RTTI and tkDynarray
Posted by:"Matthew" (matth..@gisltd.com)
Date:Mon, 18 Sep 2006 09:27:19

I'm looking to use RTTI to get information about an array of a class that
I'm working on. I can not seem to return the Dynarray from RTTI, so I can't
get hold of the contained elements. As an example I put together a test
scenario. I'd appreciate it if anybody could give me a clue as to use RTTI
with Dynarrays.

In this example I'd like to use RTTI to get information regarding the
TPersonlist contained in the TPersonListObj class. Using GetPropValue
returns back an unassigned variant.

I came across a function in Soap that seems helpful
GetDynArrayElTypeInfo(PropInfo^.PropType^,ElementTypeInfo, Dimensions); This
seems to give me information regarding what's contained in the array, but I
can't seem to get a handle on the classes so I can get RTTI on the contained
class.

Any assistance would be greatly appreciated.

Matthew Krasnick

Manager Applications Development


type

TPerson = class(TComponent)

private

FFirstName: string;

FLastName: string;

FDOB: TDateTime;

published

property FirstName: string read FFirstName write FFirstName ;

property LastName: string read FLastName write FLastName ;

property DOB : TDateTime read FDOB write FDOB ;

end;

TPersonList = Array of TPerson ;

TPersonListObj = class(TComponent)

private

FPersonList: TPersonlist;

FCount: integer;

procedure SetCount(const Value: integer);

function GetItem(Index: Integer): TPerson;

procedure SetItem(Index: Integer; const Value: TPerson);

public

constructor Create(AOwner: TComponent) ; override ;

destructor Destroy; override;

property Items[Index: Integer]: TPerson read GetItem write SetItem ; default
;

published

property PersonList : TPersonlist read FPersonList write FPersonList ;

property Count : integer read FCount write SetCount ;

end;


procedure TForm1.Button2Click(Sender: TObject);

var

I, Count: Integer;

PropInfo: PPropInfo;

TempList, TempList2: PPropList;

Data, OutVar : Variant;

DynArray: Pointer;

ElemInfo,ElementTypeInfo: PTypeInfo;

Dims, Dimensions: Integer;

ArrayName: string ;

o : pointer ;

v: Variant ;

begin

Count := GetPropList(PersonListObj, TempList);

if Count > 0 then

begin

try

for I := 0 to Count - 1 do

begin

PropInfo := TempList^[I];

if not IsPublishedProp(PersonListObj, PropInfo^.Name) then Continue;

case PropInfo^.PropType^.Kind of

TKDynArray:

begin

// This function returns information regarding the array including the class
name

GetDynArrayElTypeInfo(PropInfo^.PropType^,ElementTypeInfo, Dimensions);

// GetPropInfos(ElementTypeInfo, Templist2);

(* if GetTypeData(ElementTypeInfo)^.classtype = TKPerson then

Showmessage('TKPerson');

// This returns an unassigned variable

v:= GetPropValue(PersonListObj,PropInfo^.Name) ;

end;

finally

FreeMem(TempList);

end;

end;

end;

Replies:

www.cryer.info
Managed Newsgroup Archive