AGB  ·  Datenschutz  ·  Impressum  







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

"Bitte warten"-Formular korrekt anzeigen

Ein Thema von TheMiller · begonnen am 24. Aug 2010 · letzter Beitrag vom 26. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

"Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 15:07
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
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 16:59
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
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 17:03
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
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 10. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#4

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 18:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#5

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 18:12
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 18:15
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.
Andreas
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 19:47
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.

Geändert von Satty67 (24. Aug 2010 um 19:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 24. Aug 2010, 22:11
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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 25. Aug 2010, 06:52
Hallo,

siehe auch

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

Thread #7


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#10

AW: "Bitte warten"-Formular korrekt anzeigen

  Alt 25. Aug 2010, 10:05
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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:00 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