掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TListViewのvsReport形式でチェックボックスをチェックなし、あり、不可(グレー)にしたい (ID:38117)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>torさん、アドバイスありがとうございます! StateIndexで管理してるとは思いもよりませんでした。生のListViewコントロールでは、 という話ですよね。 でもそれで不都合が発生するのって、もしかしてVCLにバグがあるんじゃ…。 自前で管理となると、OnClick、OnMouseDownとか使うのですよね。何を使えば良いのでしょう? こちらの手法などが応用できるのでしょうか。 https://www.petitmonte.com/bbs/answers?question_id=5651 今後問題になりそうなところ...ですが、様々な場合に呼び出されるであろうことは想定してました。 が、Checkedの変化によって呼び出されるイベントの内部でCheckedの状態を変えるのは危険なのですね。 例えばですが、「特定のチェックボックスの状態は変化させない」という条件で、上記のコードの OnChange部分をOnChangingに移し、AllowChangeパラメータをFalseにするのはセーフなのでしょうか。 なお、余計な内容を除去した下記のコードで実験を繰り返しました。 ListView、Memo、Timer、チェックボックス画像を入れたImageListを配置してます。 その成果は…間違い無くCheckedの状態変化がおかしいことが判明しただけでした(涙) var ItemChkd: Boolean; StateIdx:Integer; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Enabled:=False; //タイマーを止めておく Memo1.ScrollBars:=ssBoth; ListView1.ViewStyle:=vsReport; //ListViewの初期化 ListView1.Columns.Add; ListView1.Checkboxes:=True; ListView1.ReadOnly:=True; ListView1.StateImages:=ImageList1; ListView1.Items.Add.Caption:='テスト'; //テスト用に1個だけItemを置く ListView1.Items[0].StateIndex:=0; //0=チェックON画像、1=チェックOFF画像 ItemChkd:=not ListView1.Items[0].Checked; //Checkedの変化検出用 StateIdx:=19; //StateIndexの変化検出用 Timer1.Interval:=1; //タイマー始動 Timer1.Enabled:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); var LIC:Boolean; LIS:Integer; begin LIC:=ListView1.Items[0].Checked; LIS:=ListView1.Items[0].StateIndex; if (ItemChkd<>LIC) or (StateIdx<>LIS) then begin Memo1.Lines.Add(IfThen(LIC,'True ','False ')+IntToStr(LIS)); ItemChkd:=LIC; StateIdx:=LIS; end; end; procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean); var StrC:String; begin case Change of ctText: StrC:='ctText'; ctImage: StrC:='ctImage'; ctState: StrC:='ctState'; end; Memo1.Lines.Add('Changing!! '+StrC); end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.