>>959 こんなふうにして下さい
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure NewButtonProc(var Msg: TMessage);
public
OldButtonProc:TWndMethod;
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.NewButtonProc( var Msg: TMessage);
begin
with Msg do
case Msg of
WM_RBUTTONDOWN: Msg := WM_LBUTTONDOWN;
WM_RBUTTONUP: Msg := WM_LBUTTONUP;
end;
OldButtonProc(Msg);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin ShowMessage( 'こんにちは' );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldButtonProc:= Button1.WindowProc;
Button1.WindowProc:= NewButtonProc;
end;
end.
>>961 SetWindowLongはメソッドではなく手続きしか登録出来ないからです
ポインタが1つしか渡せないから、メソッドポインタを渡しても
どのオブジェクトかを識別出来ません。
MakeObjectInstance を使うとメソッドを手続きに仲介するコードを作らせる事が出来ますが・・・
詳しい仕掛けはここ参考にするといいでしょう
ttp://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm が、VCLを使うなら WindowProcプロパティを操作する方が簡単ですからそうした方がいいです
>>963 オブジェクトが別の場合は別のアドレス空間になるのですか?
てっきり一つのプロセス内なら、アドレスは全て一つで表せるのかと・・・。
うーん言いたい事がうまく伝わって無いかもしれない罠。
>>964 オブジェクトは同じアドレス空間にあります。
しかし、メソッドポインタは、命令コードと データ領域の2つを示さなければいけません。
FormのメンバーにNewProcをおくと、NewProgは手続きではなくメソッドになります。
メソッドには隠れた引数があり、それはどのオブジェクトインスタンスであるかを示すものです
具体的にForm1である事を教える必要があります。
それから
>>959の例だと、 実際に buttonをホントのサブクラス=継承して動作を書き換える方が
簡単だと思います。