TComboBoxのMouseDownイベントについて

解決


tsu  2008-05-22 22:22:38  No: 30767

TComboBoxから派生したコンポーネントを作成しています。

マウスクリックしたときの入力カーソルの位置を知りたかったので
MouseDownイベントをoverrideしてみたのですが、
Edit部分のクリックでイベントが発生しないようです。
リストを表示するボタンをクリックすると発生しました。

なんとかEdit部分のクリックでイベントを発生させる方法はないでしょうか?
他のアイデアでもよいので何かありましたらよろしくお願いします。

作業環境:Delphi7  WindowsVista


KHE00221  2008-05-22 23:29:31  No: 30768

こんな感じ?

  TComboBoxEx = class(TComboBox)
  private
  protected
    procedure EditWndProc(var Message: TMessage);override;
  published
    property OnMouseDown;
  end;
procedure TComboBox.EditWndProc(var Message: TMessage);
var
    X,Y: Integer;
begin
    inherited;

    if Message.Msg = WM_LBUTTONDOWN then
    begin
      if Assigned(OnMouseDown) = True then
      begin
        X := TWMLBUTTONDOWN(Message).XPos;
        Y := TWMLBUTTONDOWN(Message).YPos;
        OnMouseDown(Self,mbLeft,[],X,Y);
      end;
    end;

end;


tsu  2008-05-23 01:00:49  No: 30769

KHE00221さんありがとうございます。

EditWndProcは「静的メソッドのためoverrideできません。」
とコンパイルエラーが出たためoverrideを外して試してみましたが
やはりEdit部分のマウス押下を認識してくれないようです。

EditWndProcメソッドは確かに正解に近そうなので
この線でもう少し調べてみます。


KHE00221  2008-05-23 10:14:37  No: 30770

Delphi7 だと virtual 付いてないのか

StdCtrls.pas  の

  TCustomCombo = class(TCustomListControl)
    procedure EditWndProc(var Message: TMessage); virtual;

と Virtual を付ければ override 可能になりますよ・・・


Basser  2008-05-23 20:36:59  No: 30771

VCLを改竄するよりも、ComboWndProcをオーバーライドしたらいいのでは?

type
  TMyComboBox = class(TComboBox)
  protected
    procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); override;
  published
    property OnMouseDown;
  end;

procedure TMyComboBox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer);
begin
  inherited ComboWndProc(Message, ComboWnd, ComboProc);

  if (ComboWnd = EditHandle) then
  begin
    with Message do
      if (Msg = WM_LBUTTONDOWN) then
        MouseDown(mbLeft, KeysToShiftState(WParam), LParamLo, LParamHi);
  end;
end;


tsu  2008-05-23 22:50:12  No: 30772

KHE00221さん、Basserさん、ありがとうございます。

StdCtrls.pasでEditWndProcを編集してみましたが、
なぜか「静的メソッドのためoverrideできません」のままで
コンパイルできませんでした。

もうひとつの、
ComboWndProcの方を試してみましたところ、
KeysToShiftStateが未定義でコンパイルエラーになりましたが
今回はShiftキーを気にする必要はないため

if (Msg = WM_LBUTTONDOWN) then
  MouseDown(mbLeft, [], LParamLo, LParamHi);

のようにしてうまく動作することを確認できました。

コンポーネントを作るのは初めてでしたので
今回は大変勉強になりました。
virtual等についてもいろいろ調べてみます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加