调用delphi程序作为方法

时间:2016-07-12 08:18:26

标签: delphi lazarus freepascal

这是我编写得很好的简单代码,但会引发访问冲突。它进入MD程序并且调试器显示一些X和Y值,但在退出程序AV后发生。希望有人可以提供帮助。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,  ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

    {$R *.dfm}

procedure MD(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  form1.caption:= inttostr(x)+ ' '+ inttostr(y);
end;

procedure TForm1.FormCreate(Sender: TObject);

function MakeMethod(data, code: pointer): TMethod;
begin
  result.Data:= data;
  result.Code:= code;
end;

begin
  panel1.OnMouseDown:= TMouseEvent(MakeMethod(nil, @MD));
end;

end.

由于

2 个答案:

答案 0 :(得分:5)

hideLoader()签名应包含其他隐藏参数;它解决了AV问题。

MD

答案 1 :(得分:1)

尝试将MD设为表单类的成员。按以下方式编辑示例: 在类定义中:

type
TForm1 = class(TForm)
  Panel1: TPanel;
  procedure FormCreate(Sender: TObject);
  procedure MD(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
end;

稍后在您的代码中,请确保输入MD方法的所有者,如下所示:

procedure TForm1.MD(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

最后,在将此事件处理程序分配给组件时,您所要做的就是:

panel1.OnMouseDown:= MD;

我不知道你的意图是什么,但这就是你在运行时如何处理事件处理程序。