Hallo!
Ich habe eine von TStringGrid abgeleitete Komponente die einen Haufen zusätzlicher Funktionalität mitbringt (farbige Zellen, Textausrichtung etc.). Die Komponente überschreibt die Paint()-Funktion von TStringGrid und hängt sich selbst da dran. Funktioniert alles ganz toll.
Nur flimmter es sehr stark bei größeren Datenmengen oder bei Größenänderung. Um dieses Flimmern abzustellen, ist mir die Idee gekommen, das ganze erstmal offscreen zu zeichnen und dann nur das fertige Bild auf den Bildschrim zu kopieren. Nur hab ich keine Ahnung, wie ich das in Code fassen kann.
Prinzipiell schwebt mir sowas vor:
Delphi-Quellcode:
procedure TMeinStringGrid.Paint();
var
pCanvasAdresse: Pointer{?};
begin
pCanvasAdresse := @Canvas;
@Canvas := @MeinOffscreenCanvas;
inherited;
{ ...eigener Code... }
@Canvas := pCanvasAdresse;
Canvas.CopyRect(MeinOffscreenCanvas);
end;
Das soll also der Versuch sein, dem TStringGrid einen anderen Canvas unterzuschieben, etwa indem die Adresse des Canvas auf den OffscreenCanvas umgebogen wird. Anschließend wird der Canvas wieder auf die Original-Adresse gesetzt und der Inhalt des Offscreens kopiert.
Nur geht das so einfach nicht (ganz abgesehen davon, dass ich kP hab, welche Zeigeroperatoren ich verwenden muss). Dazu ist TStringGrid.Canvas auch noch eine Read-Only-Property...
Wie könnte man das also bewerkstelligen?
Oder gibt es eine andere Möglichkeit, das StringGrid flimmerfrei zu zeichnen?
Grüße
Ganymed