( ゚Д゚)ノ Delギコ猫のプログラミング相談室part2

このエントリーをはてなブックマークに追加
922913
検証した。 問題なく取り付け取り外しできるように見えるぞ

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)が
与えられる事にしましょう。
925922:01/09/21 09:17
おっと、>>922 のコードでは
FOldWndProc がnilかどうか確認せずに使ってる個所が
何箇所かあるから修正してね