as nicht, die Liste aktuell zu halten hier mein Versuch:
Delphi-Quellcode:
begin
myLst:= TCheckListbox(Sender).Name;
if not assigned(myselection) then myselection := TStringList.create; //myselection.clear beim speichern
begin
myselection.Sort;
TCheckListbox(Sender).Sorted := True;
for i := TCheckListbox(Sender).Count-1 downto 0 do
// if TCheckListbox(Sender).Checked[i] then
if TCheckListbox(Sender).State[i] = cbChecked then
begin
if not (myselection.Find(TCheckListbox(Sender).Items[i],myKat)) then myselection.Add(TCheckListbox(Sender).Items[i]);
end
else
if (myselection.Find(TCheckListbox(Sender).Items[i],myKat)) and (TCheckListbox(Sender).State[i] = cbUnChecked) then
myselection.Delete(TCheckListbox(Sender).ItemIndex);
end;
end;
Was mach ich falsch?
1. Wieso sortierst du myselection? Sehe da keinen Sinn und Bedarf darin. Nutze IndexOf anstelle von Find.
2. myselection ist wohl ein Feld deiner Form. Richtig? Versuche dich an di gängigen Namen/Formatregeln von Delphi anzupassen, damit die Wartung deinss Programms später mal einfacher wird. Verwende daher für Object-Felder das Format Fxxx. (FMySelection würde ich es nennen) So siehst du sofort im Code, dass das eine Object-Feldvariable ist.
3. Abfage auf Checked reicht hier, wenn deine Checkboxen nur True/False haben können. Wenn du noch den 3. Status (grayed) hast, wirst du State abfragen müssen. Soweit die Antwort wieso es Checked und State gibt.
4. Wenn du nur ein Clear beim Speichern machst, fehlt dir noch ein Free der Stringliste irgendwo. Das gehört in das OnDestroy Event der Form oder noch besser in einen überschriebenen Destructor deiner Form.
Habe dir mal den Code so angepasst, wie ich das machen würde:
Delphi-Quellcode:
var
StrIdx: Integer;
begin
// myLst:= TCheckListbox(Sender).Name; ???
if not Assigned(FMySelection) then
FMySelection := TStringList.Create; //FMySelection.clear beim speichern
// begin <- unnötig!
//myselection.Sort; // wofür?
//TCheckListbox(Sender).Sorted := True; // wofür?
for i := 0 to TCheckListbox(Sender).Count-1 do
begin
StrIdx := FMySelection.IndexOf(TCheckListbox(Sender).Items[i]);
if TCheckListbox(Sender).Checked[i] then
begin
if StrIdx = -1 then // Text nicht vorhanden
FMySelection.Add(TCheckListbox(Sender).Items[i]);
end
// Checked muss hier nicht abgefragt werden, da das durch das if/else bereits geregelt ist.
else if (StrIdx <> -1) then
begin
FMySelection.Delete(StrIdx);
end;
end;
end;