AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular mit TAnimate - separater Thread

Ein Thema von mm1256 · begonnen am 15. Apr 2015 · letzter Beitrag vom 15. Apr 2015
Antwort Antwort
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 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 PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Formular mit TAnimate - separater Thread

  Alt 15. Apr 2015, 14:48
VCL-Form in einem Thread?

Garnicht!
$2B or not $2B
  Mit Zitat antworten Zitat
mm1256

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

AW: Formular mit TAnimate - separater Thread

  Alt 15. Apr 2015, 15:06
Danke himitsu. Hab's mir fast schon gedacht. Gibt's keinen "Trick" das mit einer DLL zu machen?
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Formular mit TAnimate - separater Thread

  Alt 15. Apr 2015, 15:08
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

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

AW: Formular mit TAnimate - separater Thread

  Alt 15. Apr 2015, 15:47
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".
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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