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 Vererbung von Events (https://www.delphipraxis.net/50304-vererbung-von-events.html)

hanselmansel 23. Jul 2005 09:28


Vererbung von Events
 
HiHo,

ich versuche folgendes:
  • Die als "protected" deklarierte Eigenschaft OnMouseDown der Komponente TCustomControl soll in meiner abgeleiteten Komponente (TWechselButton) "published" sein, also im OI bearbeitbar.
  • Eben zu jenem Event OnMouseDown soll eine boolsche Variable der Komponente (TWechselButton.b_MouseDown) komponenten-intern verändert werden. (Damit die komponente bei erneutem Paint ihr Aussehen ändert!)

Die Einfache Vererbung einer "protected"-Eigenschaft habe ich mit OnClick ziemlich einfach hinbekommen. Die Sache mit OnMouseDown gestaltet sich komplizierter... :pale:

Aus den Beiträgen von Helmi (Beitrag) und shmia (Beitrag) habe ich mir (mehr schlecht als Recht) etwas zusammengebastelt. Er zeigt mir zwar keine Fehlermeldungen an, und zur Design-Zeit kann ich über den OI das Ereignis OnMouseDown auswählen, aber zur Laufzeit tut sich beim Maus-button-drücken rein gar nichts.

Hier kommt die Cource:
Delphi-Quellcode:
type
  Wechselbutton = class(TCustomControl)
  private
    FOnMouseDown   :TMouseEvent;
    b_MouseDown    :Boolean;
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;
  published
    Property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
    Property OnClick;
  end;

implementation

Procedure Wechselbutton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then
  Begin
  FOnMouseDown(Self, Button, Shift, X, Y);
  b_MouseDown := True;
  End;
end;
An der Stelle wie immer herzlichen Dank für's lesen, und ich freue mich auf eure Antworten.

MfG,

hanselmansel

jfheins 23. Jul 2005 09:35

Re: Vererbung von Events
 
Ich würde sagen, du solltest das Event in Ruhe lassen, und einfach auf die Message reagieren, das sähe so ähnlich aus:
Delphi-Quellcode:
   TMyClass = class (TCustomControl)
   protected
      procedure MouseDown (var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
      procedure MouseUp (var Msg: TWMLButtonUp); message WM_LBUTTONUP;
   published
      property OnMouseDown;
   end;

{ TMyClass }

procedure TMyClass.MouseDown(var Msg: TWMLButtonDown);
begin
   Windows.Beep(440, 100);
end;

procedure TMyClass.MouseUp(var Msg: TWMLButtonUp);
begin
   Windows.Beep(880, 100);
end;
(Dieses Control piepst jetzt einfach nur beim anklicken ;) )

hanselmansel 23. Jul 2005 09:55

Re: Vererbung von Events
 
HiHo,

riesen Dank! Es klappt nun! :-D

Der Vollständigkeit halber (wir wollen ja, dass der Thread auch späteren Lesern was bringt) sei gesagt, dass man die Unit Messages in die Uses-Klausel schreiben sollte, und der Prozedur einen Parameter übergeben muss.
Delphi-Quellcode:
procedure MouseDown(var Msg: TWMChar); message WM_LBUTTONDOWN;
Damit funktioniert schon mal ziemlich gut! :thumb:

vielen Dank für die schnelle Antwort!

hanselmansel

Jens Schumann 23. Jul 2005 10:10

Re: Vererbung von Events
 
Hallo,
das müsste ausreichen.
Delphi-Quellcode:
type
  Wechselbutton = class(TCustomControl)
  published
    Property OnMouseDown;
    Property OnClick;
  end;
OnMouseDown wird durch TControl eingeführt. In deiner Komponente musst Du lediglich OnMouseDown
veröffentlichen.

Wenn Du da Verhalten von OnMouseDown erweitern o. verändern willst kannst Du MouseDown überschreiben.
Delphi-Quellcode:
type
  Wechselbutton = class(TCustomControl)
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
       X, Y: Integer); override;
  published
    Property OnMouseDown;
    Property OnClick;
  end;

Robert_G 23. Jul 2005 10:11

Re: Vererbung von Events
 
Du hättest einfach nur die Property in den published Teil schieben müssen.
So hast du einen *neuen* Event dklariert und somit den des Vorfahren versteckt!
Delphi-Quellcode:
published
  property OnMouseMove;

xaromz 23. Jul 2005 10:14

Re: Vererbung von Events
 
Hallo,

Zitat:

Zitat von hanselmansel
Delphi-Quellcode:
type
  Wechselbutton = class(TCustomControl)
  private
    FOnMouseDown   :TMouseEvent;
    b_MouseDown    :Boolean;
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;
  published
    Property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
    Property OnClick;
  end;

Wenn Du das einfach haben willst, dann mach das so:
Delphi-Quellcode:
type
  TWechselbutton = class(TCustomControl)
  private
    b_MouseDown    :Boolean;
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; // <--
  published
    Property OnMouseDown;
    Property OnClick;
  end;

implementation

TWechselButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  b_MouseDown := True;
  inherited;
end;
Damit überschreibst Du die originale MouseDown-Methode (die ist nicht umsonst as dynamic deklariert). So spart Du Dir die Sache mit den Events und machst es gleichzeitig so, wie die VCL das vorsieht.

Gruß
xaromz

//Edit: ja, ja, der rote Kasten...

hanselmansel 23. Jul 2005 10:31

Re: Vererbung von Events
 
HiHo alle zusammen!

Ich habe es jetzt nach den Anweisungen von xaromz geschrieben, und es funktioniert wunderbar! (Sogar noch besser als vorher, denn jetzt funktionieren auch OnClick und OnMouseDown zusammen fehlerfrei :!: )Danke für die vielen, schnellen und ausführlichen Antworten!

Love you all, :love:

hanselmansel

P.S.: :dp:


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