Читать состояние списка флажков по отдельному заголовку флажка

У меня есть несколько условно видимых флажков, что означает, что их индекс не является статическим. В этом случае связывание действия, например, 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 }
Другие вопросы по тегам