Entwickler-Ecke

Sonstiges (Delphi) - [RTTI] GetPropInfo funktioniert nicht immer


HelgeLange - Do 26.11.09 17:02
Titel: [RTTI] GetPropInfo funktioniert nicht immer
Also ich habe mal wieder ein kleines Problem, diesmal mit der RTTI.
Ich will nach bestimmten Properties schauen, deren Namen aus einem Array kommen. Auf dem Formular habe ich bisher nur Standart-Delphi-Komponenten (die Idee ist, auch 3rd-party-Komponenten zu uterstützen, ohne diese zu kennen)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
const MAX_PROPERTIES = 4;
      AProperties : Array [1..MAX_PROPERTIES] Of String = (
                      'Caption''Hint''Picture''Glyph'
                    );


var PropInfo: PPropInfo;
    i : Integer;
begin
  Label3.Caption := aComp.ClassName;
  For i := 1 to MAX_PROPERTIES Do begin
    PropInfo := GetPropInfo(aComp.ClassInfo, AProperties[i], tkProperties);
    If Assigned(PropInfo) Then
      StringGrid1.Cells[0,i] := AProperties[i];
  end;


Nun kommen solche Ziken wie TEdit hat kein Hint, ListBox auch nicht. Picture und Glyph findet er generell nicht.

Hat einer ne Idee ?

Update : Das scheint nur in design-time ein problem zu sein, wenn ich das ganze in ein Programm einbaue udn starte, krieg ich alle von mir gewünschten Properties.


BenBE - Fr 27.11.09 08:42

Ich weiß auch nicht, was Borland Inprise Embarcadero da geritten hat, als sie die RTTI entworfen haben. Erstens unvollständig (keine Records, keine Pointer, keine Interfaces, Funktions- und Methoden-Deklarationen nur, wenn die Parameter darstellbar sind; dann aber trotzdem keine Aufrufkonvention, ...). Ich hab mal versucht, in Delphi mir ne eigene, möglichst zu Borland Inprise Embarcadero kompatible Version zu bauen, die auch Pointer, Records usw. konnte. Das scheiterte dann aber am Compiler, weil ich in Konstanten Pointer auf diese Konstante nicht initialisieren konnte (obwohl er konstant gewesen wäre ...

Ansonsten zwecks Hint bitte ggf. nen Blick in die JVCL werfen, die haben da mit TJvFormStorage oder wie das Teil hieß glaube sowas, wie du's haben willst. Auch mit nem Design-Time-Experten dazu.


Martok - Fr 27.11.09 15:56

user profile iconHelgeLange hat folgendes geschrieben Zum zitierten Posting springen:
Nun kommen solche Ziken wie TEdit hat kein Hint, ListBox auch nicht. Picture und Glyph findet er generell nicht.

Spontan würde ich mal tippen, dass das alles Properties sind die einen Editor haben, kann das sein?


HelgeLange - Fr 27.11.09 16:33

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHelgeLange hat folgendes geschrieben Zum zitierten Posting springen:
Nun kommen solche Ziken wie TEdit hat kein Hint, ListBox auch nicht. Picture und Glyph findet er generell nicht.

Spontan würde ich mal tippen, dass das alles Properties sind die einen Editor haben, kann das sein?


Hint property hat keinen Property Editor und auch keine Get/Set-Methode :


Delphi-Quelltext
1:
property Hint: string read FHint write FHint stored IsHintStored;                    


Die Property ist als published deklariert in TControl und dieses leitet sich schon direkt von TComponent ab.


Martok - Fr 27.11.09 19:31

user profile iconHelgeLange hat folgendes geschrieben Zum zitierten Posting springen:
Hint property hat keinen Property Editor[...]

Bei mir haben die Editoren, wird IIRC von den Jedis oder GExperts installiert. Daher meine Vermutung.

Hast du da mal ein kleines Test-Programm? Ich würde mir das gern mal ansehen.

Der Tipp mit dem FormStorage ist gar nicht mal so schlecht, das gabs auch schon von der RxLib, und da konnte ich grade verifizieren dass es gehen müsste. Dabei machen die da gar keine seltsamen Hacks, sollte eigentlich auch dein Code gehen...


HelgeLange - Fr 27.11.09 20:50

Naja, gibt kein Beispielprogramm direkt, da man das entweder in einen vorhandenen Komponenteneditor reinlegt oder in eine form selber und dann einfach mal laufen lässt