AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RTTI / Memo.Lines / TStrings

Ein Thema von wicht · begonnen am 29. Jun 2010 · letzter Beitrag vom 30. Jun 2010
Antwort Antwort
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#1

RTTI / Memo.Lines / TStrings

  Alt 29. Jun 2010, 22:49
Hi Forum,

ich hätte da mal eine Frage...
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
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 07:08
Wenn ich mich recht erinnere, kann die "alte" RTTI (also die vor Delphi 2010) nur published properties, und davon hat eine TStringList keine.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 09:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#4

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 09:30
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
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
TheFrog

Registriert seit: 24. Mär 2009
145 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 10:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 13:27
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)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#7

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 13:31
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
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 16:38
Mit ...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));
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#9

AW: RTTI / Memo.Lines / TStrings

  Alt 30. Jun 2010, 16:42
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
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 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