Autor Beitrag
mtm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Windows 10 Pro 64 Bit
Delphi XE 6
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
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
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 25.01.12 17:09 
ausblenden volle Höhe 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
    // 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?
mtm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Windows 10 Pro 64 Bit
Delphi XE 6
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.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
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
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Windows 10 Pro 64 Bit
Delphi XE 6
BeitragVerfasst: Mi 25.01.12 18:54 
Hat mir geholfen. Danke Dir.