Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Erweitertes Eigenschaftsmenü


phlux - So 01.09.02 12:03
Titel: Erweitertes Eigenschaftsmenü
Morgen!

Wie kann ich so ein erweitertes Menü erstellen, das so aussieht wie von TFont, also wenn man im Objektinspektor auf das plus klickt das dann weitere Eigenschaften angezeigt werden???

+ Font
Color
Size
...usw


DeCodeGuru - So 01.09.02 12:06

des geht mit ner TTreeView-Komponente und zwar in dem du einen Untereintrag hinzufügst.


phlux - So 01.09.02 12:46

Nein ich meine nicht mit TTreeView, ich meine eine EIGENSCHAFT im Objektinspektor und keine Nodes während der RunTime (damit hab ich mich schon lange beschäftigt)


DeCodeGuru - So 01.09.02 12:49

achsou, sorry :oops:

Dann habe ich leider keine Idee :cry: werde mich aber mal umschauen


GPF - So 01.09.02 13:49

Ist im Prinzip wirklich simpel. Habe es aber lange nicht mehr gemacht und gerade Delphi auf dem aktuellen System nicht installiert um den Code zu testen.

Du mußt auf jeden Fall die Komponentenerstellung beherrschen.
Dort deklarierst Du im Published Teil Deine Eigenschaften und Ereignisse - in etwa wie folgt:


Quelltext
1:
property MeineEigenschaft: Integer read GetMeineEigenschaft write SetMeineEigenschaft                    


GetMeineEigenschaft ist eine Funktion, die wie folgt deklariert sein muß:

Quelltext
1:
function GetMeineEigenschaft: Integer;                    


SetMeineEigenschaft ist eine Prozedur, die wie folgt deklariert sein muß:

Quelltext
1:
Prozedure SetMeineEigenschaft(Value: Integer);                    


In den beiden Methoden liest Du im einfachsten Fall einfach eine lokale Variable aus. Den Read bzw. write Eintrag kannst Du auch weglassen - dann kannst Du die Eigenschaft nur noch lesen oder schreiben.
Es ist ebenso möglich anstatt die Read bzw. Write Methode eine lokale Variable anzugeben.

So - nun aber zu Deiner Frage: TFont ist ein Objekt und sorgt dafür, daß im Objektinspektor die Untereigenschaften angezeigt werden.
Du mußt dann nichts anderes machen als die Variablen in der Eigenschaftsdeklaration (und den Methoden) entsprechend abzuändern, die Objekte im Constructor zu erstellen und im Destructor wieder frei zu geben.
Es ist nicht direkt möglich Unterobjekte wie TFont direkt abzuändern. Du mußt dazu erst einmal das Objekt, welches TFont implementiert, ableiten und ebenso eine abgeleitete Klasse von TFont erstellen. Dies mußt Du natürlich dann für jede Komponente machen, die Dein neues TFont zur Verfügung stellt. Es bliebe natürlich auch die Möglichkeit in den Quelltexten TFont zu ändern und die VCL Bibliothek neu zu kompilieren - davon muß ich aber abraten!
Das Unterobjekt muß ebenso wie die neue Komponente von TPersistent abgeleitet sein, damit die notwendigen RTTI Methoden geladen werden.

Hier ein Beispiel (wie gesagt - ungetestet, aber prinzipiell richtig):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
interface
type
  TTestObject= class (TObject)
  private
    tFont: TFont;
    procedure SetFont (Value: TFont);
    function GetFont: TFont; 
  public
    constructor Create; 
    destructor Destroy; override;
  published
    property Font: TFont read GetFont write SetFont;
  end;
implementation

procedure TTestObject.SetFont (Value: TFont);
begin
  fFont:=Value;
end;

function TTestObject.GetFont: TFont; 
begin
  Result:=fFont;
end;

constructor TTestObject.Create; 
begin
  fFont:=TFont.Create;
end;

destructor TTestObject.Destroy; override;
begin
  fFont.Free;
  inherited Destroy;
end;