2010-01-15 15 views
6

Ich verwende Delphi 5, und wir haben eine Methode zum dynamischen Erstellen bestimmter Steuerelemente basierend auf dem Inhalt einer Datenbanktabelle (wir erstellen meist TButtons) und Maßnahmen ergreifen, wenn diese geklickt werden. Auf diese Weise können Sie einem Formular einfache Steuerelemente hinzufügen, ohne die Anwendung neu kompilieren zu müssen.Dynamischer Zugriff auf eine Eigenschaft in einer Delphi-Komponente

Ich frage mich, ob es möglich war, die Eigenschaft einer Komponente basierend auf einem in einer Zeichenfolge enthaltenen Eigenschaftsnamen festzulegen, damit wir weitere Optionen festlegen können.

Pseudo-Code:

Comp := TButton.Create(Self); 

// Something like this: 
Comp.GetProperty('Left').AsInteger := 100; 
// Or this: 
Comp.SetProperty('Left', 100); 

Ist das überhaupt möglich?

+1

Beachten Sie, dass fehlerhafte Inhalte in Ihrer Konfiguration zu interessanten Fehlermodi führen können. (Ich war dort, habe das gemacht.) –

Antwort

11

Sie haben die Run-Time Type Information Funktionen von Delphi zu verwenden, um dies zu tun:

Dieser Blog beschreibt genau das, was Sie zu tun versuchen: Run-Time Type Information In Delphi - Can It Do Anything For You?

Grundsätzlich Sie die Eigenschaft bekommen haben Informationen, mit GetPropInfo und dann SetOrdProp verwenden, um den Wert einzustellen. Dieses

var 
    PropInfo: PPropInfo; 
begin 
    PropInfo := GetPropInfo(Comp.ClassInfo, 'Left'); 
    if Assigned(PropInfo) then 
    SetOrdProp(Comp, PropInfo, 100); 
end; 

ist nicht so präzise wie Ihr Pseudo-Code, aber es hat immer noch den Job. Außerdem wird es mit anderen Dingen, wie Array-Eigenschaften, komplizierter.

+0

Brilliant, ich analysiere jetzt eine Zeichenkette, instantiiere Steuerelemente und setze Eigenschaften dynamisch! – Drarok

+0

Das könnte Sie auch interessieren: http://www.remobjects.com/ps.aspx –

9

Von einem meiner Arbeitseinheiten (in Delphi 7 obwohl)

var 
    c : TComponent; 

    for i := 0 to pgcProjectEdits.Pages[iPage].ControlCount - 1 do 
    begin 
    c := pgcProjectEdits.Pages[iPage].Controls[i]; 
    if c is TWinControl 
    then begin 
     if IsPublishedProp(c,'color') 
     then 
      SetPropValue(c,'color',clr); 
     if IsPublishedProp(c,'readonly')       
     then              
      SetPropValue(c,'readonly', bReadOnly); 
     ...    
    end; 
    ... 

Sie haben TypInfo in der uses-Anweisung enthalten. Ich weiß nicht, ob dies unter Delphi 5 funktioniert.

+0

Ah, IsPublishedProp() ist viel schöner als die oben genannten, ich habe eine Kombination der beiden in meinem Code verwendet. Danke vielmals. – Drarok

Verwandte Themen