Weiß einer wieso Shapes so langsam sind? Wenn ich 80 Shapes auf dem Formular bewege, dann ruckelt es schon ziemlich stark. Wer es sehen will, der kann das Beispiel am Ende ausprobieren. Da bin ich schneller wenn ich auf Canvas zeichne. Die Frage die mich interresiert ist, ob pro Shape-Änderung das ganze Formular neu gezeichnet wird. Anders kann ich mir das nicht vorstellen. Wird also nur der kleine Bereich um die Änderung neu gezeichnet oder 80 mal das Formular?
Wer es mal teste will, hier ein schnellgemachtes Beispiel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| implementation
{$R *.DFM}
type TSh = record Shape: TShape; xr: Integer; yr: Integer; end;
var Sh: array[0..150] of TSh;
procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin HorzScrollBar.Visible := False; VertScrollBar.Visible := False;
for i := Low(Sh) to High(Sh) do with Sh[i] do begin Shape := TShape.Create(self); Shape.Parent := self; Shape.Shape := stCircle; Shape.Width := 5; Shape.Height := 5; xr := Random(16); yr := Random(16); end;
Timer1.Interval := 100; end;
procedure TForm1.Timer1Timer(Sender: TObject); var i: Integer; r: TRect; rw, rh: Integer; begin r := Canvas.ClipRect; rw := r.Right - r.Left; rh := r.Bottom - r.Top;
for i := Low(Sh) to High(Sh) do with Sh[i] do begin Shape.Left := Shape.Left - xr; Shape.Top := Shape.Top - yr;
if (Shape.Left < 0) or ((Shape.Left + 5) > rw) then xr := -xr; if (Shape.Top < 0) or ((Shape.Top + 5) > rh) then yr := -yr; end; end; |