Newsgroup: it.comp.lang.delphi
Titolo: TCheckListBox... CheckedCount?

Ho bisogno di conoscere se almeno uno degli items è checked... la 
proprietà SelCount non è utilizzabile e che mi risulti il controllo in 
questione non possiede una (immaginaria...) CheckedCount, sì ho letto 
più volte l'help! ;-)
Ho risolto in questo modo brutale:
procedure TmainForm.sqlCondQueryItems0ItemEnabled(Sender: TsqlWhereItem; 
var Enabled: Boolean);
var i: integer;
     b: boolean;
begin
   b := false;
   for i:= 0 to (clbFiltCntTp.Items.Count -1) do
   begin
     b := b OR clbFiltCntTp.Checked[i];
   end;
   Enabled := b;
end;
Non è certo geniale ma funziona... qualcuno ha un'idea migliore prima 
che faccia anche un AND per sapere se lo sono tutti?
-- 
Design for the future, because it will be here sooner than you think.
(C) Eric S. Raymond, from "The Art of Unix Programming"

    Enabled := b;
Spero x te che non sia la reale nomenclatura che usi...
Dopo 10 minuti non capiresti piu' un tubazzo....
A.

 Dopo 10 minuti non capiresti piu' un tubazzo....
Capisco, incasso e confesso che talvolta mi succede ;-) ma nel caso 
specifico per me ha un significato preciso 
clb(CheckListBox)Filt(Filtro)Cnt(tabella Contatti)Tp(campo Tipo).
Qualcosa di storto comunque deve esserci (forse sono troppo tirchio 
sulla lunghezza) visto che nel tempo mi capita di cambiare regole di 
nomenclatura.



Var nContaItem: Integer;
     nAllItem: Integer;
     lAllItemCheck: Boolean;
begin
   nContaItem := 0;
   nAllItem := clbFiltCntTp.Items.Count -1;
   lAllItemCheck := True;
   while (Not(nContaItem> (nAllItem-nContaItem))) and (lAllItemCheck) do
   begin
     lAllItemCheck := clbFiltCntTp.Checked[nContaItem] and 
clbFiltCntTp.Checked[nAllItem-nContaItem];
     inc(nContaItem);
   end;
   Enabled := lAllItemCheck;
end;
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

 nContaItem := 0;
Più o meno, infatti alla fine ho fatto:
var i: integer;
     CheckedCount, ItemsCount: integer;
begin
   CheckedCount := 0;
   ItemsCount := clbFiltCntTp.Items.Count;
   for i:=0 to ItemsCount -1 do
   begin
     if (clbFiltCntTp.Checked[i]) then Inc(CheckedCount);
   end;
   Enabled := (CheckedCount > 0) AND (CheckedCount < ItemsCount);
end;



Molto piu' che meno ... :)
Con il ciclo for scorri tutta la lista e se uno è spento devi arrivare 
in fondo per saperlo, se per esempio hai n check e il primo è spento è 
inutile continuare, almeno metti un break nel caso di check a false....


 in fondo per saperlo
Hai perfettamente ragione, risolve a pieno il mio quesito iniziale 
ovvero evitare ove possibile l'iterazione di tutti gli items ma io nel 
frattempo mi ero rassegnato e ho sottovalutato la preziosa risposta... 
fuorviato anche dal nome della variabile /lAllItemCheck/ che non esprime 
lo scopo secondo i miei gusti.
Copio a piene mani e rinomino la variabile in lChecksMakesSense ;-)
Grazie.


 end;
Non sono sicuro che funzioni: se tutti i check sono a true la
funzione deve dare enabled=False mentre la tua soluzione
restituisce True.
IMHO in questo caso cosi' semplice cercare di uscire prima
dal ciclo e' solo una inutile complicazione: risparmi qualche
ciclo di clock ma perdi in manutenibilita' del codice,
meglio cercare di ottimizzare quando e' davvero necessario! :)
ciao
Giacomo

 meglio cercare di ottimizzare quando e' davvero necessario! :)
Hai ragione anche tu, li per lì ne ho fatta una questione di principio 
pur sapendo benissimo che le tabelle di lookup contengono pochissimi 
record, mediamente una decina ma in buona parte meno di 5.
Più che altro poteva essere interessante per derivarne un TCheckListBox 
con una proprietà aggiuntive... CheckedCount.


 record, mediamente una decina ma in buona parte meno di 5.
Il principio infatti e' corretto: e' sciocco far fare al programma
operazioni inutili, pero' spesso ottimizzare il codice va in
conflitto con l'altro principio: di mantenere il codice semplice
e manutenibile!
E' "solo" questione di capire in quali casi e' meglio spingere in
una direzione e in quali nell'altra...  :-)
ciao
Giacomo

 che faccia anche un AND per sapere se lo sono tutti?
Visto che setState è privata, "copiare" il componente cambiando
setState in modo da incrementare / decrementare la nuova proprietà
checkedCount?
Saluti,
Paolo Arosio

 restituisce True.
mmm mi è sfuggito qualcosa ?????
il ciclo while controlla che tutti i check siano a true, in caso 
contrario restituisce false ...


PAOLOOOOOOO!
AZZ!
OGNI TANTO RICOMPARI QUI!
COME STAI? CHE FAI? DOVE STAI?
ETC ETC ETC...
:-D
A.


Check your mailbox :-)