![]() |
Klasse mit Properties als Property
Hallo DP'ler,
ich hänge jetzt schon seit ca. 3 Tagen an einem Problem, hab auch schon die Suche angestrengt und nix brauchbares gefunden. Also ich habe mir eine PropertyKlasse erstellt:
Delphi-Quellcode:
und habe eine Komponente von der Klasse TPanel abgeleitet:
{...}
type TBackGround = class(TPersistent) private FBackgroundAlignment: TBackgroundAlignment; FBeginColor: TColor; FEndColor: TColor; procedure SetBackgroundAlignment(Value: TBackgroundAlignment); procedure SetBeginColor(Value: TColor); procedure SetEndColor(Value: TColor); published property BackgroundAlignment: TBackgroundAlignment read FBackgroundAlignment write SetBackgroundAlignment default baStandard; property BeginColor: TColor read FBeginColor write SetBeginColor default clBtnFace; property EndColor: TColor read FEndColor write SetEndColor default clBtnFace; end; {...}
Delphi-Quellcode:
...so.
unit MyPanel;
interface uses ExtCtrls, Controls, Graphics, Windows, Classes; type TMyPanel = class(TPanel) private FBackGround: TBackGround; procedure SetBackGround(NewBackGround: TBackGround); published property Background: TBackGround read FBackGround write SetBackGround; end; procedure Register; implementation procedure Register; begin RegisterComponents('Meine Komponenten', [TMyPanel]); end; { TMyPanel } procedure TMyPanel.SetBackGround(NewBackGround: TBackGround); begin FBackGround.Assign(NewBackGround); Invalidate; end; Und jetzt meine Frage, wie bekomme ich es hin, dass der Objectinspector mir meine PropertyKlasse als kleines DropDown Menü anzeigt? (Wie Font oder Margins) Er zeigt mir nur meine Property "Background" mit "(TBackGround)" und ein [+] an, aber wenn ich auf das [+] klicke, wird es zu [-] aber er klappt es nicht auf. Danke schonmal! Beste Grüße Ninow |
AW: Klasse mit Properties als Property
Du musst einen entsprechenden PropertyEditor implementieren und registrieren
|
AW: Klasse mit Properties als Property
Kurze Zwischenfrage TPropertyEditor befindet sich ja in DesignEditors.
Der Compiler meldet aber das er DesignEditors.dcu nicht finden kann warum? |
AW: Klasse mit Properties als Property
Okay Zwischenfrage erledigt...
|
AW: Klasse mit Properties als Property
Definiere die einzelnen Properties als published
Delphi-Quellcode:
Weiters musst du für die Instanzierung in TMyPanel selbst sorgen. Dh. im Konstruktor & Destruktor die Instanz per TKlassenname.Create erstellen und anschließend im Destruktor per Free zerstören!
{..}
published property BeginColor; property EndColor; {..} Edit: Sorry, hab mich verguggt. Du müsstest die Propertys normalerweise als Public definieren und anschließend in Kurzform auch als published, soweit ich mich nicht irre... Hatte aber nicht viel am Hut mit Komponentenentwicklung & IDE |
AW: Klasse mit Properties als Property
@Aphton: Die Properties müssen unter published stehen, da sie ja zur Entwicklungszeit verändert werden sollen.
|
AW: Klasse mit Properties als Property
guggt doch mal, wie es bei datasources gemacht wird. Ich glaube nicht, dass die einen Property-Editor benutzen.
|
AW: Klasse mit Properties als Property
Zitat:
TObjekt und Nachkommen (außer TPersistent) > Standardsichtbarkeit = Public durch das
Delphi-Quellcode:
{$M+}
|
AW: Klasse mit Properties als Property
Ausserdem muss auch die Methode TBackGround.Assign implementiert werden.
Der Objektinspektor muss unter Umständen eine Kopie des TBackGround Objekts erzeugen und benötigt daher die Assign-Methode. Bei älteren Delphiversionen kam dann bei fehlender Implementation die Exception "Klasse Txyz kann Txyz nicht zugewiesen werden". Möglich, dass die Exception in neueren IDEs abgefangen wird.
Delphi-Quellcode:
procedure TBackGround.Assign(Source:TPersistent); {override}
begin if Source is TBackGround then begin FBackgroundAlignment := TBackGround(Source).FBackgroundAlignment; ... end else inherited; // wichtig! darf nicht fehlen end; |
AW: Klasse mit Properties als Property
Es könnte auch helfen, den Background von TComponent abzuleiten und als Subkomponente des Panels anzulegen (
Delphi-Quellcode:
). Dann werden die Einstellungen nämlich automatisch auch in der DFM gespeichert. Der Objektinspektor wird dann den Background mit einem "+" darstellen, womit man an dessen Properties kommt. Da du die Deklaration von TBackgroundAlignment nicht mitlieferst, kann man dazu noch nichts sagen. Wenn es ein Aufzählungstyp ist, musst du den lediglich registrieren damit der ObjektInspektor damit klar kommt. Der Property-Editor für TBackground erübrigt sich damit.
FBackground.SetSubComponent(true);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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