Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit Klasse als Property
mtm - Mi 25.01.12 17:01
Titel: Problem mit Klasse als Property
Hallo zusammen.
Ich bin gerade dabei zum ersten mal eine Komponente zu schreiben, bei der eine Klasse als Property genommen wird.
Hier ein Beispiel, wie ich das meine :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TFarben = class(TPersistent) fStdColor, fHeadColor : TColor end;
TClass2 = class(TWInControl) fFarben: TFarben; published property Farben:TFarben read fFarben write fFarben; end; |
Leider komme ich damit nicht ganz zurecht (Der Code ist schon ziemlich ausgedehnt, darum habe ich ihn hier nicht angegeben). Kennt nun jemand ein Tutorial, in dem erläutert wird wie man das hinkriegt (so, dass man die Änderungen auch im Design-Modus direkt erkennen kann).
danke im Voraus
mtm
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 25.01.2012 um 16:28
Andreas L. - Mi 25.01.12 17:09
Delphi-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: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| type TFarben = class(TPersistent) private fStdColor, fHeadColor : TColor; public procedure Assign(Source: TPersistent); override; published property StdColor: TColor read FStdColor write FStdColor; property HeadColor: tColor read FHeadColor write FHeadColor; end;
TClass2 = class(TWInControl) private fFarben: TFarben; protected procedure SetFarben(Value: TFarben); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Farben: TFarben read fFarben write SetFarben; end;
...
procedure TFarben.Assign(Source: TPersistent); begin if Source is TFarben then begin FStdColor := TFarben(Source).StdColor; end else inherited Assign(Source); end;
...
constructor TClass2.Create(AOwner: TComponent); begin inherited Create(AOwner);
FFarben := TFarben.Create; end;
destructor TClass2.Destroy; begin FreeAndNil(FFarben);
inherited Destroy; end;
procedure TClass2.SetFarben(Value: TFarben); begin FFarben.Assign(Value); end; |
mtm hat folgendes geschrieben : |
so, dass man die Änderungen auch im Design-Modus direkt erkennen kann
|
Meinst du das so, dass man im Objekt-Inspektor die Farben der Farben-Eigenschaften einsehen und ändern kann?
mtm - Mi 25.01.12 18:23
Andreas L. hat folgendes geschrieben : |
Meinst du das so, dass man im Objekt-Inspektor die Farben der Farben-Eigenschaften einsehen und ändern kann? |
Nicht ganz. Ich meinte, dass man die Veränderungen, die man im Objekt-Inspector vornimmt, auch im Control direkt sehen kann und nicht erst zur Runtime.
Deinen Code-Vorschlag werde ich jetzt mal ausprobieren. Schönen Dank schonmal.
Andreas L. - Mi 25.01.12 18:29
mtm hat folgendes geschrieben : |
Andreas L. hat folgendes geschrieben : | Meinst du das so, dass man im Objekt-Inspektor die Farben der Farben-Eigenschaften einsehen und ändern kann? |
Nicht ganz. Ich meinte, dass man die Veränderungen, die man im Objekt-Inspector vornimmt, auch im Control direkt sehen kann und nicht erst zur Runtime.
Deinen Code-Vorschlag werde ich jetzt mal ausprobieren. Schönen Dank schonmal. |
Die Farben die in TFarben eingetragen werden können werden also von TClass2 als z. B. Hintergrundfarbe verwendet? Irgendwo musst du ja eine Zuweisung ala Color := FFarben.StdColor; machen. Diese Zuweisung kannst du in eine Methode z. B. RefreshColors auslagern die dann indirekt vom Setter der Farben aufgerufen wird. Ist schwierig zu beschreiben, vllt. hilft dir der Code:
Delphi-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: 36: 37: 38: 39: 40: 41: 42: 43:
| TFarben = class(TPersistent) private FOwner: TClass2; FStdColor: TColor; protected procedure NotifyOwner; procedure SetStdColor(Value: TColor); public constructor Create(AOwner: TClass2); published property StdColor: TColor read FStdColor write SetStdColor; published ...
constructor TFarben.Create(AOwner: TClass2); begin inherited Create;
FOwner := Aowner; end;
procedure TFarben.notifyOwner; begin if Assigned(FOwner) then FOwner.RefreshColors; end;
procedure TFarben.SetStdColor(Value: TColor); begin if FStdColor <> Value then begin FStdColor := Value; NotifyOwner; end; end;
...
procedure TClass2.RefreshColors; begin Color := FFarben.StdColor; end; |
mtm - Mi 25.01.12 18:54
Hat mir geholfen. Danke Dir.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!