Einzelnen Beitrag anzeigen

mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Formular mit TAnimate - separater Thread

  Alt 15. Apr 2015, 14:10
Hallo,

ich habe ein simples Formular mit einem TAnimate drauf, das ich zur Anzeige benutze, wenn längere (Datenbank-)Operationen laufen. Prinzipiell funktioniert das auch, das Problem ist nur, dass die Animation (CommonAVI := aviCopyFiles) zwar angezeigt wird, aber ohne dieses Application.ProcessMessages-Gedöns nicht abläuft.

Die Ursache ist mir auch klar: Das Formular bekommt zu wenig CPU-Zeit. Die Lösung ist mir auch klar: Das Formular muss in einen eigenen Thread.

Mit Threads stehe ich ein bischen auf dem Kriegsfuß, und die Beispiele die ich im WEB gefunden habe, passen irgendwie nicht. Hier mal die komplette Unit.

Delphi-Quellcode:
unit RuAnimate;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ShellAnimations,
  Vcl.ExtCtrls;

type
  TFrmRuAnimate = class(TForm)
    ShellResources1: TShellResources;
    Panel1: TPanel;
    Animate1: TAnimate;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure RuAnimate_Open(ACaption: string);
function RuAnimate_Update(ACaption: string): boolean;
procedure RuAnimate_Close;


implementation

{$R *.dfm}

procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall; external user32 Name 'SwitchToThisWindow';

procedure RuAnimate_Open(ACaption: string);
begin
  if not RuAnimate_Update(ACaption)
  then with TFrmRuAnimate.Create(Application) do begin
    Caption := ACaption;
    Show;
  end;
  Application.ProcessMessages;
end;

function RuAnimate_Update(ACaption: string): boolean;
var
  HandleFrmRuAnimate: THandle;
begin
  HandleFrmRuAnimate := FindWindow(PChar('TFrmRuAnimate'),nil);
  Result := HandleFrmRuAnimate > 0;
  if Result then begin
    if IsIconic(HandleFrmRuAnimate) then SendMessage(HandleFrmRuAnimate, WM_SYSCOMMAND, SC_RESTORE, 0 );
    SwitchToThisWindow(HandleFrmRuAnimate, TRUE);
    SetForegroundWindow(HandleFrmRuAnimate);
    SendMessage (HandleFrmRuAnimate, WM_SETTEXT, 255, Integer(PChar(ACaption)));
  end;
  Application.ProcessMessages;
end;

procedure RuAnimate_Close;
var
  HandleFrmRuAnimate: THandle;
begin
  HandleFrmRuAnimate := FindWindow(PChar('TFrmRuAnimate'),nil);
  if HandleFrmRuAnimate > 0 then SendMessage (HandleFrmRuAnimate, WM_CLOSE,0,0);
  Application.ProcessMessages;
end;

procedure TFrmRuAnimate.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.
Die Frage ist also, wie baue ich die 3 Schnittstellen-Routinen in einen Thread ein? Vielen Dank schon mal vorab für eure Hilfe.
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat