![]() |
AW: GetPropList weigert sich
Habe das fertige Kompilat von dem Testprogramm mal hier bei mir über Wine ausgeführt. Auch hier eine AV auf $00000001.
Delphi habe ich nicht, aber ich habe es mal mit dem FPC gegen die LCL kompiliert, das läuft problemlos. |
AW: GetPropList weigert sich
Hallo,
Zitat:
Delphi-Quellcode:
herum. Wenn du ohne diesen Schalter anzumachen von einer Klasse erbst, bei deren Definition dieser nicht an war und einen Published-Teil hast, wirft Delphi eine Warnung. In der Hilfe zu der Warnung ist glaube ich das Thema auch erklärt.
{$M+}
{$M-} Einbeliebigername. Edit: Was vergessen. |
AW: GetPropList weigert sich
Diese Warnung hatte ich nicht :gruebel: (Weiss ich recht genau, da ich mit einem Kompilat idR erst zufrieden bin, wenn 0 Fehler, 0 Warnungen und 0 Hinweise nach Erstellen da stehen.)
Ich werd das morgen nochmals testen, da ich wegen RegisterClass() (wegen FindClass()) nun ohnehin auf TPersistent aufsetze. Ein dumpfes Gefühl sagt mir, dass das dennoch in diesem seltsamen "Hüpfer" enden wird, aber man soll ja optimistisch sein! Danke euch schon mal! |
AW: GetPropList weigert sich
Hallo,
Zitat:
Ich habe noch mal mein Rad2007 angeworfen und ein Test-Programm geschrieben. Beim Schreiben ist mir dann auch noch ein Fehler in deinem Code aufgefallen. In der Zeile
Delphi-Quellcode:
fehlt das
for i := 0 to propCount do
Delphi-Quellcode:
.
-1
Folgender Sourcecode steht zur Diskussion.
Delphi-Quellcode:
Wenn man den so kompiliert, mit dem Auskommentierten, gibt es folgende Warnung:
program RttiProject1;
{$APPTYPE CONSOLE} uses Classes, TypInfo; type //{$M+} // Variante 1 TTest= class//(TPersistent) // Variante 2 strict private fTest: Integer; published property Test: Integer read fTest write fTest; end; //{$M-} var Obj: TTest; List: PPropList; Count, I: Integer; begin Obj:= TTest.Create; try Count := GetPropList(Obj, List); for I := 0 to Count- 1 do Writeln(List[I].Name); finally Obj.Free; end; Writeln('Press Enter'); Readln; end.
Code:
Man sollte sich den Text auch mal durch lesen. Denn eigentlich ist das genau das was du willst. Trotzdem funktioniert das Programm nicht wie gewollt. Es bleibt bei
[DCC Warnung] RttiProject1.dpr(14): W1055 PUBLISHED verursachte, dass RTTI ($M+) zu Typ 'TTest' hinzugefügt wurde
Delphi-Quellcode:
hängen (Nach 10 Sekunden hatte ich keine Lust mehr zu warten). Erst wenn man Variante 1 oder 2 ein kommentiert geht es wie gewollt. Wenn man ohne Variante 1 und 2 auf das published verzichtet hängt es auch. Wer lügt da nun. Die Warnung oder die Funktion. Ich Tippe auf den Compiler, der hat immer Schuld.
GetPropList
Einbeliebigername. |
AW: GetPropList weigert sich
Da brat mir einen einen Storch. Du hast von vorne bis hinten Recht, auch mit der Warnung. :oops: Manchmal ist man ja schon etwas Blindfischig. Mit TPersistent als Vorfahr geht alles wie am Schnürchen, und da ich es ohnehin brauche, ist meine Welt nun wieder völlig genesen :) Besten Dank an alle! (FPC scheint da dann wohl etwas weniger stringent zu sein.)
|
AW: GetPropList weigert sich
Zitat:
|
AW: GetPropList weigert sich
Es geht (bei mir) auch bei Nachfahren von TObject, wenn man {$M+} für diese Klasse definiert.
|
AW: GetPropList weigert sich
Zitat:
|
AW: GetPropList weigert sich
Ich würde schätzen, dass dann der Compiler eine Hand voll mehr RTTI-Infos für diese Klasse erzeugt. Da sich der Schalter auch auf alle Ableitungen auswirkt, und TPersistent die "jüngste" VCL Klasse ist, die den Schalter setzt, "erbe" ich quasi davon mit. Ich nehme einfach mal an, dass FPC grunsätzlich die Infos macht, oder der Schalter per Default projektweit an ist.
Ein einfaches {$M+} hätte mir hier denke ich geholfen, da ich aber ohnehin RegisterClass() brauche, und das als Parameter eine TPersistentClass will, sind das quasi zwei Fliegen mit einer Klappe. Komisch ist, dass die Warnmeldung bei published-Properties ohne {$M+} lautet: Zitat:
|
AW: GetPropList weigert sich
Auch wenn das Thema alt ist, hat es bei mir geholfen es Local zu deklarieren und schon verschwand bei mir die Meldung vom TE die ich auch hatte
Delphi-Quellcode:
Gruß
ar plist: PPropList;
i, n: Integer; LBotCommands2: TBotCommands2; begin LBotCommands2:= TBotCommands2.Create(Self); try n := GetPropList(LBotCommands2,plist); try for i := 0 to n-1 do mmo1.Lines.Add(plist^[i]^.Name); finally FreeMem(plist); end; finally LBotCommands2.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz