Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   "Unendlicher Progressbar" (https://www.delphipraxis.net/204857-unendlicher-progressbar.html)

Uwe Raabe 8. Jul 2020 15:26

AW: "Unendlicher Progressbar"
 
Sowohl die TProgressBar im Marquee-Mode als auch der TActivityInidicator arbeiten timer-basiert. Simples Invalidate/Update/Repaint funktioniert da leider nicht.

Ich plädiere für ein simples Bitte warten... Fenster oder ein Splash-Form ohne viel Drumherum.

bcvs 8. Jul 2020 16:05

AW: "Unendlicher Progressbar"
 
Ich mache so etwas hiermit:
http://www.delphifaq.com/faq/f382.shtml

Benmik 8. Jul 2020 22:30

AW: "Unendlicher Progressbar"
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1469128)
Ich plädiere für ein simples Bitte warten... Fenster oder ein Splash-Form ohne viel Drumherum.

Als Anwender finde ich das nicht so gut. Bei länger dauernden Prozessen fragt sich der Anwender ja immer, ob das Programm nicht hängt, was es nicht selten ja wirklich tut. Zum anderen möchte er irgendeine Information. Ich zeige immer die Anzahl der Verarbeitungen an. Oft hat der Anwender eine Vorstellung davon, wieviele das ungefähr sind (zum Beispiel von vorangegangenen Läufen). Dann hat er auch mehr Chancen zu merken, wenn etwas nicht stimmt. Nichts ist schlimmer als minutenlang auf "Bitte warten..." oder eine Animation zu gucken und keine Ahnung zu haben, ob es sinnvoll ist, noch weiter zu warten.

Uwe Raabe 8. Jul 2020 22:35

AW: "Unendlicher Progressbar"
 
Man kann auf dem Splash-Screen ja auch den aktuellen Bearbeitungsfortschritt als Text in einem Label darstellen. Das reagiert dann in der Regel auch auf ein Refresh.

skoschke 9. Jul 2020 06:43

AW: "Unendlicher Progressbar"
 
Ich glaube das letzte ist der richtige Ansatz, da das Label ja sofort wenn gewünscht neuzeichnet könnte man da mit
Bitte warten .
Bitte warten ..
Bitte warten ...
Bitte warten .
Bitte warten ..
Bitte warten ...
dessen Caption per Thread aktualisieren?

Ciao
Stefan

TigerLilly 9. Jul 2020 07:56

AW: "Unendlicher Progressbar"
 
Ja. Und wenn du informativere Infos ausgibst, wird es noch schöner:

. . .
Labels erzeugt
Daten der Labels geladen
Edits erzeugt
Daten der Edits geladen
Grids erzeugt
Daten der Grids geladen
. . .

etc.

Uwe Raabe 9. Jul 2020 08:13

AW: "Unendlicher Progressbar"
 
Als Beispiel könnte der Splash-Screen der IDE dienen, die ja auch im unteren Bereich ihre Aktivitäten mitteilt.

skoschke 9. Jul 2020 11:59

AW: "Unendlicher Progressbar"
 
Ich habe das nun versucht, umzusetzen, aber irgendwie wird der Thread (und dessen Labelaktualisierung) vom HauptThread und der dort stattfindenden Control-Erzeugung blockiert...

Erst wenn im Mainthread alles abgelaufen ist, wird das Label im Thread aktualisiert!

Irgendwas läuft da schief!

Ciao
Stefan

haentschman 9. Jul 2020 12:10

AW: "Unendlicher Progressbar"
 
Zeig Mal...:P

skoschke 9. Jul 2020 12:27

AW: "Unendlicher Progressbar"
 
Hier der Thread:
Delphi-Quellcode:
unit ThreadProgress;

interface

uses
  Classes, Sysutils, VCL.Dialogs, VCL.Forms, VCL.ComCtrls, VCL.ExtCtrls,
  VCL.Controls;

var
  ShowProgress: boolean;

type
  TProgressThread = class(TThread)
    constructor Create;
    destructor Destroy; override;
  private
    SplashForm: TForm;
    ProgressRand: TPanel;
    sb, sh: integer;
    step: integer;
  protected
    procedure Execute(); override;
  public
  end;

var
  Thread_Progress: TProgressThread;

implementation

constructor TProgressThread.Create;
begin
  FreeOnTerminate := True;
  // Suspended starten
  inherited Create(True);
  ShowProgress := True;
  SplashForm := TForm.Create(nil);
  sb := 200;
  sh := 50;
  step := 0;
  SplashForm.Width := sb;
  SplashForm.Height := sh;
  SplashForm.BorderStyle := bsNone;
  ProgressRand := TPanel.Create(SplashForm);
  ProgressRand.Margins.Left := 5;
  ProgressRand.Margins.Top := 5;
  ProgressRand.Margins.Right := 5;
  ProgressRand.Margins.Bottom := 5;
  ProgressRand.AlignWithMargins := True;
  ProgressRand.Parent := SplashForm;
  ProgressRand.Caption := 'Bitte warten';
  ProgressRand.ShowCaption := True;
  ProgressRand.Align := alClient;
  ProgressRand.BorderStyle := bsSingle;
  ProgressRand.BevelOuter := bvNone;
  ProgressRand.StyleElements := [];
  SplashForm.Position := poMainFormCenter;
  SplashForm.Visible := True;
  SplashForm.BringToFront;
end;

destructor TProgressThread.Destroy;
begin
  // globale Variable rücksetzen
  Thread_Progress := nil;
  inherited;
end;

procedure TProgressThread.Execute;
begin
  while ShowProgress do
  begin
    SplashForm.BringToFront;
    inc(step);
    if step = 5 then
      step := 0;
    ProgressRand.Caption := 'Bitte warten' + StringOfChar('.', step);
    Application.ProcessMessages;
    sleep(500);
  end;
end;

end.
Den starte ich jetzt testweise bereits im MainForm.Create.
Delphi-Quellcode:
 
  Thread_Progress := TProgressThread.Create;
  Thread_Progress.Start;
Das Fensterchen erscheint und die Caption läuft wie gewünscht.
Wird nun im Hauptprogramm der zeitintensive Erzeugungsteil gestartet, bleibt der Splashscreen stehen!

Was habe ich übersehen?

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 Uhr.
Seite 2 von 6     12 34     Letzte »    

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