Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Delphi "Bitte warten"-Formular korrekt anzeigen (https://www.delphipraxis.net/154000-bitte-warten-formular-korrekt-anzeigen.html)

TheMiller 24. Aug 2010 15:07

"Bitte warten"-Formular korrekt anzeigen
 
Hallo,

in meinem mittlerweile recht großen Programm gibt es verschiedene Aktionen, die länger dauern. Um dem Benutzer nun zu signalisieren, dass das Programm etwas arbeitet und nicht rumhängt (;)) habe ich ein Formular erstellt mit einer Progressbar, Maqueebar und einem Aktions-Label. Je nach Aktion wird die Marquee- oder Progressbar angezeigt.

Das Form wird dynamisch erstellt und freigegeben. Damit es sich aber neuzeichnet müsste ich es eigentlich in einem gesonderten Thread erstellen. Nun ist das aber wegen der Synchronisierung nicht so einfach. Wie muss ich die Sache angehen?

Kann ich in einem Thread das Formular erstellen lassen, wenn ich eine Methode synchronisiert aufrufe? Also, ist das der richtige Weg, damit das Formular "parallel" zu der Hintergrundaktion läuft?

Mein Code sieht - ohne Thread - bisher so aus (recht simpel)

Delphi-Quellcode:
var
  ...
  frmWait: TfrmWarten;
begin
  frmWait:=TfrmWarten.Create(nil);
  try
    frmWait.FormStyle:=fsStayOnTop;
    frmWait.ShowMarqueeBar(True);
    frmWait.Show;
    frmWait.Repaint;
    //Aktionen, die viel Zeit brauchen
    ...
    ...
    ...
  finally
    FreeAndNil(frmWait);
  end;
end;
Danke im Voraus

taveuni 24. Aug 2010 16:59

AW: "Bitte warten"-Formular korrekt anzeigen
 
Zitat:

Zitat von DJ-SPM (Beitrag 1044585)
Hallo,
gibt es verschiedene Aktionen, die länger dauern. Um dem Benutzer nun zu signalisieren, dass das Programm etwas arbeitet und nicht rumhängt (;))
habe ich ein Formular erstellt mit einer Progressbar, Maqueebar und einem Aktions-Label. Je nach Aktion wird die Marquee- oder Progressbar angezeigt.

Meiner Meinung nach wäre es sinnvoller diese länger dauernden Aktionen
in einen Thread zu schieben und den Benutzer weiter arbeiten zu lassen.
Als den Thread zu missbrauchen nichts zu tun und eine VCL Komponente zu aktualisieren :shock:

TheMiller 24. Aug 2010 17:03

AW: "Bitte warten"-Formular korrekt anzeigen
 
An sich richtig. Nur während dieser Aktionen soll der Benutzer nicht weiterarbeiten dürfen. Es geht um Dinge wie Backups/Sicherung der Datenbank, Hinzufügen von Dateianhängen in die Datenbank etc.

Bei diesen Aktionen habe ich Angst, dass etwas schief geht. Deswegen lieber dem Benutzer verweigern, etwas anderes nebenher mit der Datenbank zu machen. Oder :?:

Björn Ole 24. Aug 2010 18:06

AW: "Bitte warten"-Formular korrekt anzeigen
 
Zeig doch dein Warte-Formular mittels ShowModal an. Zusätzlich müsstest du nur noch das Schließen verhindern, solang der Thread läuft, z.B. im OnCloseQuery Event.

rollstuhlfahrer 24. Aug 2010 18:12

AW: "Bitte warten"-Formular korrekt anzeigen
 
oder kann man nicht das "Bitte Warten"-Fenster per nonVCL erzeugen und in einem Extra-Thread ausführen? - so kann die aktuelle Programmstruktur bestehen bleiben.

Bernhard

shmia 24. Aug 2010 18:15

AW: "Bitte warten"-Formular korrekt anzeigen
 
Mach's doch so:
Delphi-Quellcode:
var
  ...
  frmWait: TfrmWarten;
