Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Formular mit TAnimate - separater Thread (https://www.delphipraxis.net/184700-formular-mit-tanimate-separater-thread.html)

mm1256 15. Apr 2015 13:10

Formular mit TAnimate - separater Thread
 
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.

himitsu 15. Apr 2015 13:48

AW: Formular mit TAnimate - separater Thread
 
VCL-Form in einem Thread?

Garnicht!

mm1256 15. Apr 2015 14:06

AW: Formular mit TAnimate - separater Thread
 
Danke himitsu. Hab's mir fast schon gedacht. Gibt's keinen "Trick" das mit einer DLL zu machen?

Sir Rufo 15. Apr 2015 14:08

AW: Formular mit TAnimate - separater Thread
 
Zitat:

Zitat von mm1256 (Beitrag 1297860)
Danke himitsu. Hab's mir fast schon gedacht. Gibt's keinen "Trick" das mit einer DLL zu machen?

Es gibt einen Trick:

Führe die Arbeit in einem separaten Thread aus und nicht das UserInterface.

mm1256 15. Apr 2015 14:47

AW: Formular mit TAnimate - separater Thread
 
Zitat:

Zitat von Sir Rufo (Beitrag 1297862)
Führe die Arbeit in einem separaten Thread aus und nicht das UserInterface.

Danke für den Tipp! Daran hab ich natürlich als Erstes gedacht, aber es geht überwiegend um (Datenbank-)Operationen. Komm ich ja vom Regen in die Traufe zwecks separater DB-Connection für den Thread usw.

Den Aufwand wollte ich mir eigentlich sparen. Aber, hilft ja nix wie's scheint. Ich glaub die Nordlichter sagen dazu "wat mut det mut".


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz