2016-07-12 5 views
1

コンパイルが簡単ですが、アクセス違反を発生させる簡単なコードです。それは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. 

おかげ

+1

あなたはAVに驚いていますか?あなたはMakeMethodにNilを渡します。 – MartynA

+0

バイトの配列にポインタを置くと同じことが起こります。 – Djole

+0

@MartynAあなたのコメントは完全に間違っています。 'MD'は' data'ポインタを参照しません。実際の失敗理由はパラメータの不一致です。 –

答えて

1

はMDフォームクラスのメンバー作ってみましょう。クラス定義で :あなたの例次のように編集して、このイベントハンドラを割り当てるとき、最後に

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

:後続のコードで

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

はそうのようなMD方式の所有者を入力してくださいあなたのコンポーネントに、あなたがしなければならないすべては次のとおりです。

panel1.OnMouseDown:= MD; 

私はあなたの意図が何であったか知らないが、それはあなたが実行時のEventHandlerの世話をする方法です。

+0

私はそれを知っていますが、私は意図的にメソッドではなくグローバル関数を使用しようとします。好奇心の問題でした。 – Djole

+0

おそらくあなたの意図を明らかにする。私は単にあなたの例が示唆しているように物事を行う必要性を見ていません。おそらくイベントハンドラ以外の方法であなたのメソッドを試してみてください。単純なものを最初に試してみてください。おそらく、パラメータのないメソッドを使って、次にパラメータを持つメソッドまで自分自身で作業してください。 – Sherlock70

5

MD署名には追加の隠しパラメータが含まれている必要があります。 AV問題を解決します。

unit Unit1; 

interface 

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


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

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure MD(Instance, 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. 
+0

「OnCreate」が良い場所でない理由を説明するのに気をつけますか?私はそれに何の問題もない。 VCL/FMXも 'Create'シーケンスのステップとしてそれを行います。 –

+1

@FreeConsulting - 私のせいで、OnCreateでも動作します。編集されました。 – kludg

+0

ありがとうuser246408。私はいつかonClickイベントを割り当てようとしましたが、隠されたパラメータがなくてもうまく動作します: panel1。onclick:= TNotifyEvent(MakeMethod(nil、@PanClick))と – Djole

関連する問題