Delphi-PRAXiS

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 Fenster" anzeigen - andere Eingaben blockieren (https://www.delphipraxis.net/106835-bitte-warten-fenster-anzeigen-andere-eingaben-blockieren.html)

Ares 17. Jan 2008 13:59


"Bitte warten Fenster" anzeigen - andere Eingaben
 
Hallo!

ich habe ja eben schon in meinem anderen Thread beschrieben, dass ich in meinem Programm ein "Bitte warten Fenster" anzeigen möchte. Nachdem nun mit der Animation alles klappt bin ich auf ein weiteres Problem gestoßen.

Wenn ich das Fenster als normales Form erstelle kann ich dies zwar problemlos über dem über dem aktivem Hauptfenster anzeigen, der Benutzer könnte aber einfach in das Hauptfenster klicken, es so in den Vordergrund holen und bedienen wie er will.

Dies kann ich vermeiden in dem ich das Warten-Fenster nicht mit Show() sonder mit ShowModal() aufrufen. Dann ist das Hauptfenster solange gesperrt, wie das Warte-Fenster angezeigt wird. So soll es sein. ABER: Nun wartet das Programm so lange bis das Warte-Fenster geschlossen wird und arbeitet erst dann weiter. Während das Warte-Fenster angezeigt wird, passiert sonst nichts weiter im Programm. Das ist natürlich nicht sinn der Sache. Das Warte-Fenster soll angezeigt werden WÄHREND das Programm arbeitet...

Habt Ihr eine Idee, ich ich das ShowModal-Verhalten erhalte ohne den das das Programm damit mit der sonstigen Arbeit aufhört?

Besten Dank
Ares

b1zZ 17. Jan 2008 14:02

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Du könntest zB. statt einer Form einfach ein Panel einblenden, und die Maus in diesem Panel solange "gefangen" halten bis das Programm geladen/feritg ist. In diese Richtung hätte ich es zumindenst realisiert.

Ares 17. Jan 2008 14:10

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Die Maus im Panel gefangen zu halten ist keine Lösung. Der Benutzer soll sein System verwenden können, nur eben kurzzeitig das Programm nicht.

Mit dem Panel habe ich es auch schon versucht. Ich will das ganze aber als allgemeinen Dialog realisieren, den ich an verschiedenen Programmstellen verwenden kann. Ich bin daran gescheitert, dass ich nicht weiß wie ich den Panel dann an die richtige Stelle zeichne. Ich habe es so versucht:

Delphi-Quellcode:
  TWaitDlg = class(TObject)
  protected
    FOwner   : TComponent;
    Panel    : TFlatPanel;
    Label1    : TLabel;
    Label2    : TLabel;
    Animation : TAnimate;
  public
    constructor Create(Owner: TComponent);

    procedure Show;
    procedure Hide;
  end;

implementation

{$R *.dfm}

uses
  Math;

constructor TWaitScreenDlg.Create(Owner: TComponent);
begin
  Panel := TPanel.Create(Owner);
  Panel.BringToFront;

  // ... Andere Teile des Panels erstellen
  Panel.Visible := false;
end;

procedur TWaitScreenDlg.Show;
begin
  Panel.visable := true;
end;

procedur TWaitScreenDlg.Hide;
begin
  Panel.visable := false;
end;

==============

var
  dlg: TWaitDlg;
begin
  dlg := TWaitDlg.Create(MainForm);
  // dlg := TWaitDlg.Create(EinPanel);

  dlg.Show;

  TuWas();

  dlg.Hide;
end;
Das Programm läuft zwar, aber der Panel wird nicht angezeigt... Eine Idee was ich falsch mache?

Besten Dank
Ares

b1zZ 17. Jan 2008 14:22

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Du könntest ja vielleicht eine Art Layer drüber legen, zB. ein Bild oder sowas in der Art.
Ein Panel in der Mitte und aussen rum sieht man noch leicht verschwommen die Anwendung. Somit kannst du das System weiter nutzen und dein prog kann in ruhe zu Ende laden.

Und wenn du die "Komponente" mit BringToFront ganz nach vorn holst, kannst du diese auch überall in deinem Programm benutzen.

shmia 17. Jan 2008 14:33

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Du kannst mal folgendes probieren:
Delphi-Quellcode:
FWindowList:Pointer;

procedure TImportForm.ShowSemiModal;
begin
   // Formular semi-modal machen
   FWindowList:= DisableTaskWindows(self.Handle);
   Show;
end;

procedure TImportForm.FormHide(Sender: TObject);
begin
   if Assigned(FWindowList) then
   begin
      // Semi-Modalität aufheben
      EnableTaskWindows(FWindowList);
      FWindowList := nil;
   end;
end;

OregonGhost 17. Jan 2008 14:39

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Vielleicht kannst du auch von deinem Wartefenster aus die zeitintensive Operation starten, sei es festkodiert, per Ereignis oder per Callback.

hoika 17. Jan 2008 15:09

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Hallo,

siehe mein letztes Post hier:

http://www.delphipraxis.net/internal...ht=tformstatus

TForm_Status ist ein Form,
wo zum Bsp. steht Bitte warten


Heiko

Ares 18. Jan 2008 10:38

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Danke an alle! Die Lösung von shmia funktioniert prima!

hoika 18. Jan 2008 12:04

Re: "Bitte warten Fenster" anzeigen - andere Einga
 
Hallo,

das gleiche macht auch mein Vorschlag,
nur dass man das StatusForm für veschiedene "Bitte warten ..."
verwenden kann.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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