![]() |
komponeten eigenschaften
hi
ich habe ein komponente erstellt. nun habe ich eigene eigenschaften hinzugefügt. 1. wie kann ich nun auf das änderen dieser eigenschaften reagieren? 2. wie kann ich auf die komponente selbst zugreifen, d.h. im Create der Komponete eigenschaften ändern, so dass z.b die farbe eines panels von anfang an weis ist oder so? also etwa so:
Delphi-Quellcode:
ich hoffe ich habs einigermaßer verständlich erklärt
constructor TTest.Create(AOwner : TComponent);
begin inherited Create(AOwner); ---->Komponete weiß färben<----- end; |
Re: komponeten eigenschaften
Gib uns mal noch die Klassen-Typen-Deklaration, damit wir nicht ganz so im Leeren rumstochern ;-)
...:cat:... |
Re: komponeten eigenschaften
Delphi-Quellcode:
so jetzt will ich wenn die eigenschaft nummer geändert wird halt etwas passiert
type
TArt = (1, 2, 3, 4); type TTest = class(tpanel) private { Private declarations } Art : TArt; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property nummer : TArt read Art write Art; end; |
Re: komponeten eigenschaften
Du kannst mit DEFAULT einen Wert festlegen, wenn ich mich nicht irre. :gruebel:
|
Re: komponeten eigenschaften
das nützt mir nix
ich will ja auf die änderung der eignenschft reagieren |
Re: komponeten eigenschaften
Hai Lol,
schreibe doch eine Procedure mit der die Werte für Art geschrieben werden. Das heist es wird nie Art direckt geändert sondern immer über deine Procedure. |
Re: komponeten eigenschaften
Zitat:
|
Re: komponeten eigenschaften
hmm...
ich glaub ich weis was du meinst aber gehts nicht auch einfacher |
Re: komponeten eigenschaften
und wie kann ich auf die komponete selbst zu greifen(2.Frage)?
|
Re: komponeten eigenschaften
sollte wohl im OI drin stehen.
|
Re: komponeten eigenschaften
:wiejetzt:
? OI = Objekt Inspector? wie soll mir das helfen? ich will in der create prozedur einfach nur die eigenschaften meiner komponete festlegen! |
Re: komponeten eigenschaften
Also sage doch mal genau was Du willst. Soll das ganze zur Laufzeit geschehen ? Dann schreibe das doch in deinem Constructor mit rein, daß die Farbe weiß ist. Direkt hinter dem inherited.
|
Re: komponeten eigenschaften
weis ich:
Zitat:
|
Re: komponeten eigenschaften
Wie wäre es mit
Delphi-Quellcode:
...:cat:...
constructor TTest.Create(AOwner : TComponent);
begin inherited Create(AOwner); Color := clWhite; end; |
Re: komponeten eigenschaften
Noch was zum Thema default. Der Wert der dort angeben wird, wird durch Delphi nicht automatisch initialisiert. Das gibt der IDE lediglich an, daß, wenn dieser Wert im OI eingetragen wird, daß dieser nicht gespeichert/geladen werden muss, da die Komponente dieses automatisch so tut ;-)
Delphi-Quellcode:
im Constructor müsste dieser Wert dann unbedingt gesetzt werden, ansonsten kann es zu unerwartetem Verhalten der Komponente kommen ;-)
type
TArt = (1, 2, 3, 4); type TTest = class(tpanel) private { Private declarations } Art : TArt; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property nummer : TArt read Art write Art default 3; end;
Delphi-Quellcode:
...:cat:...
constructor TTest.Create(AOwner : TComponent);
begin inherited Create(AOwner); Nummer := 3; end; |
Re: komponeten eigenschaften
auf das simpelste kommt man nicht! :wall:
und wie kann ich auf die eigenschaftsänderung reagieren? |
Re: komponeten eigenschaften
Auch recht einfach:
Code:
...:cat:...
type
TArt = (1, 2, 3, 4); type TTest = class(tpanel) private { Private declarations } Art : TArt; [color=#f50000]procedure SetArt(Value: TArt);[/color] protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property nummer : TArt read Art write [color=#ff0000]SetArt [/color] default 3; end; [color=#f50000]procedure TTest.SetArt(Value: TArt); begin if Value <> Nummer then begin // ÄNDERUNG Nummer := Value; end; end;[/color] |
Re: komponeten eigenschaften
Ich gebe Dir mal noch einen Lesetipp, da steht das alles drinne ;-)
![]() ...:cat:... |
Re: komponeten eigenschaften
Noch ein Lese-Tipp - meine OOP-Ausarbeitung:
![]() |
Re: komponeten eigenschaften
wenn ich das mache...
Zitat:
kannst du mir helfen |
Re: komponeten eigenschaften
Sorry, ersetze Nummer mal mit Art...
...:cat:... |
Re: komponeten eigenschaften
Du musst den neuen Wert der privaten Feld-Variable zuweisen und nicht wieder dem property selbst, sonst kommst du in eine Endlosschleife, da sich die Set-Methode indirekt immer wieder selbst aufruft!
Delphi-Quellcode:
procedure TTest.SetArt(Value: TArt);
begin if Value <> Nummer then begin // ÄNDERUNG FNummer := Value; end; end; |
Re: komponeten eigenschaften
im oi wird das was man ausgewählz hat nicht gespeichert sondern einfach wieder zurückgesetzt
|
Re: komponeten eigenschaften
Moin Christoph,
ändere das mal wie folgt ab:
Delphi-Quellcode:
Wenn die Property (nummer) mit Value gefüllt wird, wird automatisch die Methode SetArt wieder aufgerufen, und zwar endlos. Die Eigenschaft nummer ist ja nur ein Platzhalter für das interne Feld Art, und kann selber keinen Wert aufnehmen.
procedure TTest.SetArt(Value: TArt);
begin if Value <> Art then begin // ÄNDERUNG Art := Value; end; end; BTW: Um sich auch in fremden Sourcen zurechtzufinden, bzw. eigenen Sourcen für andere lesbarer zu gestalten, wäre es sinnvoll die Benennungskonventionen einzuhalten. Das soll in diesem Falle heissen: Interne Felder sollten immer mit einem F beginnen. Dann sieht man auch innerhalb der Komponente leichter auf was man zugreift. |
Re: komponeten eigenschaften
hier mal das so wie ich es machen will:
ich möchte innerhalb des labels ein dreieck zeichnen. zur auswahl unten rechts und links und oben rechts und links.
Delphi-Quellcode:
unit Test;
interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls, Graphics, StdCtrls; type TArt = (TaDreieckUl, TaDreieckUr, TaDreieckOl, TaDreieckOr); type TTest = class(TLabel) private { Private declarations } FArt : TArt; procedure SetArt(Value : TArt); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property Aussehen : TArt read FArt write SetArt; end; procedure Register; implementation constructor TTest.Create(AOwner : TComponent); begin inherited Create(AOwner); end; procedure TTest.SetArt(Value: TArt); begin if Value <> Aussehen then begin if (Aussehen = TaDreieckUl) or (Aussehen = TaDreieckOr) then begin canvas.Brush.Color := clblack; canvas.MoveTo(0,0); canvas.LineTo(width,height); if Aussehen = TaDreieckUl then canvas.FloodFill(1,10,clblack,fsborder) else canvas.FloodFill(10,1,clblack,fsborder) end else begin canvas.Brush.Color := clblack; canvas.MoveTo(width,height); canvas.LineTo(0,height); if Aussehen = TaDreieckOl then canvas.FloodFill(1,10,clblack,fsborder) else canvas.FloodFill(10,1,clblack,fsborder) end; Aussehen := Value; end; end; procedure Register; begin RegisterComponents('Samples', [TTest]); end; end. |
Re: komponeten eigenschaften
Code:
...:cat:...
...
type TTest = class(TLabel) private { Private declarations } FArt : TArt; procedure SetArt(Value : TArt); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property Aussehen : TArt read FArt write SetArt; end; ... procedure TTest.SetArt(Value: TArt); begin if Value <> Aussehen then begin .... [color=#ff0000]FArt[/color] := Value; end; end; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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