マウスでリスト選択時、リストの外でマウスを離したイベントを取得するには?


nish  2009-01-06 23:42:44  No: 33022

(Delphi 6.0 Pro/WinXP)
ListViewを使用し、選択したItemに対して処理を行いたいのですが
マウスで選択時、リストの外でマウスを離すと
OnClick、OnItemSelectイベントが発生しません。
マウスを離したイベントを取得する方法はありますでしょうか?

OnClick、OnItemSelectでは
余計に処理を行ってしまうので、なるべく避けたいと思っています。

※処理は単純に↓のような感じです。
  ----------------
  for i := 0 to List.Count - 1 do
  begin
      if not List.Item[i].Selected then continue;
      処理
  end;
  ----------------


monaa  2009-01-07 00:28:20  No: 33023

OnMouseUP以外はないと思います。


nish  2009-01-07 00:54:40  No: 33024

書き間違えました。
> OnClick、OnItemSelectイベントが発生しません。
OnClick、OnMouseUPイベントが発生しません。

だとすると、やはりムリでしょうか?

他に何か方法はないでしょうか?


TS  2009-01-07 01:42:13  No: 33025

>マウスで選択時、リストの外でマウスを離すと
キャンセルした事になるので、これで普通の動作ですが。

ドラッグしたいというのであれば下記が参考になるでしょうか。
https://www.petitmonte.com/bbs/answers?question_id=1049


お約束  2009-01-07 02:01:20  No: 33026

真琴:「ListViewの外に出たら、ListViewのMouseUPイベントは発生しないよね? ハルコさん」
春子:「まぁ、"普通"はネ」
真琴:「え? 普通じゃない特別ってあるの?」
春子:「あるよ、マコト、それが Mouse Capture」

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SetCapture(ListView1.Handle);
  Memo1.Lines.Add('Mouse Down');  // 確認
end;

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Memo1.Lines.Add('Mouse Up');  // 確認
end;

procedure TForm1.ListView1Click(Sender: TObject);
begin
  Memo1.Lines.Add('Mouse Click');  // 確認
end;

真琴:「あっ、そっか…、じゃぁ、DragDropする時にもマウスがCaptureされてるの?」
春子:「そう、それは自動的にCaptureされるから、意識しないけど "お約束"よ」
真琴:「ふ〜ん、そうなんだ…、ねぇ、お尻はまだ痛むの? ハルコさん」
春子:「うん、チョットね、お尻の弾力のおかげで骨は大丈夫だったけど、鏡で見たらアザが出来てたよ」
真琴:「だけど、ナンで木になんか登ったの?」
春子:「そういう時もあるのよ、気がついたら木の上に登ってたってコトが」
真琴:「え? アタシ、そんなコト一度もないよ、でも、ゆっくり気をつけて降りればイイんじゃない? ハルコさん」
春子:「それはダメよ、木に登ったら、イサギヨク落ちるのが"お約束"」
真琴:「ふ〜ん、そうなんだぁ…」


monaa  2009-01-07 03:52:52  No: 33027

ぎゃほ、MouseUpイベント発生しないんですね。
Mouse Captureは初めて知りました、勉強になります。
私だったらサブクラス化しているところでした。
http://www.geocities.jp/asumaroyuumaro/program/tips/SubClassProc.html

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    OriginProc: TWndMethod;  //元のウィンドウ関数保持用
    procedure SubClassProc(var msg: TMessage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginProc :=ListView1.WindowProc;
  ListView1.WindowProc :=SubClassProc;
end;

procedure TForm1.SubClassProc(var msg: TMessage);
begin
  OriginProc(msg);
  case msg.Msg of
    WM_LBUTTONUP :beep;
  end;
end;

end.

いあ、多分派生コンポーネント化かな…


nish  2009-01-07 05:20:35  No: 33028

皆様ありがとうございます。

お約束さんのSetCapture試しました。

少し期待した事がずれていました。
わかりずらくてすみません。

リストに2件ある状態で(MultiSelect=True)
リストの何もないところ(2件目の下)でMouseDownし、
(点線の枠が表示され、複数選択できる状態になります)
リストの外で離した時にMouseUpイベントを取得できないでしょうか?

現在は、マウスを離した時に
MouseDownイベントが発生するだけです。
(しかもXY座標は、マウスを放した場所でなく、MouseDownした場所です。)


まだ見えない  2009-01-07 06:00:43  No: 33029

>少し期待した事がずれていました。
期待してること、やりたいことは最初にもらさず書くべきだと思うけど、
一体、外でMouseUPしたときに何がやりたいの?
外の座標が何で必要なのか見えないね。


見えないの?  2009-01-07 20:24:20  No: 33030

>一体、外でMouseUPしたときに何がやりたいの?
一番最初に書いてあるじゃん。
リスト領域内でMouseUPした時と同じ動作をしたいんでしょ?


nish  2009-01-07 20:52:20  No: 33031

リスト領域内のItemのない所でMouseDownし
(ドラッグで複数選択できる状態)
リスト領域外でMouseUpした時に
リスト領域内でMouseUpした時と同じ動作をしたいのです。


MouseUPへの拘りって何?  2009-01-07 21:00:50  No: 33032

>リスト領域内でMouseUPした時と同じ動作をしたいんでしょ?
ほんとにそれだけなら、マウスボタンを「離した」時に、ListViewの中でも外でも
MouseDownイベントが発生するんだから、そのイベントを使えばいいだけのこと。
(マウスボタンを「押した」時にはMouseDownイベントは発生しない)
わざわざ、リスト外でのイベントを取得したいという質問だから、
リスト外の場合は何か特別の処理をしたいんじゃないの?
こんなことを質問者でない者同士が議論しても無意味だけど。

...と投稿しようとしたら、質問者本人から返答が...

>リスト領域外でMouseUpした時に
>リスト領域内でMouseUpした時と同じ動作をしたいのです。
それなら、MouseDownイベントで目的達成できるよね?


TS  2009-01-08 06:27:01  No: 33033

お約束さんが回答されている事以上のベストな回答は無いと思います。

nishさんが望まれているのは ListView1内で選択状態になって
いる状態でListView1以外の場所でのMouseUpだと思われますが
これではListView1の選択は未設定のままですので一番最初の
プログラムでは思うように動作しないでしょう。

それともお約束さんのコードのReleaseCaptureする前に
なにか確定させるコードでもあれば出来るかもしれませんが。


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

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






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