Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: cittadino - Luglio 12, 2014, 09:32:47 am

Titolo: ListView: colore degli item- anomalia
Inserito da: cittadino - Luglio 12, 2014, 09:32:47 am
Ciao a tutti,
ho riscontato un funzionamento "anomalo" di una applicazione quando viene utilizzata la procedura OnAdvancedCustomDrawItem per colorare ogni singolo ListItem con:
 
ListView1.Canvas.Brush.Color :=Random(num Hex)

Infatti una volta  colorati i ListItem, se ridimensiono la form, i colori vengono "aggiornati"; è come se la proc.  OnAdvancedCustomDrawItem venisse richiamata!!

Qualcuno conosce il perchè?

saluti
Titolo: Re:ListView: colore degli item- anomalia
Inserito da: Legolas - Luglio 12, 2014, 11:25:16 am
Hai la listview allineata al form? In questo caso, ridimensionando il form si ridimensiona anche la listview e viene ridisegnata
Titolo: Re:ListView: colore degli item- anomalia
Inserito da: cittadino - Luglio 13, 2014, 08:13:40 pm
Domanda: anche se la Listview viene ridisegnata, non dovrebbe esser fatto rispettando i colori di partenza dei singoli Items?

Anche se imposto nella procedura OnCustomDrawItem:

Sender.Canvas.Brus.Color:=colore_listView;

ove colore_listView è una variabile che il cui valore lo scelgo ad esempio con due Buttons, (un button per un valore ad es. clSkyblue, e l'altro per clRed), ogni volta che sposto la form (o la spaziatura delle colonne della ListView), mi ridisegna TUTTA la ListView con l'ultimo colore dell'items aggiunto!

Come posso risolvere?

ps: a me sembra un Bug del compilatore...
Titolo: Re:ListView: colore degli item- anomalia
Inserito da: Legolas - Luglio 13, 2014, 08:47:03 pm
In effetti no, perché OnCustomDrawItem viene chiamata ogni volta che un item ha bisogno di essere ridisegnata (tipo quando ridimensioni il form). Nel tuo primo caso, ad ogni ridisegno di ogni singolo item viene assegnato un colore random, quindi il fatto che i colori cambino è del tutto normale; la stessa cosa nel tuo secondo caso, dove assegni ad ogni item ridisegnata lo stesso colore.

Il problema è che la listview non ha un canvas per ogni singolo item della lista, ma devi cambiare il colore del canvas della listview a seconda dell'item. In pratica una cosa del tipo:

Codice: delphi [Seleziona]

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  with ListView1.Canvas.Brush do
  begin
    case Item.Index of
        0: Color := $FF0000;
        1: Color := $00FF00;
        2: Color := $0000FF;
    end;
  end;
end; 
Titolo: Re:ListView: colore degli item- anomalia
Inserito da: cittadino - Luglio 14, 2014, 08:39:02 am
Ok, adesso è tutto più chiaro.
Certo che non rende la vita facile il fatto che cambiare il colore di un singolo Item, comporta la necessità di ridisegnare la ListView, ovvero di dover riassegnare i colori !
grazie cmq