Ist doch ganz "einfach":
Delphi-Quellcode:
type
TFormHelper = class helper for TForm
procedure PaintRects(const UpdateRects: array of TRectF);
end;
procedure TFormHelper.PaintRects(const UpdateRects: array of TRectF);
begin
inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Time: Cardinal;
begin
AniIndicator1.Visible:=true;
AniIndicator1.Enabled:=true;
try
Time:=TThread.GetTickCount;
while TThread.GetTickCount-Time<=5000 do //<- 5 Sekunden Blockierung des Hauptthreads
begin
Sleep(100);
if Assigned(AniThread)
then AniThread.OnTimer(nil); //<- Animation(en) am Leben erhalten
PaintRects([AniIndicator1.ParentedRect]); //<- Indikator neu darstellen
end;
finally
AniIndicator1.Visible:=false;
AniIndicator1.Enabled:=false;
end;
end;
Natürlich ist wieder alles so verpackt (im Implementationteil deklarierte Objekte, im protected-Abschnitt versteckte Methoden), daß man auf "normalem" Weg nicht richtig herankommt. Und
(T)AniThread ist unter Windows selbstverständlich kein Thread (wäre ja auch sehr naiv, so etwas aus dem Namen zu schlußfolgern), sondern ein normaler Timer, der logischerweise nicht funktioniert, wenn die Nachrichtenschleife blockiert ist.
Wenn ich dann so was
Delphi-Quellcode:
destructor TAniIndicator.Destroy;
begin
if Assigned(FFill) then
FreeAndNil(FFill);
inherited;
end;
und so was
Delphi-Quellcode:
var
[...]
AniThread: TTimer;
sehe, weiß ich wieder, wo das durchdachte Design herkommt...