度々の質問で恐縮ですが、皆様のご協力をお願いします。
ListViewのCheckboxesをTrueにしたときに出るチェックボックスをクリックしたときに何らかの処理を行おうと思っているのですが、
どうすれば、その判断ができるようになるのでしょうか?ご教授お願いします。
OnChangeイベントで処理すれば如何ですか?
onChangeはSelectedの変更時では?
すみません
>ctText リスト項目の Caption プロパティに対する変更
>ctImage リスト項目の ImageIndex プロパティまたはリストビューのイメージリストに対する変更
>ctState リスト項目の Cut,Focused,または Selected プロパティに対する変更
OnChange はチェックボックスをクリックしたときも呼ばれます。
でも、チェックボックスをクリックしたとき<だけ>呼ばれるイベントが見あたりません。
これはどうですか?
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;
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を使ってしまう。
いま初めてDelphiにinttoboolとbooltointが無い理由に気付きました^^;
TtPIPICHさんの方法で、うまくいきました。
皆様、沢山の返答ありがとう御座いました。
Item.Data を使う方法で実現できることを確認しました。なるほど!
各アイテムのDataプロパティを使ってるので注意して下さいね。
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;
Focus がある項目の場合は、キーボードにスペースキーでもチェック状態が変更できます。
すみません。解決したと言いましたがまた困ったことが起こりました・・・
プログラムを次のように書き換えたいのですが・・・
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イベントが呼ばれてしまいエラーになります。
こうならない為に何か解決策はありませんか?ご教授お願いします。
あ、のんびり質問している間に沢山の書き込みが・・・ありがとう御座います。
(解決を書き込んでから再読み込みしてなかったのがいけなかったですね)
省Data型さんの方法では大丈夫でしょうか?
関係無いですが
ListView1.Items.Item[Item.Index].Selectedは
Item.Selectedですよ
先にデータを変更すればできました
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;
省Data型さんの方法だと大丈夫でした。(当たり前でね
TtPIPICHさんの方法でも良いようですね。
お騒がせしました。ありがとう御座いました。
ツイート | ![]() |