[コンパイラ:Delphi XE2]
私は昨日一日中この特定のタスクを達成するためにあらゆる種類の方法を試しましたが、それらはすべて同じ結果に終わりました。
TRZCheckGroupとこの例を使用して、何がチェックされたかを確認します。
procedure TFrmMain.cbOptionsChange(Sender: TObject; Index: Integer; NewState: TCheckBoxState);
var
ItmIndex0, ItmIndex1: Integer;
begin
{ Initialize ItemIndex's }
ItmIndex0 := -1;
ItmIndex1 := -1;
{ Return the position Index of the string's(0 and 1) }
ItmIndex0 := cbOptions.Items.IndexOf('One');
ItmIndex1 := cbOptions.Items.IndexOf('Two');
{ Which CheckBox has been Checked }
cbOptions.ItemChecked[ItmIndex0] := True;
cbOptions.ItemChecked[ItmIndex1] := False;
end;
注:^これは私の最終的なコードではなく、チェックボックスの処理方法の単なる例です。
のようなもの-
if cbOptions.ItemChecked[ItmIndex0] then
cbOptions.ItemChecked[ItmIndex1] := False
else cbOptions.ItemChecked[ItmIndex1] := True;
それらは最初に動作し、それから常にtrueと評価されますが、その理由は理解できます。elseビットは、最初のチェックボックスのチェックを外したときにのみ動作しますが、これは明らかに私の望ましい結果ではありません。
イベントが機能しなくなったようで、私の試みのいくつかでは、何らかの理由で2回発生しました。
cbListOptionsChangeのNewStateParam、これは何ですか、とにかく私を助けることができますか?
これに関するどんな助けも大いに感謝されるでしょう。
ありがとう。
if cbOptions.ItemChecked[ItmIndex0] then
cbOptions.ItemChecked[ItmIndex1] := False
else if cbOptions.ItemChecked[ItmIndex1] then
cbOptions.ItemChecked[ItmIndex0] := False;
2番目のチェックボックスがチェックされている場合はこのようなものを参照してください。最初のチェックボックスは必要に応じて機能しますが、その後は明らかに2番目のチェックボックスをチェックできなくなります。
ケンホワイト-スニペット(ワーキング)。他の人が混乱する可能性があるため、コンポーネントの名前をデフォルトに置き換えました。将来の質問を保存するためにデフォルトの名前付けに役立つ場合があります。
procedure TForm1.RzCheckGroup1Change(Sender: TObject; Index: Integer; NewState: TCheckBoxState);
var
i: Integer;
begin
// Keep this event from being fired again while we're here.
// Your code isn't clear about what the actual name of the
// component or this event, (the event is named `cbListOptionsChange`,
// but your code references `cbOptions` - I don't know which is
// correct, so change it if needed in the next line and
// the one in the `finally` block below. I'm using `cbListOptions`
// here.
RzCheckGroup1.OnChange := nil;
try
// If we're getting notified of a new item being checked...
if NewState = cbChecked then
begin
// Iterate through the items, unchecking all that aren't
// at the index that just became checked.
// I wouldn't use `for..in`, because the ordering works better here
for i := 0 to RzCheckGroup1.Items.Count - 1 do
if i <> Index then
RzCheckGroup1.ItemChecked[i] := False; // Ryan - Just changed to this from this cbListOptions.Items[i].Checked := False;
end;
// Ryan - Uncomment these two lines if you want one of them to be Checked at all times, this will set the CheckBox you are trying to Uncheck to Checked.
//if not RzCheckGroup1.ItemChecked[Index] then
// RzCheckGroup1.ItemChecked[Index] := True;
finally
// Reconnect the event
RzCheckGroup1.OnChange := RzCheckGroup1Change;
end;
end;