Problem mit Klasse als Property
spacer
Autor Nachricht
mtm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

XP SP3
Delphi 2009
BeitragVerfasst: Mi 25.01.12 17:01 
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 :
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
TFarben = class(TPersistent)
fStdColor,
fHeadColor : TColor
end;

TClass2 = class(TWInControl) // Hauptklasse
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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 25.01.2012 um 16:28
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic star
Beiträge: 1671
Erhaltene Danke: 14

Windows Vista Home Premium 32Bit
RAD Studio 2009 Pro
BeitragVerfasst: Mi 25.01.12 17:09 
ausblenden volle Höhe Delphi-Quelltext markieren
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
// Der Objekt-Inspektor zeigt nur published-Eigenschaften an
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); // Setter für die Eigenschaften
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);

// Eine instanz von TFarben erstellen
FFarben := TFarben.Create;
end;

destructor TClass2.Destroy;
begin
// Speicher freigeben
FreeAndNil(FFarben);

inherited Destroy;
end;

procedure TClass2.SetFarben(Value: TFarben);
begin
// Das übergebene Objekt dem Feld zuweisen
FFarben.Assign(Value);
end;



user profile iconmtm hat folgendes geschrieben Zum zitierten Posting springen:

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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
mtm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

XP SP3
Delphi 2009
BeitragVerfasst: Mi 25.01.12 18:23 
user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic star
Beiträge: 1671
Erhaltene Danke: 14

Windows Vista Home Premium 32Bit
RAD Studio 2009 Pro
BeitragVerfasst: Mi 25.01.12 18:29 
user profile iconmtm hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden volle Höhe Delphi-Quelltext markieren
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;
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
mtm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39

XP SP3
Delphi 2009
BeitragVerfasst: Mi 25.01.12 18:54 
Hat mir geholfen. Danke Dir.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home