begin
  frmWait:=TfrmWarten.Create(nil);
  try
    //frmWait.FormStyle:=fsStayOnTop; // lieber nicht-das ist zu "agressiv" für den Benutzer
    frmWait.ShowMarqueeBar(True);
    frmWait.Show;
    //Aktionen, die viel Zeit brauchen
    frmWait.AddMessage('Datenbank wird überprüft...');
    ... // arbeiten
    frmWait.AddMessage('Index neu anlegen...');
    ...
    frmWait.AddMessage('Fertig');
    frmWait.Finish;
  finally
    frmWait.Free;
  end;
end;
Die Methode AddMessage() ruft intern immer auch noch BringToFront auf, damit das "Warten"-Formular nicht permanent hinter dem Hautpformular verschwindet.

Die Methode Finish sieht so aus:
Delphi-Quellcode:
procedure TfrmWarten.Finish;
begin
   PlaySound('RingIn', 0, SND_ALIAS);
   Cursor := crDefault;
   Hide;
   BtnClose.Visible := True; // Schliesen-Button einblenden
   ShowModal;
end;
Somit muss der Benutzer das Fenster zum Schluss schliesen.
Grund: er soll die Gelegenheit haben die Meldungen zu lesen.

Satty67 24. Aug 2010 19:47

AW: "Bitte warten"-Formular korrekt anzeigen
 
Ich weis nicht ob das evtl. etwas "schmutzig" ist...

...das aufgerufene modale fenster hat eine property für eine "Arbeits-Methode", vergleichbar mit einem Event-Handler.

Das "Bitte warten" Fenster mit Progressbar ist wie folgt ausgestattet:
Delphi-Quellcode:
type
  TWorkerMethode = procedure (Sender : TObject; AProgressBar : TProgressBar) of object;

  TFormWorkProgress = class(TForm)
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    FWorkerMethode : TWorkerMethode;
  public
    { Public-Deklarationen }
    property WorkerMethode : TWorkerMethode read FWorkerMethode write FWorkerMethode;
  end;

var
  FormWorkProgress: TFormWorkProgress;

implementation

{$R *.dfm}

procedure TFormWorkProgress.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  if assigned(FWorkerMethode) then
    FWorkerMethode(self, ProgressBar1);
end;
Das Hauptformular mit der Arbeits-Procedure so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  FormWorkProgress : TFormWorkProgress;
begin
  FormWorkProgress := TFormWorkProgress.Create(Application);
  try
     FormWorkProgress.WorkerMethode := Worker;
     FormWorkProgress.ShowModal;
  finally
    FormWorkProgress.Free;
  end;
end;

procedure TForm1.Worker(Sender : TObject; AProgressBar : TProgressBar);
var
  i : Integer;
begin
  for i := 1 to 100 do
  begin
    AProgressBar.Position := i;
    Sleep(100);
    Application.ProcessMessages;
  end;
  (Sender as TForm).Close;
end;
Nur ganz grob... etwas Feintunig ist da noch nötig... das modale Fenster ist etwas blockiert. Evtl. das Close aus dem Timer raus (kann ja der Worker aufrufen, er hat ja den Sender)

€: Etwas angepasst, jetzt stellt sich die App nicht mehr Tod.

Luckie 24. Aug 2010 22:11

AW: "Bitte warten"-Formular korrekt anzeigen
 
Hier noch mal zwei Links mit Hintergrundinformationen:
The correct order for disabling and enabling windows
Be careful that your splash screen doesn't squander the foreground love

hoika 25. Aug 2010 06:52

AW: "Bitte warten"-Formular korrekt anzeigen
 
Hallo,

siehe auch

http://www.delphipraxis.net/79498-ic...showmodal.html

Thread #7


Heiko

TheMiller 25. Aug 2010 10:05

AW: "Bitte warten"-Formular korrekt anzeigen
 
Vielen Dank für die vielen Antworten. Leider komme ich heute und morgen vllt auch nicht dazu, diese auszuprobieren. Ich melde mich wieder, wenn ich weiterarbeiten konnte.

Danke sehr!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 Uhr.
Seite 1 von 2  1 2      

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