Einzelnen Beitrag anzeigen

Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#175

AW: FireMonkey Sammelthread

  Alt 11. Jul 2013, 05:05
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...
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (11. Jul 2013 um 12:00 Uhr)
  Mit Zitat antworten Zitat