Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Event Prozedur zwischenspeichern und aufrufen (https://www.delphipraxis.net/172171-event-prozedur-zwischenspeichern-und-aufrufen.html)

pustekuchen 17. Dez 2012 11:02

Delphi-Version: XE2

Event Prozedur zwischenspeichern und aufrufen
 
Hallo,

ich möchte die Prozedur, die einem Event zuegwiesen wurde zwischenspeichern, selbst neu zuweisen und in meiner Eventprozedur die zwischengespeicherte Prozedur aufrufen.

Ich habe also folgendes gemacht(Szenario TPaintBox und OnMouseDown Event):

Beim zuweisen der PaintBox in einer eigenen Klasse wird überprüft, ob der PaintBox bereits eine Prozedur zugewisen wurde.

Delphi-Quellcode:
  TOnMouseDown = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: integer);

...

private
    FInitialOnMouseDown: TOnMouseDown;

...

    if Assigned(FPaintBox.OnMouseDown) then
      FInitialOnMouseDown := @FPaintBox.OnMouseDown;
    FPaintBox.OnMouseDown := OnPaintBoxMouseDown;

...

procedure TOwnClass.OnPaintBoxMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X,Y: integer);
begin
  if Assigned(FInitialOnMouseDown) then
    FInitialOnMouseDown(Sender, Button, Shift, X,Y);
end;
Dies scheint auch gut zu klappen, bis auf das teilweise die Parameter die übergeben werden beim Aufruf nicht mehr übereinstimmen.

Setzte ich also nen Breakpoint in der Zeile in der die alte Event Prozedur aufgerufen wird, werden die richtigen Werte angezeigt. Springt man dann jedoch in diese Prozedur rein, so sind andere Werte für Button und Shift vorhanden! Sender,X und Y stimmen überein.

in Button wird mbLeft(0) übergeben und es kommt eine 8 an.

Wieso ist es so?

Gruß
pustekuchen

Uwe Raabe 17. Dez 2012 11:11

AW: Event Prozedur zwischenspeichern und aufrufen
 
Erstens gibt es schon einen Typ für den Event (man beachte in desse Deklaration das of object) und zweitens lässt du bei der Zuweisung dann besser das @ weg:

Delphi-Quellcode:
private
    FInitialOnMouseDown: TMouseEvent;

...

    if Assigned(FPaintBox.OnMouseDown) then
      FInitialOnMouseDown := FPaintBox.OnMouseDown;
    FPaintBox.OnMouseDown := OnPaintBoxMouseDown;

pustekuchen 17. Dez 2012 12:13

AW: Event Prozedur zwischenspeichern und aufrufen
 
Ah, Vielen Dank so klappt es natürlich.


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