![]() |
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:
Die Frage ist also, wie baue ich die 3 Schnittstellen-Routinen in einen Thread ein? Vielen Dank schon mal vorab für eure Hilfe.
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. |
AW: Formular mit TAnimate - separater Thread
VCL-Form in einem Thread?
Garnicht! |
AW: Formular mit TAnimate - separater Thread
Danke himitsu. Hab's mir fast schon gedacht. Gibt's keinen "Trick" das mit einer DLL zu machen?
|
AW: Formular mit TAnimate - separater Thread
Zitat:
Führe die Arbeit in einem separaten Thread aus und nicht das UserInterface. |
AW: Formular mit TAnimate - separater Thread
Zitat:
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 21:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz