Schön, aber sx2008 hat Recht.
Im OnPaint-Event sollte man keine Größenänderung durchführen und keine Neuzeichnung initiieren.
Falls PaintPaintBox Deine OnPaint-Behandlung ist, dann solltest Du das nochmal überarbeiten.
Das mag ja sein, aber wenn ich das obige Programmstück so modifiziere, tritt der beschriebene Effekt ebenfalls auf (PaintPaintbox ist jetzt die OnPaint-Routine):
Delphi-Quellcode:
procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pt: TPoint;
begin
Randomize();
fSize.cx := RandomRange(4000, 5000);
fSize.cy := RandomRange(4000, 5000);
pt.X := 0; pt.Y := 0;
pt := PaintBox1.ClientToParent(pt, nil);
//PaintBox1.SetBounds(pt.x, pt.y, pt.x + fSize.cx, pt.y + fSize.cy);
PaintBox1.SetBounds(0, 0, pt.x + fSize.cx, pt.y + fSize.cy);
Invalidate();
end;
procedure TForm1.PaintPaintBox(Sender: TObject);
var
x, y: Integer;
s:String;
begin
PaintBox1.canvas.Font.Height := 14;
y := 0;
while y < fSize.cy do begin
x := 0;
while x < fSize.cx do begin
s := Format('(%d, %d)', [x, y]);
PaintBox1.canvas.TextOut(x, y, s);
x := x + 200;
end;
y := y + 100;
end;
end;
Wenn die andere SetBounds-Zeile aktiviert wird, ist alles ok (*), in dieser Variante beginnt die Ausgabe mitten im Dokument. Das "Programm" besteht aus nicht mehr als den geposteten beiden Methoden.
(*) Das Dokument sollte nach SetBounds in beiden Richtungen eine Größe von 4000-5000 Pixeln haben, tatsächlich ist die letzte Ausgabe aber immer (1800, 1400), der Bereich außerhalb von ca. 2000,1500 ist grau.
Any Idea?
Gruß, Mikkey