Newsgroup: it.comp.lang.delphi
Titolo: Baco in TListView (proprietà OverlayIndex): avete voglia di provare?

Per favore, qualcuno avrebbe tempo/voglia di fare questa prova?
1.	creare un'applicazione vuota e mettere sulla form una       
		ListView, due ImageList e un Button;
2.  caricare un'icona qualsiasi o un'immagine piccola (32x32) 
    nella prima ImageList e un'immagine diversa nella seconda
    ImageList;
3.  impostare le seguenti proprietà di ListView:
      ViewStyle a vsIcon (dovrebbe essere il default),
      LargeImages alla prima ImageList,
      StateImages alla seconda ImageList,
      aprire l'editor della proprietà Items e creare un nuovo
      item, impostando ImageIndex = 0 e mettendo una Caption
      qualsiasi;
 
4.  scrivere nell'OnClick del Button il seguente codice:
      ListView1.Items[0].OverlayIndex:= 0;
5.  lanciare l'applicazione e premere il bottone.
Ebbene, qui da me non succede nulla, mentre si dovrebbe vedere 
l'immagine della seconda ImageList che viene sovrapposta 
all'immagine originale dell'item.
Infatti la guida dice:
"Use OverlayIndex to display an overlay mask on an item in the 
list when the ViewStyle of the list view is vsIcon or 
vsSmallIcon. OverlayIndex is the index of the overlay image in the 
StateImages property of the list view. 
An overlay mask is an image drawn transparently over the icon 
for the item in the list view. For example, to indicate that an 
item is no longer available, an application could use an 
overlay image of an X over the item's image."
E cioè proprio quello che serviva a me, cioè DISABILITARE solo alcune icone 
della ListView.
E' un baco?? (ke sfiga però...era così comodo, altrimenti mi toccherà 
seguire la strada dell'Owner Draw)
-- 
Mauro Falzari ( 
http://digilander.libero.it/mauro.falzari
 )
"Se guardi nell'abisso, anche l'abisso guarda in te." (Friedrich Nietzsche)

 Per favore, qualcuno avrebbe tempo/voglia di fare questa prova?
Riassumo le chiarificazioni date da Paolo Arosio e Luigi D. Sandon sul ng di 
Marco, perchè ritengo che la cosa possa essere utile a molti.
La questione è: come disegnare una X, in modo semplice, sopra l'icona di un 
elemento di una ListView, per mostrare che questo è disattivato (questo è 
solo un esempio).
Innanzitutto, come dice Luigi, il baco non è nel componente TListView, ma 
nell'help, perchè alla voce TListItem.OverlayIndex, anzichè chiarire le 
idee, le confonde.
Supponiamo ora di avere un'ImageList contenente un numero qualsiasi di 
immagini, e che quella con indice 0 sia l'immagine di una X rossa.
Nella stessa form abbiamo anche una ListView, con alcuni elementi (che hanno 
le loro proprietà TListItem.ImageIndex diverse da 0, cioè hanno immagini 
diverse dalla X).
Poi richiamiamo il suo metodo Overlay, per esempio così:
  Overlay(0, 1)
dove lo 0 sta per l'indice associato all'immagine della nostra X e l'1 sta 
per un "indice di overlay", che poi andremo a utilizzare con la proprietà 
TListItem.OverlayIndex.
Infine, nel momento in cui vogliamo disegnare la X rossa sopra l'icona di un 
qualsiasi elemento della ListView, sarà sufficiente assegnare alla proprietà 
OverlayIndex di quell'elemento, il valore di 1 (l'"indice di overlay"), in 
questa maniera:
  ListView1.Selected.OverlayIndex:= 1
Per far sì che la X venga disegnata a run time sull'elemento su cui si fa 
clic, Paolo Arosio ha scritto:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ImageList1.Overlay(0, 1);
end;
procedure TForm1.ListView1Click(Sender: TObject);
begin
  if ListView1.Selected <> nil then begin
    if ListView1.Selected.OverlayIndex = 1 then
      ListView1.Selected.OverlayIndex := -1
    else
      ListView1.Selected.OverlayIndex := 1;
  end;
end;
