Monday, January 01, 2007

Cast e ListView in Delphi

In molte applicazioni si ha la necessità di dare all'utente la possibilità di creare più oggetti della stessa classe. Questi oggetti hanno una propria vita e l'utente deve poterli selezionare per lavorare su di essi.
Una situazione classica è quella di avere una lista di tali oggetti da cui selezionare quello su cui si vuole lavorare. Sorge il problema di passare dalla selezione sulla lista all'oggetto associato.
In Win32 una lista ha una sua rappresentazione come ListView. Una riga della ListView (ListItem) è un oggetto che ha, tra le proprietà, un puntatore (Data). Questo puntatore consente di memorizzare, tra le altre cose, il riferimento all'oggetto che noi associamo alla riga della lista.
L'uso del cast consente di "leggere" il puntatore come l'oggetto che abbiamo associato alla riga.

Ecco un esempio:

Creazione dell'oggetto

var
lv:TListItem;
p:TOggetto;
begin
lv:=lvElenco.Items.add;
lv.Caption:='Oggetto '+inttostr(lvElenco.Items.Count);
//creazione dell'oggetto
p:=TOggetto.create;
//associazione dell'oggetto all'Item appena creato
lv.Data:=p;
end;

Recupero dell'oggetto associato alla riga della lista (Item):

var
obj:TOggetto;
begin
//recupero l'oggetto tramite il casting
obj:=TOggetto(Item.Data);
...
end;

No comments: