Autor Beitrag
phlux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: So 01.09.02 12:03 
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

_________________
Chaos-Raid Soft*
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: So 01.09.02 12:06 
des geht mit ner TTreeView-Komponente und zwar in dem du einen Untereintrag hinzufügst.

_________________
Viele Grüße
Jakob
phlux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: 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)

_________________
Chaos-Raid Soft*
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: So 01.09.02 12:49 
achsou, sorry :oops:

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

_________________
Viele Grüße
Jakob
GPF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 85



BeitragVerfasst: 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:

ausblenden Quelltext
1:
property MeineEigenschaft: Integer read GetMeineEigenschaft write SetMeineEigenschaft					


GetMeineEigenschaft ist eine Funktion, die wie folgt deklariert sein muß:
ausblenden Quelltext
1:
function GetMeineEigenschaft: Integer;					


SetMeineEigenschaft ist eine Prozedur, die wie folgt deklariert sein muß:
ausblenden 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):
ausblenden volle Höhe 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;

_________________
"Wenn Debugging ein Vorgang ist, Fehler aus einem Programm auszubauen, dann ist Programmieren der Vorgang, Fehler einzubauen."