( ゚Д゚)ノ Delギコ猫のプログラミング相談室part2
検証した。 問題なく取り付け取り外しできるように見えるぞ
const WM_DatachProc = WM_USER;
type
TtestLabel = class(TLabel)
public
FoldWndProc:TWndMethod;
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
procedure MyWndProc(var Message: TMessage);
end;
constructor TtestLabel.Create(AOwner: TComponent);
begin inherited;
if (AOwner is TCustomForm) then
begin
FOldWndProc := TCustomForm(AOwner).WindowProc;
TCustomForm(AOwner).WindowProc := MyWndProc;
end else begin
FOldWndProc := nil;
end;
end;
destructor TtestLabel.Destroy;
var msg:TMessage;
begin
msg.Msg:=WM_DatachProc;
msg.WParam:=longint(self);
(Owner as TCustomForm).WindowProc(msg);
inherited;
end;
procedure TtestLabel.MyWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_DatachProc:begin
(Owner as TCustomForm) .WindowProc := FOldWndProc;
if ( Message.WParam <> LongInt(Self)) then
begin
FOldWndProc(Message);//さらに解放を続ける
FOldWndProc:=(Owner as TCustomForm) .WindowProc;
(Owner as TCustomForm) .WindowProc:= MyWndProc;
end else FOldWndProc:=nil;
end;
WM_CHAR: begin //コンポーネントの動作チェック用
text:=Char(Message.WPARAM);
if assigned(FoldWndProc) then FoldWndProc(Message);
end;
else if assigned(FoldWndProc) then FoldWndProc(Message);
end;
end;
procedure Register;
begin RegisterComponents('Samples', [TtestLabel]);
end;
end.
923 :
デフォルトの名無しさん:01/09/21 09:02
という事でココをご覧のコンポーネント作家さん
WM_DatachProc = WM_USER;
をサブクラス取り外し用メッセージという事にして
WParamでSelfを送るという約束にしましょう。
LParamは空きとして
924 :
デフォルトの名無しさん:01/09/21 09:07
さらにWindowsへのサブクラスの場合も考えて
LParam にはプロセスユニークと思われる番号(とりあえずプロセスID)が
与えられる事にしましょう。
おっと、
>>922 のコードでは
FOldWndProc がnilかどうか確認せずに使ってる個所が
何箇所かあるから修正してね