ListViewのチェックボックスをクリックした時にイベント発生させるには

解決


Uga  2004-08-24 09:30:46  No: 10531  IP: [192.*.*.*]

度々の質問で恐縮ですが、皆様のご協力をお願いします。

ListViewのCheckboxesをTrueにしたときに出るチェックボックスをクリックしたときに何らかの処理を行おうと思っているのですが、
どうすれば、その判断ができるようになるのでしょうか?ご教授お願いします。

編集    削除
HOta  2004-08-24 18:44:47  No: 10532  IP: [192.*.*.*]

OnChangeイベントで処理すれば如何ですか?

編集    削除
TtPIPICH  2004-08-24 19:22:43  No: 10533  IP: [192.*.*.*]

onChangeはSelectedの変更時では?

編集    削除
TtPIPICH  2004-08-24 19:27:13  No: 10534  IP: [192.*.*.*]

すみません
>ctText  リスト項目の Caption プロパティに対する変更
>ctImage  リスト項目の ImageIndex プロパティまたはリストビューのイメージリストに対する変更
>ctState  リスト項目の Cut,Focused,または Selected プロパティに対する変更

編集    削除
jok  2004-08-24 19:27:16  No: 10535  IP: [192.*.*.*]

OnChange はチェックボックスをクリックしたときも呼ばれます。
でも、チェックボックスをクリックしたとき<だけ>呼ばれるイベントが見あたりません。

編集    削除
TtPIPICH  2004-08-24 19:33:56  No: 10536  IP: [192.*.*.*]

これはどうですか?
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
if strtobool(inttostr(integer(Item.Data)))<>Item.Checked then showmessage('変更');
Item.Data:=Pointer(strtoint(booltostr(Item.Checked)));
end;

編集    削除
TtPIPICH  2004-08-24 19:40:11  No: 10537  IP: [192.*.*.*]

procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
if integer(Item.Data)<>integer(Item.Checked) then showmessage('変更');
Item.Data:=Pointer(Item.Checked);
end;
Dataを使ってしまう。

編集    削除
TtPIPICH  2004-08-24 19:42:06  No: 10538  IP: [192.*.*.*]

いま初めてDelphiにinttoboolとbooltointが無い理由に気付きました^^;

編集    削除
Uga  2004-08-24 19:58:47  No: 10539  IP: [192.*.*.*]

TtPIPICHさんの方法で、うまくいきました。
皆様、沢山の返答ありがとう御座いました。

編集    削除
jok  2004-08-24 20:02:11  No: 10540  IP: [192.*.*.*]

Item.Data を使う方法で実現できることを確認しました。なるほど!

編集    削除
TtPIPICH  2004-08-24 20:02:40  No: 10541  IP: [192.*.*.*]

各アイテムのDataプロパティを使ってるので注意して下さいね。

編集    削除
省Data型  2004-08-24 20:33:17  No: 10542  IP: [192.*.*.*]

Dataの無駄遣いに抵抗がある貴兄に…(^^ゞ

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  aItem : TListItem;
begin
  with ListView1 do begin
    aItem := GetItemAt(X, Y);
    if aItem = nil then exit;
    if X < aItem.DisplayRect(drLabel).Left then begin
      // チェックBOXがクリックされた
      aItem.SubItems[0] := IntToStr(Integer(aItem.Checked));
    end;
  end;
end;

編集    削除
jok  2004-08-24 20:42:42  No: 10543  IP: [192.*.*.*]

Focus がある項目の場合は、キーボードにスペースキーでもチェック状態が変更できます。

編集    削除
Uga  2004-08-24 20:50:26  No: 10544  IP: [192.*.*.*]

すみません。解決したと言いましたがまた困ったことが起こりました・・・
プログラムを次のように書き換えたいのですが・・・

procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
  if integer(Item.Data)<>integer(Item.Checked) then 
    ListView1.Items.Item[Item.Index].Selected := True;
  Item.Data:=Pointer(Item.Checked);
end;

こうすると、SelectedをTrueにする度にChangeイベントが呼ばれてしまいエラーになります。
こうならない為に何か解決策はありませんか?ご教授お願いします。

編集    削除
Uga  2004-08-24 20:55:57  No: 10545  IP: [192.*.*.*]

あ、のんびり質問している間に沢山の書き込みが・・・ありがとう御座います。
(解決を書き込んでから再読み込みしてなかったのがいけなかったですね)
省Data型さんの方法では大丈夫でしょうか?

編集    削除
TtPIPICH  2004-08-24 21:08:22  No: 10546  IP: [192.*.*.*]

関係無いですが
ListView1.Items.Item[Item.Index].Selectedは
Item.Selectedですよ

編集    削除
TtPIPICH  2004-08-24 21:11:40  No: 10547  IP: [192.*.*.*]

先にデータを変更すればできました
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin

if (integer(Item.Data)<>integer(Item.Checked)) then
begin
Item.Data:=Pointer(Item.Checked);
ListView1.Items.Item[Item.Index].Selected := True;
end;

end;

編集    削除
Uga  2004-08-24 21:22:55  No: 10548  IP: [192.*.*.*]

省Data型さんの方法だと大丈夫でした。(当たり前でね
TtPIPICHさんの方法でも良いようですね。
お騒がせしました。ありがとう御座いました。

編集    削除