2017-05-31 3 views
1

Ich habe mehrere bedingt sichtbare Checkboxen, was bedeutet, dass ihr Index nicht statisch ist. In diesem Fall wird eine Aktion z. CheckListBox.Checked[0] ist nutzlos, da 0 jedes Mal eine andere Checkbox ist. Gibt es eine Möglichkeit zu sehen, ob ein Kontrollkästchen mit der Beschriftung foo aktiviert ist?Gelesenen Checkbox-Listenstatus durch individuelle Checkbox-Beschriftung

Ich versuche, dies zu tun:

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

Wird 'CheckListBox.Items.IndexOf ('Item caption')' helfen, den Index zu finden? – Victoria

+0

Können Sie uns etwas Hintergrund geben? Wofür brauchst du es speziell? [Meine Antwort auf Ihre vorherige Frage] (https://stackoverflow.com/a/44254371/850848) zeigt Ihnen, wie Sie die Checkboxen bearbeiten. –

+0

Sie stellen tatsächlich immer wieder ähnliche Fragen: https://Stackoverflow.com/q/44274005/850848 - Es sieht so aus, als ob Sie das Problem von einer falschen Seite betrachten - Was wollen Sie also tun, wenn Sie eine Referenz bekommen? das Kontrollkästchen? Zeig uns etwas Code! Ein Kästchen nach seiner Überschrift zu suchen, sieht nach einer schrecklichen Idee aus. –

Antwort

3

eine Checkbox durch seine Beschriftung sieht aus wie eine schreckliche Idee oben betrachten.

Es ist in der Tat machbar:

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; 

Aber es ist nicht der richtige Ansatz.

Der Zweck von TCheckListBox ist es, eine Liste von Kontrollkästchen aus einigen Daten in einer Schleife zu generieren. Was ist in der Tat die way you are using it.

Ihr Versuch, das Kontrollkästchen anhand seiner Beschriftung zu suchen, zeigt an, dass Sie einen Code für jedes Kontrollkästchen schreiben möchten. Das widerspricht dem Zweck der TCheckListBox.

Verwenden Sie stattdessen bei der Verarbeitung einer Benutzerauswahl den gleichen Ansatz, da beim Erstellen der Liste eine Schleife verwendet wird.

Die code I have shown you to generate the checkbox list, generiert nach dem Zweck eine Liste der zugehörigen Pfade mit den gleichen Indizes in Dirs: TStringList.

Also diese Liste iterieren zusammen mit den Kontrollkästchen die Pfade zu verarbeiten:

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

Die oben ist eigentlich ähnlich dem Code, haben Sie bereits in meiner vorherigen Antwort.

Und es ist das gleiche Konzept, ich habe Ihnen in Ihrer noch eine andere Frage gezeigt: Inno Setup - Check if multiple folders exist.


Sollten einzelne Kontrollkästchen wirklich eine spezielle Verarbeitung erfordern (dh sie nicht über eine Liste von qualitativ gleichen Elemente darstellen), ist der richtige Weg, ihren Index an der Zeit, die Sie erzeugen an sie erinnern:

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

Sie haben Recht, tut mir leid. Ich war weder mit "CheckListBox" noch mit "TCheckListBox" vertraut, bevor Sie die Lösung angeboten haben. Wenn Sie also herausfinden wollten, wie sie funktionieren, kam es zu dummen Fragen. Es ist jetzt alles klar. Lassen Sie mich wissen, ob ich irgendwelche irrelevanten Fragen löschen sollte. –

+0

Nein, es ist in Ordnung. Das sind keine schlechten Fragen. Beachten Sie, dass Sie selbst dann, wenn Sie bei eigenständigen 'TCheckBox's geblieben sind, dasselbe tun sollten - eine Liste von Pfaden und zugehörigen Ankreuzfeldern pflegen, damit sie in einer Schleife verarbeitet werden können. –