![]() |
RTTI / Memo.Lines / TStrings
Hi Forum,
ich hätte da mal eine Frage... :roll: Ich gehe mit Hilfe von GetPropList() durch alle Komponenten meiner Form und setze String-Eigenschaften (hier geht es um das Lingus-Programm...). Das klappt auch super, und jetzt wollte ich nicht mehr nur Text/Caption/Hint unterstützen, sondern z.B. auch TMemo.Lines.Text. Sah eigentlich auch einfach zu machen aus, aber nun kommt das Problem:
Delphi-Quellcode:
Count ist danach 0, obwohl an den Lines doch eigentlich einiges an Properties hängen müsste, oder?
var
Count: Integer; PropList: TPropList; begin Count := GetPropList(PTypeInfo(Memo1.Lines.ClassInfo), [tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray, tkUString, tkClassRef, tkPointer, tkProcedure], @PropList); Weiß jemand, warum das hier so ist, und was man machen könnte, damit es so klappt? Wäre ja schön, wenn ich mein zur Zeit genutztes Verfahren (Alle Eigenschaften durchgehen, wenn String gefunden wird, dem einen Wert zuweisen) auch dafür benutzen könnte, und nicht für TStrings eine Extra-Behandlung einbauen müsste... Vielen Dank im vorraus und noch einen schönen Abend :stupid: |
AW: RTTI / Memo.Lines / TStrings
Wenn ich mich recht erinnere, kann die "alte" RTTI (also die vor Delphi 2010) nur published properties, und davon hat eine TStringList keine.
|
AW: RTTI / Memo.Lines / TStrings
Ich weiß jetzt nicht, ob ich das alles richtig verstanden habe, aber man kann ja leicht auf öffentliche Objekte einer Klasse prüfen:
Delphi-Quellcode:
Damit hat man dann die gewünschte Instanz und kann drauf reagieren, oder über RTTI weiter nach Properties suchen.
var
PList: PPropList; PropCount: Integer; NestedObj: TObject; i: Integer; begin PropCount := GetPropList(AObj, PList); for i := 0 to PropCount - 1 do begin if PList[i].PropType^.Kind = tkClass then begin NestedObj := GetObjectProp(aInstance, aPropInfo.Name); if NestedObj is TStrings then begin // do something end; end; end; FreeMem(PList, PropCount * SizeOf(Pointer)); end; Achja, habe den Code nicht ausprobiert, nur mal schnell zusammengeschrieben. Ich hoffe das hat irgendwie weitergeholfen! Hans. |
AW: RTTI / Memo.Lines / TStrings
Hey,
danke für eure Antworten! Stevie, ich habe das ganze auch mal mit 2010 getestet. Ist leider das selbe Problem :( So wie Hans es hier beschrieben hat muss ich es wohl machen, die Möglichkeit kam mir auch in den Sinn. Nur habe ich eben eine Funktion, die über alle Controls drüber geht, und dann gibt es eine Funktion, die eine String-Property setzt und noch ein paar andere Dinge tut, zum Beispiel sich den Original-Text merken.. Aber wenn hier keine weiteren Tipps folgen, werde ich es wie von Hans vorgeschlagen machen müssen, so dass TStrings eine "spezial"-Behandlung gibt. Liebe Grüße, Alexander |
AW: RTTI / Memo.Lines / TStrings
Ich denke das Problem ist, dass TStrings (wie Stevie schon erwähnt hat) keine published properties besitzt. Ansonsten würde sich die Möglichkeit anbieten, einfach rekursiv mit der gefundenen Object-Instanz weiter zu suchen. In Deinem Fall wird dir wohl nichts anderes übrig bleiben, als die Sonderbehandlung.
Hans. |
AW: RTTI / Memo.Lines / TStrings
Zitat:
Delphi-Quellcode:
Count ist bei mir 11 (nämlich alle public properties von TStrings mit Ausnahme der index properties)
uses
Rtti; ... var Count: Integer; Context: TRttiContext; begin Count := Length(Context.GetType(TStrings).GetProperties); |
AW: RTTI / Memo.Lines / TStrings
Guck an, das kannte ich auf diese Art noch gar nicht. Wieder was gelernt, nur leider so nicht nutzbar, weil ich ältere Delphi Versionen gern noch unterstützen wollte.
Trotzdem danke :thumb: |
AW: RTTI / Memo.Lines / TStrings
Mit
Delphi-Quellcode:
bist du doch schon eine Ebene zu tief.
...GetPropList(PTypeInfo(Memo1.Lines.ClassInfo),
Hier mal ein kleiner Ausschnitt aus meinem Objekt-Browser:
Delphi-Quellcode:
// das Objekt wäre hier das Memo
// und der Propertyname (PName) ist 'Lines' case PropType(obj,PName) of ... tkClass: if GetObjectProp(obj, PName) is TStrings then ShowMessage('TStrings Property ' + PName + ':'#13#10 + TStrings(GetObjectProp(obj, PName)).Text) else if GetObjectProp(obj, PName) is TDataSet then DataSetBrowser(GetObjectProp(obj, PName) as TDataSet,DS_DEBUG,'Dataset property ' + PName) else ShowObjectBrowser(GetObjectProp(obj, PName)); |
AW: RTTI / Memo.Lines / TStrings
Ja, wenn ich TMemo.Lines haben will, bin ich zu tief. Das habe ich aber schon und möchte nun TMemo.Lines.Text, was ja scheinbar nicht möglich ist.
Oder habe ich dich falsch verstanden? ISt aber nun latte, ich bin gerade zuhause angekommen und werde es jetzt mit dem "unschönen" Lösungsweg erledigen. Allen Antwortern nochmal danke :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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