Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RTTI / Memo.Lines / TStrings (https://www.delphipraxis.net/152626-rtti-memo-lines-tstrings.html)

wicht 29. Jun 2010 21:49

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:
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);
Count ist danach 0, obwohl an den Lines doch eigentlich einiges an Properties hängen müsste, oder?
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:

Stevie 30. Jun 2010 06:08

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.

TheFrog 30. Jun 2010 08:14

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:
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;
Damit hat man dann die gewünschte Instanz und kann drauf reagieren, oder über RTTI weiter nach Properties suchen.

Achja, habe den Code nicht ausprobiert, nur mal schnell zusammengeschrieben.

Ich hoffe das hat irgendwie weitergeholfen!

Hans.

wicht 30. Jun 2010 08:30

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

TheFrog 30. Jun 2010 09:00

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.

Stevie 30. Jun 2010 12:27

AW: RTTI / Memo.Lines / TStrings
 
Zitat:

Zitat von wicht (Beitrag 1032529)
Stevie, ich habe das ganze auch mal mit 2010 getestet. Ist leider das selbe Problem :(

Wenn du es genauso machst, wie vor Delphi 2010, ja. Wenn du die "neue" (enhanced) RTTI benutzt, nein:
Delphi-Quellcode:
uses
  Rtti;

...

var
  Count: Integer;
  Context: TRttiContext;
begin
  Count := Length(Context.GetType(TStrings).GetProperties);
Count ist bei mir 11 (nämlich alle public properties von TStrings mit Ausnahme der index properties)

wicht 30. Jun 2010 12:31

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:

shmia 30. Jun 2010 15:38

AW: RTTI / Memo.Lines / TStrings
 
Mit
Delphi-Quellcode:
...GetPropList(PTypeInfo(Memo1.Lines.ClassInfo),
bist du doch schon eine Ebene zu tief.

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));

wicht 30. Jun 2010 15:42

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 06:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz