(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;
----------------
OnMouseUP以外はないと思います。
書き間違えました。
> OnClick、OnItemSelectイベントが発生しません。
OnClick、OnMouseUPイベントが発生しません。
だとすると、やはりムリでしょうか?
他に何か方法はないでしょうか?
>マウスで選択時、リストの外でマウスを離すと
キャンセルした事になるので、これで普通の動作ですが。
ドラッグしたいというのであれば下記が参考になるでしょうか。
https://www.petitmonte.com/bbs/answers?question_id=1049
真琴:「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されるから、意識しないけど "お約束"よ」
真琴:「ふ〜ん、そうなんだ…、ねぇ、お尻はまだ痛むの? ハルコさん」
春子:「うん、チョットね、お尻の弾力のおかげで骨は大丈夫だったけど、鏡で見たらアザが出来てたよ」
真琴:「だけど、ナンで木になんか登ったの?」
春子:「そういう時もあるのよ、気がついたら木の上に登ってたってコトが」
真琴:「え? アタシ、そんなコト一度もないよ、でも、ゆっくり気をつけて降りればイイんじゃない? ハルコさん」
春子:「それはダメよ、木に登ったら、イサギヨク落ちるのが"お約束"」
真琴:「ふ〜ん、そうなんだぁ…」
ぎゃほ、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.
いあ、多分派生コンポーネント化かな…
皆様ありがとうございます。
お約束さんのSetCapture試しました。
少し期待した事がずれていました。
わかりずらくてすみません。
リストに2件ある状態で(MultiSelect=True)
リストの何もないところ(2件目の下)でMouseDownし、
(点線の枠が表示され、複数選択できる状態になります)
リストの外で離した時にMouseUpイベントを取得できないでしょうか?
現在は、マウスを離した時に
MouseDownイベントが発生するだけです。
(しかもXY座標は、マウスを放した場所でなく、MouseDownした場所です。)
>少し期待した事がずれていました。
期待してること、やりたいことは最初にもらさず書くべきだと思うけど、
一体、外でMouseUPしたときに何がやりたいの?
外の座標が何で必要なのか見えないね。
>一体、外でMouseUPしたときに何がやりたいの?
一番最初に書いてあるじゃん。
リスト領域内でMouseUPした時と同じ動作をしたいんでしょ?
リスト領域内のItemのない所でMouseDownし
(ドラッグで複数選択できる状態)
リスト領域外でMouseUpした時に
リスト領域内でMouseUpした時と同じ動作をしたいのです。
>リスト領域内でMouseUPした時と同じ動作をしたいんでしょ?
ほんとにそれだけなら、マウスボタンを「離した」時に、ListViewの中でも外でも
MouseDownイベントが発生するんだから、そのイベントを使えばいいだけのこと。
(マウスボタンを「押した」時にはMouseDownイベントは発生しない)
わざわざ、リスト外でのイベントを取得したいという質問だから、
リスト外の場合は何か特別の処理をしたいんじゃないの?
こんなことを質問者でない者同士が議論しても無意味だけど。
...と投稿しようとしたら、質問者本人から返答が...
>リスト領域外でMouseUpした時に
>リスト領域内でMouseUpした時と同じ動作をしたいのです。
それなら、MouseDownイベントで目的達成できるよね?
お約束さんが回答されている事以上のベストな回答は無いと思います。
nishさんが望まれているのは ListView1内で選択状態になって
いる状態でListView1以外の場所でのMouseUpだと思われますが
これではListView1の選択は未設定のままですので一番最初の
プログラムでは思うように動作しないでしょう。
それともお約束さんのコードのReleaseCaptureする前に
なにか確定させるコードでもあれば出来るかもしれませんが。
ツイート | ![]() |