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):
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."