Просто назовите его, передавая параметр:
procedure TfmAPRBasedForm.TSDragEvent(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if something then dosomething
else
begin
TButton(Sender.OnMouseDOwn) := OMDold // OMDold in most cases returns nil (not null) but its ok I just want to clear custom event from the object
//line below is a point of my question - the one I used doesnt work
If Assigned(TButton(Sender).OnMouseDown) then // Check if there is really an TMouseEvent
TButton(Sender).OnMouseDown(Sender,Button,Shift,X,Y) //Call only when Event exist
end;
end;
Вам может потребоваться изменить Button, Shift, X, Y, хотя, если вы используете их в своем OMDOld и вам нужно значение, отличное от текущего значения в dragEvent, например, удаление ssShift или около того.
Если ваш OMDold хранится как TMethod, вы можете использовать:
TMouseEvent(OMDOld)(Sender,Button,Shift,X,Y);
Ниже приведен полный пример теста, настроенный для демонстрации того, чего вы хотите достичь подобным образом:
Unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure FormCreate(Sender: TObject);
procedure btn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btn2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
public
{ Public declarations }
OMDold : TMouseEvent;
IsNew : Boolean;
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
begin
OMDold := btn1.OnMouseDown;
btn1.OnMouseDown := NewMouseDown;
IsNew := True;
end;
procedure TForm4.NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if IsNew then
ShowMessage('New Method!')
else if Assigned(OMDold) then
OMDold(Sender,Button,Shift,X,Y);
end;
procedure TForm4.btn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Original Method!');
end;
procedure TForm4.btn2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IsNew := not IsNew;
end;
end.