Delphi-PRAXiS

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 komponeten eigenschaften (https://www.delphipraxis.net/9559-komponeten-eigenschaften.html)

LoL 29. Sep 2003 10:47


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:
constructor TTest.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  ---->Komponete weiß färben<-----
end;
ich hoffe ich habs einigermaßer verständlich erklärt

sakura 29. Sep 2003 10:54

Re: komponeten eigenschaften
 
Gib uns mal noch die Klassen-Typen-Deklaration, damit wir nicht ganz so im Leeren rumstochern ;-)

...:cat:...

LoL 29. Sep 2003 10:58

Re: komponeten eigenschaften
 
Delphi-Quellcode:
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;
so jetzt will ich wenn die eigenschaft nummer geändert wird halt etwas passiert

Hansa 29. Sep 2003 11:00

Re: komponeten eigenschaften
 
Du kannst mit DEFAULT einen Wert festlegen, wenn ich mich nicht irre. :gruebel:

LoL 29. Sep 2003 11:04

Re: komponeten eigenschaften
 
das nützt mir nix
ich will ja auf die änderung der eignenschft reagieren

Sharky 29. Sep 2003 11:06

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.

Hansa 29. Sep 2003 11:07

Re: komponeten eigenschaften
 
Zitat:

Zitat von LoL
...d.h. im Create der Komponete eigenschaften ändern, so dass z.b die farbe eines panels von anfang an weis ist oder so?

Wieso nützt das nichts ?

LoL 29. Sep 2003 11:08

Re: komponeten eigenschaften
 
hmm...
ich glaub ich weis was du meinst aber gehts nicht auch einfacher

LoL 29. Sep 2003 11:23

Re: komponeten eigenschaften
 
und wie kann ich auf die komponete selbst zu greifen(2.Frage)?

Hansa 29. Sep 2003 11:31

Re: komponeten eigenschaften
 
sollte wohl im OI drin stehen.

LoL 29. Sep 2003 11:33

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!

Hansa 29. Sep 2003 11:41

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.

LoL 29. Sep 2003 11:44

Re: komponeten eigenschaften
 
weis ich:

Zitat:

Zitat von lol
ich habe ein komponente erstellt.
Delphi-Quellcode:
constructor TTest.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  ---->Komponete weiß färben<-----
end;

und wie jetzt genau?(Source plz)

sakura 29. Sep 2003 11:47

Re: komponeten eigenschaften
 
Wie wäre es mit

Delphi-Quellcode:
constructor TTest.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  Color := clWhite;
end;
...:cat:...

sakura 29. Sep 2003 11:50

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:
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;
im Constructor müsste dieser Wert dann unbedingt gesetzt werden, ansonsten kann es zu unerwartetem Verhalten der Komponente kommen ;-)

Delphi-Quellcode:
constructor TTest.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  Nummer := 3;
end;
...:cat:...

LoL 29. Sep 2003 11:50

Re: komponeten eigenschaften
 
auf das simpelste kommt man nicht! :wall:
und wie kann ich auf die eigenschaftsänderung reagieren?

sakura 29. Sep 2003 11:53

Re: komponeten eigenschaften
 
Auch recht einfach:

Code:
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]
...:cat:...

sakura 29. Sep 2003 11:55

Re: komponeten eigenschaften
 
Ich gebe Dir mal noch einen Lesetipp, da steht das alles drinne ;-)

http://www.delphipraxis.net/internal_redirect.php?t=272

...:cat:...

Motzi 29. Sep 2003 12:49

Re: komponeten eigenschaften
 
Noch ein Lese-Tipp - meine OOP-Ausarbeitung: www.x-spy.net/personal ;)

LoL 29. Sep 2003 13:18

Re: komponeten eigenschaften
 
wenn ich das mache...

Zitat:

Zitat von sakura

if Value <> Nummer then
begin
// ÄNDERUNG
Nummer := Value; <------hier knallts
end;
end;

...meldet delphi einen stack überlauf!
kannst du mir helfen

sakura 29. Sep 2003 13:37

Re: komponeten eigenschaften
 
Sorry, ersetze Nummer mal mit Art...

...:cat:...

Motzi 29. Sep 2003 13:43

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;

LoL 29. Sep 2003 13:44

Re: komponeten eigenschaften
 
im oi wird das was man ausgewählz hat nicht gespeichert sondern einfach wieder zurückgesetzt

Christian Seehase 29. Sep 2003 13:44

Re: komponeten eigenschaften
 
Moin Christoph,

ändere das mal wie folgt ab:

Delphi-Quellcode:
procedure TTest.SetArt(Value: TArt);
begin
  if Value <> Art then
  begin
    // ÄNDERUNG
    Art := Value;
  end;
end;
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.

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.

LoL 29. Sep 2003 13:50

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.

sakura 29. Sep 2003 13:51

Re: komponeten eigenschaften
 
Code:
...
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;
...
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.

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