2017-05-31 1 views
1

条件付きで表示されるチェックボックスがいくつかあります。つまり、インデックスが静的ではないことを意味します。この場合、アクションを例えば0は毎回異なるチェックボックスであるため、CheckListBox.Checked[0]は役に立たない。キャプションfooのチェックボックスがオンになっているかどうかを確認する方法はありますか?個々のチェックボックスのキャプションごとにチェックボックスリストの状態を読み取る

私はこれをやろうとしている:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
begin 
    if CurUninstallStep = usUninstall then 
    begin 
    if CheckListBox.Checked[0] then 
     DelTree(ExpandConstant('{appdata}\Dagonybte\Prog1'), True, True, True) 
    if CheckListBox.Checked[1] then 
     DelTree(ExpandConstant('{appdata}\Dagonybte\Prog2'), True, True, True) 
     { ... } 
    if CheckListBox.Checked[2] then 
     DelTree(ExpandConstant('{appdata}\Dagonybte\Prog3'), True, True, True) 
    end 
end; 
+0

'CheckListBox.Items.IndexOf( 'Item caption')'はインデックスを見つけるのに役立ちませんか? – Victoria

+0

私たちに背景を教えてもらえますか?具体的に何が必要ですか? [あなたの前の質問への私の答え](https://stackoverflow.com/a/44254371/850848)は、チェックボックスの処理方法を示しています。 –

+0

あなたは実際に似たような質問を続けています:https://stackoverflow.com/q/44274005/850848 - あなたは間違った側から問題を見ているようです - あなたが何をしたいのですか?チェックボックス?いくつかのコードを見せてください!キャプションでチェックボックスを調べるのは恐ろしい考えです。 –

答えて

3

は、そのキャプションによってチェックボックスを見上げるはひどいアイデアのように見えます。

それは確かになんとかです:

Index := CheckListBox.Items.IndexOf('Prog 1'); 
if (Index >= 0) and CheckListBox.Checked[Index] then 
begin 
    { checked } 
end 
    else 
begin 
    { does not exist or unchecked } 
end; 

しかし、それは正しいアプローチではありません。

TCheckListBoxの目的は、ループ内の一部のデータからチェックボックスのリストを生成することです。実際にはway you are using itとは何ですか。

キャプションでチェックボックスを参照しようとすると、各チェックボックス専用のコードを書きたいとします。それはTCheckListBoxの目的に反するものです。


代わりに、ユーザー選択を処理するときは、リストを生成するときと同じアプローチを使用して、ループを使用します。

code I have shown you to generate the checkbox listは、Dirs: TStringListに同じインデックスを持つ関連パスのリストを目的別に生成します。

だからパスを処理するために、チェックボックスと一緒に、そのリストを反復処理:上記

{ Iterate the path list } 
for Index := 0 to Dirs.Count - 1 do 
begin 
    { Is the associated checkbox checked? } 
    if CheckListBox.Checked[Index] then 
    begin 
    { Process the path here } 
    MsgBox(Format('Processing path %s', [Dirs[Index]]), mbInformation, MB_OK); 

    { In your case, you delete the folder } 
    DelTree(Dirs[Index], True, True, True); 
    end; 
end; 

実際にコードに似ている、あなたはすでに私の前の答えを持っています。

これは同じ概念ですが、私はもう1つの質問にあなたを示しました:Inno Setup - Check if multiple folders exist


場合には、個々のチェックボックスが本当に(すなわち、それらは質的に同じ項目のリストを表していない)特別な処理を必要とし、正しい方法は、あなたがそれらを生成時にそのインデックスを覚えている:

if ShouldAddItem1 then 
    Item1Index := CheckListBox.AddCheckBox(...) 
else 
    Item1Index := -1; 

if ShouldAddItem2 then 
    Item2Index := CheckListBox.AddCheckBox(...) 
else 
    Item2Index := -1; 
if (Item1Index >= 0) and CheckListBox.Checked[Item1Index] then 
    { Process item 1 } 

if (Item2Index >= 0) and CheckListBox.Checked[Item2Index] then 
    { Process item 2 } 
+0

あなたは正しいです、申し訳ありません。私はあなたがソリューションを提供する前に 'CheckListBox'か' TCheckListBox'のどちらかに慣れていなかったので、どのように動作しているのか理解しようとすると、愚かな疑問が生じました。今はっきりしている。無関係の質問を削除する必要があるかどうかを教えてください。 –

+0

いいえです。これらは悪い質問ではありません。スタンドアロンの 'TCheckBox'を使用していたとしても、パスと関連するチェックボックスのリストを維持してループ内で処理できるようにする必要があります。 –

関連する問題