TComboBoxから派生したコンポーネントを作成しています。
マウスクリックしたときの入力カーソルの位置を知りたかったので
MouseDownイベントをoverrideしてみたのですが、
Edit部分のクリックでイベントが発生しないようです。
リストを表示するボタンをクリックすると発生しました。
なんとかEdit部分のクリックでイベントを発生させる方法はないでしょうか?
他のアイデアでもよいので何かありましたらよろしくお願いします。
作業環境:Delphi7 WindowsVista
こんな感じ?
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;
KHE00221さんありがとうございます。
EditWndProcは「静的メソッドのためoverrideできません。」
とコンパイルエラーが出たためoverrideを外して試してみましたが
やはりEdit部分のマウス押下を認識してくれないようです。
EditWndProcメソッドは確かに正解に近そうなので
この線でもう少し調べてみます。
Delphi7 だと virtual 付いてないのか
StdCtrls.pas の
TCustomCombo = class(TCustomListControl)
procedure EditWndProc(var Message: TMessage); virtual;
と Virtual を付ければ override 可能になりますよ・・・
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;
KHE00221さん、Basserさん、ありがとうございます。
StdCtrls.pasでEditWndProcを編集してみましたが、
なぜか「静的メソッドのためoverrideできません」のままで
コンパイルできませんでした。
もうひとつの、
ComboWndProcの方を試してみましたところ、
KeysToShiftStateが未定義でコンパイルエラーになりましたが
今回はShiftキーを気にする必要はないため
if (Msg = WM_LBUTTONDOWN) then
MouseDown(mbLeft, [], LParamLo, LParamHi);
のようにしてうまく動作することを確認できました。
コンポーネントを作るのは初めてでしたので
今回は大変勉強になりました。
virtual等についてもいろいろ調べてみます。
ありがとうございました。
ツイート | ![]() |