Zwischendurch habe ich gedacht, es würde funktionieren, wenn ich ein TBitmap ohne TImage erzeuge, und dieses mit Form.Canvas.Draw direkt auf das Form zeichne. Aber auch das funktioniert nur einmal und aktualisiert dann nicht mehr.
Also habe ich weiter verfolgt, was beim Draw Passiert. Jede Menge administratives Zeug und letztendlich der Aufruf von Windows.BitBlt. Also habe ich das versucht und es gibt immer noch das gleiche Ergebnis: Einmaliges Update.
Mit dem BitBlt habe ich gelernt, dass TBitmap selbst ein TCanvas besitzt und dieses Canvas auf die Ziel-Canvas kopiert wird. Also habe ich mal versucht, nicht nur die Scanlines mit Daten zu füllen, sondern auf dem TBitmap.Canvas etwas zu zeichnen. Und siehe da: DIESE Änderungen werden tatsächlich aktualisiert dargestellt. Es muss also daran liegen, dass das TBitmap die Informationen aus den Scanlines nicht auf das eigene Canvas überträgt. Folgender Beispielcode ändert sowohl die Scanlines und malt ein sich änderndes Rechteck. Selbst wenn die Random jedes Mal die gleichen Daten liefern würden, müssten sie hinter dem Rechteck wieder zum Vorschein kommen, da sie jedes Mal wieder neu in die Scanlines kopiert werden. Das Rechteck wächst aber...
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
B:=TBitmap.Create;
B.Width:=320;
B.Height:=240;
B.PixelFormat:=pf24Bit;
Counter:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var x,y,w,h : Integer;
Line : Array of Record b,g,r : Byte;end;
begin
Counter:=Counter+1;
w:=B.Width;
h:=B.Height;
SetLength(Line,W);
for y := 0 to H-1 do begin
for x := 0 to W-1 do begin
Line[x].r:=Random($FF);
Line[x].g:=Random($FF);
Line[x].b:=Random($FF);
end;
Move(Line[0],B.ScanLine[y]^,3*W);
end;
SetLength(Line,0);
B.Canvas.FillRect(10,10,20+Counter,20);
Canvas.Draw(0,0,B); //die gleiche Wirkung hat...
// BitBlt(Canvas.Handle, 0, 0, W, H, B.Canvas.Handle, 0, 0, SRCCOPY);
end;