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

解決


Uga  2004-08-24 09:30:46  No: 10531

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

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


HOta  2004-08-24 18:44:47  No: 10532

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


TtPIPICH  2004-08-24 19:22:43  No: 10533

onChangeはSelectedの変更時では?


TtPIPICH  2004-08-24 19:27:13  No: 10534

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


jok  2004-08-24 19:27:16  No: 10535

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


TtPIPICH  2004-08-24 19:33:56  No: 10536

これはどうですか?
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

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

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


Uga  2004-08-24 19:58:47  No: 10539

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


jok  2004-08-24 20:02:11  No: 10540

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


TtPIPICH  2004-08-24 20:02:40  No: 10541

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


省Data型  2004-08-24 20:33:17  No: 10542

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

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


Uga  2004-08-24 20:50:26  No: 10544

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

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

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


TtPIPICH  2004-08-24 21:08:22  No: 10546

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


TtPIPICH  2004-08-24 21:11:40  No: 10547

先にデータを変更すればできました
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

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


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

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






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