procedure TMyGraphObject.RepaintOverlapping(item: TControl);
Der Hintergrund (Parent) wird nicht gezeichnet.
Steuerelemente die einen ItemIndex kleiner dem eigenen ItemIndex haben, werden überhaupt nicht gezeichnet.
Diese beiden Sachen sind schlecht, wenn das eigene Control zum Teil transparent ist.
Der rekursiven Aufruf kann dazu führen, daß Steuerelemente, mit einem ItemIndex größer als eigener ItemIndex + 1, mehrfach gezeichnet werden.
Besser ist es, ein ClipRect(TCanvas.ClipRect) zu setzen und wirklich nur die Steuerelemente zu zeichnen, die das ClipRect überschneiden. Damit entfällt die Rekursion.
Delphi-Quellcode:
procedure TMyGraphObject.RepaintOverlapping(AItem: TControl);
var
Dummy: TRect;
MyRgn: HRGN;
Control: TControl;
i: Integer;
begin
with AItem.Boundsrect do
MyRgn := CreateRectRgn(Left, Top, Right, Bottom);
try
SelectClipRgn(AItem.Parent.Canvas.Handle, MyRgn);
{hier Parent-Hintergrund zeichnen}
for i := 0 to AItem.Parent.ControlCount-1 do
begin
Control := AItem.Parent.Controls[i];
if (Control is TGraphicControl) and Control.Visible and
IntersectRect(Dummy, AItem.Boundsrect, Control.Boundsrect) then
begin
TMyGraphObject(Control).Paint;
end;
end;
finally
SelectClipRgn(AItem.Parent.Canvas.Handle, HRGN(nil));
DeleteObject(MyRgn);
end;
end;
200-400 Timer ?
Mal so richtig bei den Resourcen aus dem Vollen schöpfen...
Erstell dir besser eine zusätzliche Klasse mit einem Timer(im Prinzip ein
Singleton) und realisiere ein
Observer-Model.
Jede registrierte Komponente kann als Observer innerhalb des Events InvalidateRect aufrufen.
Dadurch sollte das Formular bei jedem Event nur einmal neu gezeichnet werden.