/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Nybegynder med RTTI...
Fra : Thomas Eg Jørgensen


Dato : 23-01-07 15:18

Hej,

Jeg har en lang række klasser som alle nedarver fra en "parent-klasse".
I denne parentklasse har jeg en funktion som gerne skulle behandle data
i underklasserne(dvs læse properties i underklasserne og derefter udføre
bestemte handlinger afhængig heraf)...

Simplificeret eksempel:

TParent = class
public
Procedure DoStuff;
end;

TChild1 = class(TParent)
FSomeOne: string
published
property SomeOne: string read FSomeOne;
end;

TChild2 = class(TParent)
FSomeTwo: string
published
property SomeTwo: string read FSomeTwo;
end;

Say at jeg nu ønsker at DoStuff skal give lave en ShowMessage() for hver
publiseret string-property så ville jeg kalde:
var
MyChild1: TChild1;
MyChild2: TChild2;
begin
MyChild1.DoStuff;
MyChild2.DoStuff;
end;

....nu begynder det så at blive en smule kringlet:
procedure DoStuff;
var
Count, Loop: Integer;
List: PPropList;
begin
Count := GetPropList(ClassInfo, tkProperties, nil) ;
GetMem(List, Count * SizeOf(PPropInfo)) ;
try
GetPropList(ClassInfo, tkProperties, List) ;
for Loop := 0 to Pred(Count) do
begin
showmessage(List[Loop]^.Name);
end;
finally
FreeMem(List, Count * SizeOf(PPropInfo))
end;
end;

Jeg ville så forvente at få to message-bokse, en der indeholder
"SomeOne" og den anden der indeholder "SomeTwo"...
MEN! ClassInfo dutter ikke. Hvis jeg derimod "snyder" lidt og henter
ClassInfo-pointeren med fra mine childobjecter går det fint...Lidt ala
nedenstående(i praksis har jeg løst det ved at tilføje et argument til
constructoren på parentklassen):

var
MyChild1: TChild1;
MyChild2: TChild2;
begin
MyChild1.DoStuff(MyChild1.ClassInfo);
MyChild2.DoStuff(MyChild2.ClassInfo);
end;

procedure DoStuff(FClassInfo: PTypeInfo);
var
Count, Loop: Integer;
List: PPropList;
begin
Count := GetPropList(FClassInfo, tkProperties, nil) ;
GetMem(List, Count * SizeOf(PPropInfo)) ;
try
GetPropList(FClassInfo, tkProperties, List) ;
for Loop := 0 to Pred(Count) do
begin
showmessage(List[Loop]^.Name);
end;
finally
FreeMem(List, Count * SizeOf(PPropInfo))
end;
end;

Så bliver alt som det skal være og jeg får mine to message-bokse

MEN jeg synes ikke dette er særlig "kønt" og jeg tvivler ærlig talt på
at jeg har gjort det rigtigt Hvordan kan jeg slippe uden om at skulle
sende child-klassens runtime objektinformation med til parentklassens
funktioner?

Jeg er helt grøn i det her så det er muligt at ovenstående er skudt helt
i hampen, så må i endelig sige til

PS: ovenstående er voldsomt simplificeret i forhold til den aktuelle
situation, men principperne er det samme...

På forhånd tak...

MVH
Thomas



 
 
Brian Andersen \(www~ (25-01-2007)
Kommentar
Fra : Brian Andersen \(www~


Dato : 25-01-07 16:15

Hej Thomas,

jeg har kun kort skimtet din kode. Jeg har ikke kigget på RTTI længe, men
husk, at bruge {$M+} før klasse definering og {$M-} efter klasse definering.
Jeg nedarver altid fra TPersistent, som jeg også vil mene er det mest
korrekte. Og, her har Borland sat de to direktiver. De tænder og slukker for
RTTI generering ved kodegenerering. Du kan også bruge {$TYPEINFO ON} eller
{$TYPEINFO OFF} som gør det samme.

/Brian



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste