Witam. Chcę by w labelu wyświetlało ilość zaznaczonych checkboxów w checklistbox, tak by było to zawsze aktualne, na bieżąco. Jak to mogę zrobić? Jest jakaś funkcja która zwraca to w integer czy muszę to jakoś inaczej napisać?
O ile się orientuje to pętla i w niej zliczanie coś w stylu:
function TMainForm.HowManyCLBChecked : integer;
var
I : integer;
begin
Result := 0;
for I := 0 to GalleriesCLB.Items.Count - 1 do
begin
if GalleriesCLB.Checked[I] then
begin
Result := Result + 1;
end;
end;
end;
Można prościej
function CountChecked(): Integer;
var I : Integer;
begin
Result := 0;
for I := 0 to GalleriesCLB.Items.Count - 1 do
Inc(Result, - (StrToInt(BoolToStr(GalleriesCLB.Checked[I]))));
end;
Chyba powinno być:
function CountChecked(): Integer;
var I : Integer;
begin
Result := 0;
for I := 0 to GalleriesCLB.Items.Count - 1 do
Inc(Result, - (StrToInt(BoolToStr(GalleriesCLB.Checked[I]))));
end;
Można prościej
Inc(Result,Integer(GalleriesCLB.Checked[I]));
Inc(Result, - (StrToInt(BoolToStr(GalleriesCLB.Checked[I]))));
Można prościej: if GalleriesCLB.Checked[i] then inc(result);
Wasze omijanie ifa robi więcej problemów niż przyśpiesza (tak bardzo istotny element programu) jak zliczanie paru(nastu) checkboxów.
Inc(Result,Integer(GalleriesCLB.Checked[I]));
Można, tylko po co, skoro można zapisać to za pomocą ifa zamiast przez pare(naście?) minut ślęczeć i modyfikować kod?
Widzę że macie spore problemy skoro ze zliczania checkboxów robicie wyścigi...
Użyłem pierwszej metody od olesio bo ten kod przynajmniej rozumiem i będę umiał modyfikować, wolę z IF.
Dziękuję, działa super
GalleriesCLB.Checked[I]
Checked
to jest tablica Boolean, czyli wartości True
/False
.
Integer(GalleriesCLB.Checked[I]);
To jest rzutowanie na Integer, 1 dla True
i 0 dla False
.
Inc(Result,Integer(GalleriesCLB.Checked[I]));
Procedura Inc
zwiększa zmienną podaną w pierwszym parametrze o wartość drugiego parametru.
Nie ma to jak optymalizacja (if czy rzutowanie boolean na integer) aż się płakać chce:
Na if:
Rzutowanie:
Teraz sobie odpowiedźcie sobie sami który kod jest czytelniejszy i co zaoszczędziliście przez tą "optymalizację".
To jest tak jasne, że aż się płakać chce.
Chciałem tylko pokazać, że jeżeli już robić to bez if to
Inc(Result,Integer(GalleriesCLB.Checked[I]));
jest lepszym rozwiązaniem, niż
Inc(Result, - (StrToInt(BoolToStr(GalleriesCLB.Checked[I]))));
A wymyślenie tego zajęło mi mniej czasu niż napisanie tego postu.