TListView で MouseUp イベントが発生しない対処法

解決


Terry  2025-02-16 08:56:22  No: 151774  IP: 192.*.*.*

いつもお世話になっています。

TListView でアイテムの上で右クリックしたり
MultiSelect=False の場合にアイテム外でクリックした場合に
MouseUp イベントが発生しないようで困っています。

            MouseDown    MouseUp
Left  Item=nil    ○       not MultiSelect
Right  Item=nil    ○       not MultiSelect
Left  Item<>nil    ○       ○
Right  Item<>nil    ○       X

これは逃れることの出来ない仕様なのでしょうか?
さらに RowSelect=True にするとまた範囲が広がってくるのでどうにか対処したいのです。
今まで気になることはなかったのですが、ポップアップとドラッグ開始の切り分けに
MouseDown/MouseUp の組み合わせが必要になりここで行き詰まってしまいました。

今取りかかっているものでは、恐らく他の要素が加わり
右クリックでの MouseUp はアイテム外でしか発生していません(yoy)

編集 削除
AAAAA  2025-02-16 13:04:25  No: 151775  IP: 192.*.*.*

MouseUpが発生しないときは
MouseDown の inherited; を抜けるのがUPした後みたいなので

  TListView = class(Vcl.ComCtrls.TListView)
  protected
    procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
  end;


procedure TListView.WMRButtonDown(var Message: TWMLButtonDown);
var
    MouseDown: TMouseEvent;
begin

    if Assigned(OnMouseDown) = True then
    begin
      OnMouseDown(Self , mbRight , [] , Message.XPos , Message.YPos);
      MouseDown := OnMouseDown;
      OnMouseDown := nil;
      inherited;
      OnMouseDown := MouseDown;
    end
    else
    begin
      inherited;
    end;

    if (Assigned(Selected) = True) or (MultiSelect = True) then
    begin
      if Assigned(OnMouseUp) = True then
      begin
        OnMouseUp(Self , mbRight , [] , Message.XPos , Message.YPos);
      end;
    end;
end;

編集 削除
Terry  2025-02-17 12:09:03  No: 151776  IP: 192.*.*.*

AAAAA  さん、ありがとうございます。
無事イベントが発生しました。
家宝にしたいと思います。

編集 削除