Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Problem mit Eigenschaft Enabled (https://www.delphipraxis.net/154381-problem-mit-eigenschaft-enabled.html)

Eppos 8. Sep 2010 21:50

Problem mit Eigenschaft Enabled
 
Hallo zusammen,

ich habe mir eine Button-Component erstellt, abgleitet von TAdvGlowButton.
In dieser Component möchte ich das setzen von Enabled kontrollieren.

Mein Code sieht wie folgt aus:

Delphi-Quellcode:
unit MyButton;

interface

uses
  SysUtils, Classes, Controls, AdvGlowButton, graphics;

type
  TMyButton = class(TAdvGlowButton)
  private
    fEnabled : Boolean;
    fNewEnabled : Boolean;
    procedure SetEnabled( Value : Boolean );
    procedure SetNewEnabled( Value : Boolean );
    { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public declarations }
  published
    property Enabled : Boolean read fEnabled write SetEnabled;
    property NewEnabled : Boolean read fNewEnabled write SetNewEnabled;
    { Published declarations }
  end;

procedure Register;

implementation

uses
  Dialogs;

procedure Register;
begin
  RegisterComponents('MYC', [TMyButton]);
end;

{ TMyButton }
constructor TMyButton.Create(AOwner: TComponent);
begin
  inherited;
  fNewEnabled := True;
end;

destructor TMyButton.Destroy;
begin
  inherited;
end;

procedure TMyButton.SetNewEnabled( Value : Boolean );
begin
  fNewEnabled := Value;
end;

procedure TMyButton.SetEnabled( Value : Boolean );
begin
  If fNewEnabled then
    fEnabled := value
  else
    fEnabled := False;
end;

end.
Wenn ich nun Enbaled setze hat das keine Auswirkungen mehr (Component wird nicht ausgegraut). Was mach ich falsch?

SirThornberry 8. Sep 2010 21:56

AW: Problem mit Eigenschaft Enabled
 
Du setzt nirgendwo die ursprüngliche Enabled-Eigenschaft sondern lediglich deine eigene neue Variable.

Eppos 8. Sep 2010 22:01

AW: Problem mit Eigenschaft Enabled
 
wie meinst du das?

jfheins 8. Sep 2010 23:39

AW: Problem mit Eigenschaft Enabled
 
Du musst den orginal Setter (der hoffentlich virtual deklariert ist) überschreiben.

Stattdessen verdeckst du nur die alte Enabled-Eigenschaft. Das bringt nichts ;)

Stevie 9. Sep 2010 05:57

AW: Problem mit Eigenschaft Enabled
 
Ist TAdvGlowButton nicht von TControl abgeleitet?

Eppos 9. Sep 2010 08:48

AW: Problem mit Eigenschaft Enabled
 
kann mir jemand sagen was ich im Code ändern müsstedas es stimmt?

SirThornberry 9. Sep 2010 08:58

AW: Problem mit Eigenschaft Enabled
 
Du musst entweder die Methode zum setzen von Enabled überschreiben oder du rufst setzt die ursprüngliche Enabled-Eigenschaft in deiner neuen Set-Methode. Denn derzeit machst du nichts anderes als neue Eigenschaften zu definieren die zufällig "Enabled" heißen.

mit
Delphi-Quellcode:
inherited Enabled := NeuerWert;
kannst du den ursprünglichen Enabled Wert setzen.

Aber die richtige Variante ist eben das überschreiben der Methode zum setzen. Am besten du schaust dir dafür mal Tutorials zur Vererbung an wo es um überschreiben, überladen etc. geht. Ohne diese Grundlagen wirst du sonst recht bald wieder bei diesem Thema scheitern.

Eppos 9. Sep 2010 09:17

AW: Problem mit Eigenschaft Enabled
 
inherited hat mir gefehlt, danke!

SirThornberry 9. Sep 2010 09:42

AW: Problem mit Eigenschaft Enabled
 
Aber wie gesagt ist das der falsche Weg. Denn wenn jemand deine Komponente verwendet und diese auf TControl castet um Enabled zu setzen, wird deine Set-Methode niemals aufgerufen und derjenige wundert sich dann was da los ist.

shmia 9. Sep 2010 17:19

AW: Problem mit Eigenschaft Enabled
 
Du musst die Methoden GetEnabled und/oder SetEnabled überschreiben:
Delphi-Quellcode:
type
  TMyButton = class(TAdvGlowButton)
  private
   ...
  protected
    function GetEnabled: Boolean; override;
    procedure SetEnabled(Value: Boolean); override;
...

procedure TMyButton.SetEnabled(Value: Boolean); override;
begin
  // eigener Code vorher Hier
  inherited SetEnabled(Value);

  // eigener Code nachher Hier
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 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