Newsgroup: it.comp.lang.delphi
Titolo: Evitare il flickering di un TImage

Ciao a tutti,
Creando una serie di TImage a runtime e disegnandoci sopra mi trovo un
fastidioso "flickering" delle immagini.
Esempio:
Se faccio
Img.Canvas.Ellipse(Rect(X, Y, BOX_DIM_X-1+X, Y+BOX_DIM_X-1));
noto che viene ridisegnato tutto il bitmap con evidente sfarfallio ...
C'e' un modo per evitare tutto cio' ?
Grazie.
X

vedi se può esserti utile in qualche modo:
Adding the csOpaque flag to the ControlStyle of the component
should eliminate the repainting of the component's background.
Example:
constructor TMyControl.Create;
begin
   inherited;
   ControlStyle := ControlStyle + [csOpaque];
end;
--
Max Etere
massimili...@programmando.org
http://www.programmando.org

end;
Ciao,
ho provato ma il flicker rimane ...
Ho provato a mettere le 2 righe sia sul form1.create che sui singoli
TImage che creo a runtime..
Magari sbaglio qualcos'altro ..
Ciao
X.

> Magari sbaglio qualcos'altro ..
no no... è più probabile che no siano valido quel codice ;)



    Via De Gasperi, 14 - 42019
    Scandiano (Reggio Emilia)

 C'e' un modo per evitare tutto cio' ?
da un vecchio messaggio del ng:
[cut]
DoubleBuffering genera una copia dell'immagine in ram prima di
ridisegnarla. Questa proprietą č disponibile per gli oggetti TWinControl
dalla versione 4 di Delphi. Puoi quindi incapsulare il tuo TImage in un
TPanel ricordandoti di abilitare DoubleBuffering nel TPanel (vedi esempio).
  TTuoPanel=class(TPanel)
  private
    { Private declarations }
  public
    { Public declarations }
   constructor Create(aOwner: TComponent); override;
  end;
  constructor TTuoPanel.Create(AOwner: TComponent);
  begin
   inherited;
   DoubleBuffered := True;
  end;
[end cut]
ciao, ciao

no no... č piů probabile che no siano valido quel codice ;)
Il fatto č che sto' girando intorno a questo problema: devo disegnare
un determinato numero di led (ipoteticamente una elisse), e poi li
devo colorare di rosso/verde/etc a seconda delle necessita'.
Ho provato con:
- Timage: flicker
- TStringGrid/TDrawGrid: ho difficolta' a disegnare quello che voglio
e quando voglio, indipendentemente dagli eventi del mouse e tastiera
potrei usare dei componenti gia' fatti, ma vorrei tenere il mio "exe"
leggero..
Ciao
X.

leggero..
Insomma, non per fare quello che si immischia nell altrui conversazioni, ma
visto che ritorna spesso il problema dell'exe gonfiato... vorrai capire come
mai questa cosa fa cosi' tanta sensazione.
Oggi come oggi, con i pc entry level che hanno 128 Mb RAM, Microprocessori dal
gigaHz in su... cosa cambia se un'exe e' da 2 Mb anziche' 5 anziche' 7... ?
E poi, non dimenticate mai l '*indispensabile* UPX, che comprime fino al 90%
(davvero!) un exe senza degradare le performances.
Ciao!
-- 
Morde. 
morde[at]programmer[.]net

Imposta a True la proprietą DoubleBuffered.

 devo colorare di rosso/verde/etc a seconda delle necessita'.
Hai provato con degli Shape? Shape.Shape = stCircle;
con il timer che segue (a 500 ms) e con ~100 led non si vede alcun
flickering.
type TLedColors = array[0..3] of TColor;
var LedColors: TLedColors = (clRed, clLime, clYellow, $00EDF3E2);
procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
  for i := 0 to ComponentCount-1 do begin
    if Components[i] is TShape then
      TShape(Components[i]).Brush.Color := LedColors[Random(4)];
  end;
end;
Saluti
Paolo Arosio

Grazie a tutti!
mi avete dato indicazioni molto interessanti.
Le sto provando per vedere quella che rende meglio per le mie
esigenze.
X.