Newsgroup: it.comp.lang.delphi
Titolo: Implementare lista checkbox con multiselect

Ciao,
devo associare un elemento di tipo A a N elementi di tipo B. Pensavo
di utilizzare un CheckListBox con multiselect ma non riesco a
recuperare i valori dei campi checkati.
Diciamo che ho una lista di comuni, devo visualizzarne il nome ma poi
devo salvarmi il codice comune di quelli selezionati.
Per creare la lista di checkbox ho fatto cosi
for i:=0 to DM.Q_Comuni.RecordCount-1 do
  begin
 
CheckListComuni.Items.AddObject(DM.Q_Comuni.fieldByName('COMUNE_DESC').asString,
TObject(DM.Q_Comuni.fieldByName('COD_COMUNE').asString) );
    DM.Q_Comuni.Next;
  end;
Per selezionare quelli checkati faccio cosi ma mi da dei valori
stranissimi (tipo il nome del comune senza la prima lettera)
for i:=0 to CheckListComuni.Items.Count - 1 do
   begin
       if( CheckListComuni.Checked[i] ) then
       begin
        ShowMessage( 'Valore : ' +
String(CheckListComuni.Items.Objects[i]) );
       end
   end;
Qualcuno mi sa dire dove sbaglio ?
Uso delphi 7
grazie

 Qualcuno mi sa dire dove sbaglio ?
Devi fare il cast dell'Item all'oggetto corretto.
CheckListComuni.Items.Objects[i] vedi che tipo di oggetto ritorna e 
castalo all'oggetto giusto: forse un tcheckbox invece che una "String" 
(ma non era TString?)
ciao
-- 
morde
D5,D6,D7
QT 4.7.0 - MingW- QT Creator 2.1

Il valore mostrato COMUNE_DESC è diverso dal valore che devo salvare
COD_COMUNE ! La seconda opzione che mi hai mostrato funziona !
Ora il problema è un altro : devo gestire tutto manualmente ovvero
quando vado in modifica della provincia devo prendermi tutta la lista
dei comuni, vedere quali comuni sono associati a quella provincia e
checckare quelli corretti.
Quando salvo idem ...io praticamente ho la tabella provincia, la
tabella comuni e una tabella ponte con cod_provincia e cod_comune per
associare n comuni ad una provincia.
Ci sono strumenti diversi dal TCheckListBox che mi renderebbero la
vita più facile ? Sono agli inizi con delphi ...
Grazie mille

Mai usare recordcount! Se ne e' parlato fino alla nausea e oltre:
*Per calcolare recordcount viene fatto un fechall.*
*Se hai 100 record ok se ne hai 50000 aspetta e spera....*
type
  TComune = class
  public
    property Descrizione: string....
    property Codice: string.....
  end;
....
procedure TForm1.FillCheckBoxList;
var
  ObjComune: TComune;
  i: integer;
  P: Tobject;
begin
  CheckListComuni.Items.BeginUpdate;
try
  for i := Pred(CheckListComuni.Items.Count) downto 0 do
  begin
     p := CheckListComuni.Items.Objects[i];
     FreeAndNil(p);
  end;
  CheckListComuni.Items.Clear;
  while not DM.Q_Comuni.Eof do
  begin
     ObjComune := TComune.Create;
     ObjComune.codice :=
DM.Q_Comuni.fieldByName('COD_COMUNE').asString);
     ObjComune.descrizione :=
DM.Q_Comuni.fieldByName('COMUNE_DESC').asString;
     CheckListComuni.Items.AddObject(ObjComune.Descrizione,
objComune);
     DM.Q_Comuni.Next;
  end;
finally
  CheckListComuni.Items.EndUpdate;
end;
var
  p: TObject;
  ComuneInfo: string;
  TempComune: TComune;
for i:=0 to CheckListComuni.Items.Count - 1 do
   begin
       if( CheckListComuni.Checked[i] ) then
       begin
            p := CheckListComuni.Items.Objects[i];
            if (Assigned(p)) then
            begin
                 TempComne :=  TComune(p);
                 ComuneInfo := TempComune.Codice + ' /' +
TempComune.Descrizione;
                 ShowMessage( 'Valore : ' +  ComuneInfo);
            end
       end;
   end;
Se premi f1 puoi leggere a cosa serve begin/endupdate sugli items.
La clear degli items non libera gli oggetti TComune eventualmente
creati precedentemente.
Delphi non ga il garbage collector.
Solo gli oggetti che prevedono un owner vengono distrutti, se esso e'
assegnato, alla distruzione dell'owner.
Se sei alle prime armi il mio consiglio e': classi, classi e ancora
classi.
Tutto il resto DOPO, altrimenti usi delphi come se fosse vb6.
A.