![]() |
Propertys zusammenfassen
Hallo
ich hab eine visuelle Komponente geschrieben, die viele published propertys vom typ TColor hat. ICh würde diese nun gerne im Objectinspector zusammenfassen. Ich hab schon probiert einen Record zu nutzen. Aber der Objectinspector unterstütz anscheindend keine Records. Also hab ichs mit einer Klasse probiert. Doch wo muss ich diese Klassen createn, damit delphi mir keine Zugriffsverletzung an speicherstelle XY vorwirft. gruß snow |
Re: Propertys zusammenfassen
Mal im Constructor versucht?
|
Re: Propertys zusammenfassen
Jepp
Delphi-Quellcode:
doch trotzdem ne zugriffsverletzung.
constructor TJTbahnhofsUhr.Create(AOwner: TComponent);
begin inherited Create(AOwner); FColors := TJTBahnhofsUhrColors.Create; end; (FColors ist die Interne variable) gruß snow |
Re: Propertys zusammenfassen
Wie sieht denn die Klasse TJTBahnhofsUhrColors aus?
|
Re: Propertys zusammenfassen
sehr simpel
Delphi-Quellcode:
gruß snow
type TJTBahnhofsUhrColors = class(Tobject)
private Fbkcolor : TColor; FPPcolor : Tcolor; FPBColor : TColor; published property bkColor : Tcolor read FbkColor write FbkColor; property PPColor : Tcolor read FPPColor write FPPColor; property PBColor : Tcolor read FPBColor write FPBColor; end; |
Re: Propertys zusammenfassen
Hm... dann weiß ich im Moment auch nicht weiter.
|
Re: Propertys zusammenfassen
Die Unterklasse sollte von TPersistant und nicht von TObject abgeleitet werden, damit die puplished Properties auch gespeichert werden
greetz |
Re: Propertys zusammenfassen
setze mal das Createn der Color-Klasse vor das inherited
|
Re: Propertys zusammenfassen
Er sollte das mit SetSubComponent erledigen. TColor erfordert kein Create und muss auch nicht irgendwie abgeleitet werden.
|
Re: Propertys zusammenfassen
Es geht auch nicht um das Anlegen einer TColor, sondern das einer Klasse mit mehreren Colors.
|
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. |
Re: Propertys zusammenfassen
Zitat:
|
Re: Propertys zusammenfassen
Zitat:
|
Re: Propertys zusammenfassen
Zitat:
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 |
Re: Propertys zusammenfassen
ansonsten würde ich bei vielen Properties vom gleichen Typ folgendes Konstrukt bevorzugen
Delphi-Quellcode:
Man kommt mit einer Get/Set-Proc. aus, kann die Daten auf einen Schlag kopieren, per Schleife sichern und wiederherstellen,
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; ist nur ein Vorschlag! |
Re: Propertys zusammenfassen
Und das geht im OI? Ohne Property-Editor?
|
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 ![]() >> 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. |
Re: Propertys zusammenfassen
Zitat:
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. |
Re: Propertys zusammenfassen
Zitat:
|
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; |
Re: Propertys zusammenfassen
Die Methode Assign sollte besser so implementiert werden, da es sonst zu einem Fehler kommt.
Delphi-Quellcode:
procedure TMyPersistent.Assign(Source : TPersistent); override;
begin If Source is TMyPersistent then begin FColor:=TMyPersistent(Source).Color; end else inherited Assign(Source); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz