AGB  ·  Datenschutz  ·  Impressum  







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

Progress Form/Dialog VCL

Ein Thema von lxo · begonnen am 28. Sep 2018 · letzter Beitrag vom 2. Okt 2018
Antwort Antwort
Seite 2 von 2     12   
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#11

AW: Progress Form/Dialog VCL

  Alt 1. Okt 2018, 09:13
Je öfter ich Application.ProcessMessages auslöse umso langsamer wird der Import.
Eine Möglichkeit wäre, vor einem Aufruf von Application.ProcessMessages zu prüfen, wie lange der letzte Aufruf her ist. Erst dann, wenn das vor mehr als z.B. 100 ms war, wird dann Application.ProcessMessages aufgerufen:

Delphi-Quellcode:
var
  LastCall: Int64;
  ThisCall: Int64;

[...]
  ThisCall := GetTickCount;
  if (ThisCall - LastCall > 100) or (LastCall > ThisCall) then begin
    Application.ProcessMessage;
    LastCall := ThisCall;
  end;
Also das ist ja echt simpel und funktioniert richtig gut.
Danke für den Tipp, ich denke ich werde es erstmal so anwenden und schaue mir später genau an wie ich das mit einem Thread lösen kann.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.603 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#12

AW: Progress Form/Dialog VCL

  Alt 1. Okt 2018, 09:52
Je öfter ich Application.ProcessMessages auslöse umso langsamer wird der Import.
Eine Möglichkeit wäre, vor einem Aufruf von Application.ProcessMessages zu prüfen, wie lange der letzte Aufruf her ist. Erst dann, wenn das vor mehr als z.B. 100 ms war, wird dann Application.ProcessMessages aufgerufen:
Also das ist ja echt simpel und funktioniert richtig gut.
Danke für den Tipp
Hier ist noch mein etwas ausführlicherer Blogpost (von Samstag) dazu:

https://blog.dummzeuch.de/2018/09/29...elphi-program/
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Progress Form/Dialog VCL

  Alt 1. Okt 2018, 10:42
Im Anhang hatte ich mal den Progress-Dialog von Windows gekapselt. Vielleicht ist der ja was für dich.
Habe mal zugegriffen aber noch nicht reingeschaut, Danke fürs hochladen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#14

AW: Progress Form/Dialog VCL

  Alt 2. Okt 2018, 07:57
Ich bastel gleich mal eine Demo. Die Profis werden mich für den Code vermutlich zerreißen. Aber das ist das Resultat aus verschiedensten Empfehlungen.
Demo kommt gleich.

Hauptunit
Delphi-Quellcode:
type
 TForm1 ...
 private
  ...
  ProgressThread: TProgressThread;
 public
  ...
  procedure WndProc(var msg: TMessage); override;
 end;

const
 WM_PROGRESS_SET = WM_USER + 1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var msg: TMessage);
begin
 inherited;

 case msg.msg of
  WM_PROGRESS_SET:
   begin
    ProgressBar1.Position := msg.WParam;
   end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ProgressBar1.Max := 1000;
 ProgressThread := TProgressThread.Create(Form1.Handle);
end;
Thread
Delphi-Quellcode:
unit uProgressThread;

interface

uses
 Winapi.Windows, System.Classes;

type
 TProgressThread = class(TThread)
 protected
 var
  DestinationWindowHandle: THandle;
 private
  {Private-Deklarationen}
 protected
  procedure Execute; override;
 public
  constructor Create(const DestinationWindowHandle: THandle);
 end;

implementation

uses Unit1;

{TProgressThread}

constructor TProgressThread.Create(const DestinationWindowHandle: THandle);
begin
 inherited Create;

 Self.DestinationWindowHandle := DestinationWindowHandle;
end;

procedure TProgressThread.Execute;
var
 i: Integer;
begin
 for i := 0 to 1000 do
  begin
   if Terminated then
    Break;

   PostMessage(DestinationWindowHandle, WM_PROGRESS_SET, i, 0);

   Sleep(25);
  end;
end;

end.
Das ist jetzt einfach nur schnell hingeschrieben. Die Kernfunktionalität (WndProc, PostMessage, Thread), sollte aber klar sein.
Sollte es nicht möglich sein, dem Thread die Methode zum importieren als Event mitzugeben?
Und das die Progressbar bei längeren Aktionen wie langsamen SQLs weiterhin die Progressbar aktualisiert wird z.B. in Marquee-Style ?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#15

AW: Progress Form/Dialog VCL

  Alt 2. Okt 2018, 09:14
Mein Beispiel sollte wie gesagt nur WndProc und PostMessage veranschaulichen.
Wie man was nun weiter ausbaut usw muss jeder selber wissen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 05:41 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