Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Propertys zusammenfassen (https://www.delphipraxis.net/108273-propertys-zusammenfassen.html)

Muetze1 10. Feb 2008 17:27

Re: Propertys zusammenfassen
 
1. Anlegen vor dem inherited braucht nicht sein, macht hier keinen Unterschied.
2. Ableiten von TPersistent (wurde hier schon erwähnt)
3. Assign() überschreiben und implementieren (Pflicht).
4. Diese Klasse über eine Property veröffentlichen und beim Setter nur Assign(Value) aufrufen.

Kroko1999 10. Feb 2008 17:29

Re: Propertys zusammenfassen
 
Zitat:

Zitat von Muetze1
1. Anlegen vor dem inherited braucht nicht sein, macht hier keinen Unterschied.
...

Kennst Du den Rest der Klasse?

Muetze1 10. Feb 2008 17:33

Re: Propertys zusammenfassen
 
Zitat:

Zitat von Kroko1999
Zitat:

Zitat von Muetze1
1. Anlegen vor dem inherited braucht nicht sein, macht hier keinen Unterschied.
...

Kennst Du den Rest der Klasse?

Mir fällt keine Konstellation ein, wo dies nötig wird. Ausnahme: schlechter Stil

snow 10. Feb 2008 17:34

Re: Propertys zusammenfassen
 
Zitat:

. Assign() überschreiben und implementieren (Pflicht).
4. Diese Klasse über eine Property veröffentlichen und beim Setter nur Assign(Value) aufrufen.
ich habs mitlerweile hinbekommen aber:

Wie kann ich nun auf änderungen der farben eingehen ohne für jede farbe eine eigene Set...(value : TColor) procedure zu schreiben.

ich hab probiert auf das ändern der Property zu reagieren aber leider ändert sich die nicht, wenn sich die farbe ändert.

Dieses Assign was genau bewirkt dass?

gruß snow

Kroko1999 10. Feb 2008 17:35

Re: Propertys zusammenfassen
 
ansonsten würde ich bei vielen Properties vom gleichen Typ folgendes Konstrukt bevorzugen
Delphi-Quellcode:
TMyClass = class
  private
    FData: array[0..5] of TColor;
    function GetData(const AIndex: Integer): TColor;
    procedure SetData(const AIndex: Integer; const Value: TColor);
  published
    property colColor1: TColor Index 0 read GetData write SetData;
    property colColor2: TColor Index 1 read GetData write SetData;
Man kommt mit einer Get/Set-Proc. aus, kann die Daten auf einen Schlag kopieren, per Schleife sichern und wiederherstellen,
ist nur ein Vorschlag!

DeddyH 10. Feb 2008 17:37

Re: Propertys zusammenfassen
 
Und das geht im OI? Ohne Property-Editor?

Muetze1 10. Feb 2008 17:38

Re: Propertys zusammenfassen
 
>> Änderungen werden nicht übernommen:

Du kannst jeweils in deiner Unterklasse einen Setter schreiben und der kann dann (wenn nötig, also die geänderte Farbe sichtbar ist) das neuzeichnen der Oberkomponente auslösen.

>> Viele Setter

Du kannst für viele Properties gleichen Typs einen einzigen Setter und auch Getter nutzen. Schau dir dazu mal das Schlüsselwort Delphi-Referenz durchsuchenIndex bei den Properties in der Hilfe an. Kroko1999 hat dir schon ein Beispiel getippt. Mit einer Case-Mehrfachverzweigung im Setter kannst du es auch mit unterschiedlichen TColor Membern machen. Beim Getter kannst du dann direkt den jeweiligen Member angeben.

>> Was soll Assign()

Dort übernimmst du alle Werte von der übergebenen Unterkomponenteninstanz, wenn diese angegeben wird. Der Objektinspektor benutzt diese Methode u.a. wenn du mehrere gleiche Objekte markierst und mit Enter die Eigenschaften von einer auf viele übernehmen willst.

>> Das geht ohne Property Editor

Ja, ohne Probleme. TPersistent bringt dazu alles nötige mit und wird unterstützt. Man muss (neben TPersistent als Basis und Assign() überschreiben) nicht viel dazu implementieren.

Wir reden hier aber von den aufklappbaren Unterpunkten. Einen Propertyeditor brauchst du z.B. wenn du eine Listenklasse veröffentlichst, dann hast du schlecht eine Chance ohne Property Editor auszukommen, da du nicht abhängig von den Einträgen Properties definieren kannst.

Kroko1999 10. Feb 2008 17:38

Re: Propertys zusammenfassen
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von Kroko1999
Zitat:

Zitat von Muetze1
1. Anlegen vor dem inherited braucht nicht sein, macht hier keinen Unterschied.
...

Kennst Du den Rest der Klasse?

Mir fällt keine Konstellation ein, wo dies nötig wird. Ausnahme: schlechter Stil


Mir fallen viele Dinge ein, ohne das man von schlechten Stil sprechen kann, zBsp. eine Klasse in einer Klasse, die im Konstruktor des Parentteil bestimmte Dinge setzt, aber in der letztendlichen Klasse von einer Grundklasse abgeleitet wurde, usw. usf.

Muetze1 10. Feb 2008 17:43

Re: Propertys zusammenfassen
 
Zitat:

Zitat von Kroko1999
Mir fallen viele Dinge ein, ohne das man von schlechten Stil sprechen kann, zBsp. eine Klasse in einer Klasse, die im Konstruktor des Parentteil bestimmte Dinge setzt, aber in der letztendlichen Klasse von einer Grundklasse abgeleitet wurde, usw. usf.

Dann bekommt die Unterklasse im Konstruktor die Hauptklasse mitgegeben. Auf die kann sie sich beziehen und man hat keine Probleme. Die Hauptklasse befindet sich zu dem Zeitpunkt im Constructor und somit kann sie Self mitgeben. Damit ist alles oben beschrieben möglich. Durch die Ableitung kann man sogar mit einer unspezifizierten Basisklasse als Constructor Parameter arbeiten.

Jens Schumann 10. Feb 2008 18:07

Re: Propertys zusammenfassen
 
Hallo,
ich verwende für "Subproperties" folgende Standartvorlage
Delphi-Quellcode:
  TMyPersistent = class(TPersistent)
  private
    FColor  : TColor;
    FOnChange : TNotifyEvent;
    procedure SetColor(Value : TColor);
  protected
    procedure DoChange; virtual;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Assign(Source : TPersistent); override;
    property OnChange : TNotifyEvent read FOnChange write SetOnChange;
  published
    property Color  : TColor read FColor write SetColor;
  end;


procedure TMyPersistent .SetColor(Value : TColor);
begin
  If FColor<>Value then
    begin
    FColor:=Value;
    DoChange;
    end;
end;


procedure TMyPersistent .DoChange;
begin
  If Assigned(FOnChange) then
    FOnChange(Self);
end;

procedure TMyPersistent.Assign(Source : TPersistent); override;
begin
  If Source is TMyPersistent then
    begin
    FColor:=TMyPersistent(Source).Color;
    end;
  inherited Assign(Source);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz