2017-05-31 5 views
1

J'ai plusieurs cases à cocher visibles de manière conditionnelle, ce qui signifie que leur index n'est pas statique. Dans ce cas, lier une action à, par exemple, CheckListBox.Checked[0] est inutile, car 0 est une case à cocher différente à chaque fois. Existe-t-il un moyen de voir si une case à cocher avec la légende foo est cochée?Lire l'état de la liste de cases à cocher par légende individuelle

Je suis en train de le faire:

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

Will not 'CheckListBox.Items.IndexOf ('de sous-titre de l'article')' aide pour trouver l'index? – Victoria

+0

Pouvez-vous nous donner quelques informations de base? De quoi avez-vous besoin spécifiquement? [Ma réponse à votre question précédente] (https://stackoverflow.com/a/44254371/850848) vous montre comment traiter les cases à cocher. –

+0

Vous continuez à poser des questions similaires: https://stackoverflow.com/q/44274005/850848 - On dirait que vous regardez le problème d'un mauvais côté - Alors que voulez-vous faire, une fois que vous obtenez une référence à la case à cocher? Montrez-nous du code! Regarder une case à cocher par sa légende ressemble à une idée terrible. –

Répondre

3

Vous cherchez une case à cocher par sa légende ressemble à une idée terrible.

Il est en effet faisable:

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; 

Mais ce n'est pas la bonne approche.

Le but de TCheckListBox est de permettre de générer une liste de cases à cocher à partir de certaines données, dans une boucle. Quel est en effet le way you are using it.

Votre tentative de recherche de la case à cocher par sa légende indique que vous souhaitez écrire un code dédié à chaque case. Cela défie le but du TCheckListBox. Au contraire, lors du traitement d'une sélection d'utilisateur, utilisez plutôt la même approche que pour générer la liste, en utilisant une boucle.

Le code I have shown you to generate the checkbox list génère par destination une liste de chemins associés avec les mêmes index en Dirs: TStringList.

donc cette liste itérer ainsi que les cases à cocher pour traiter les chemins:

{ 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; 

Ce qui précède est en fait similaire au code, vous avez déjà dans ma réponse précédente.

Et c'est le même concept, je vous ai montré dans votre encore une question: Inno Setup - Check if multiple folders exist.


Dans le cas où les cases individuelles ont vraiment besoin d'un traitement spécial (ils ne représentent pas une liste d'éléments qualitativement identiques), la bonne façon est de se rappeler leur index au moment de les générer:

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

Vous avez raison, désolé. Je ne connaissais pas 'CheckListBox' ou' TCheckListBox' avant que vous n'ayez proposé la solution, alors, essayer de comprendre comment ils fonctionnent a abouti à des questions stupides. Tout est clair maintenant. Faites-moi savoir si je devrais supprimer des questions non pertinentes. –

+0

Non ce n'est pas grave. Ce ne sont pas de mauvaises questions. Notez que même si vous restiez avec 'TCheckBox' autonome, vous auriez dû faire la même chose - maintenir une liste de chemins et de cases à cocher associées pour permettre leur traitement dans une boucle. –