Читать состояние списка флажков по отдельному заголовку флажка
У меня есть несколько условно видимых флажков, что означает, что их индекс не является статическим. В этом случае связывание действия, например, CheckListBox.Checked[0]
бесполезен, так как 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;
1 ответ
Поиск флажка по заголовку выглядит ужасной идеей.
Это действительно выполнимо:
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
это позволяет создать список флажков из некоторых данных в цикле. Что на самом деле, как вы используете это.
Ваша попытка найти флажок по заголовку означает, что вы хотите написать код, выделенный для каждого флажка. Это бросает вызов цели TCheckListBox
,
Вместо этого при обработке выбора пользователя используйте тот же подход, что и при создании списка, используйте цикл.
Код, который я показал вам для создания списка флажков, по назначению создает список связанных путей с такими же индексами в 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;
Выше на самом деле похож на код, который вы уже имели в моем предыдущем ответе.
И это та же концепция, я показал вам еще один вопрос: Inno Setup - Проверьте, существует ли несколько папок.
Если отдельные флажки действительно требуют специальной обработки (т. Е. Они не представляют список качественно одинаковых элементов), правильным способом будет запомнить их индекс во время их создания:
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 }