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 modales Fenster ohne Benutzerakt. selbst schliessen lassen (https://www.delphipraxis.net/84817-modales-fenster-ohne-benutzerakt-selbst-schliessen-lassen.html)

DelphiManiac 22. Jan 2007 12:27


modales Fenster ohne Benutzerakt. selbst schliessen lassen
 
Hallo ich stehe vor folgendem Problem:

Ich zeige ein Bitte warten Form an.

Delphi-Quellcode:
  aSCIAuswahl:=TSCIAuswahlGUI.Create(self);
  modalresult:=aSCIAuswahl.ShowModal;
Jetzt muss ich das Formular sich selbst nach einiger Zeit selbst schliessen lassen, aber wo packe ich dass
Delphi-Quellcode:
Self.ModalResult:=mrOK;
hin??
Im FormCreate bewirkt es nicht, dass was es soll.. (es bleibt offen).

Danke schonmal
Gruß DelphiManiac

marabu 22. Jan 2007 12:30

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo,

das Warten ist ja wohl kein Selbstzweck. Also schließt du die Form nicht im FormCreate() sondern nach Beendigung deiner Arbeit.

Grüße vom marabu

DelphiManiac 22. Jan 2007 12:33

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
@marabu

Ja ich warte in meinem Fenster auf eine Antwort der Schnittstelle. Aber wo packe ich das Warten auf meine Antwort hin?
Angenommen (so wie es zZ. ist, ich packe es ins FormCreate) dann kann ich es ja nicht sich selbst schliessen lassen...

Vielleicht hast du eine Idee?

Pfoto 22. Jan 2007 12:33

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo!

Ich mache es so:

Das "Bitte-Warten-Fenster" mit .Show starten,
das Anwendungsfenster auf .enabled:= false setzten.

Dann den Prozess im Hauptfenster vornehmen.
Während dieser Abarbeitung kannst du auf diese Weise auch
den aktuellen Fortschritt über eine Progressbar ausgeben.

Schließlich das Extra-Fenster mit .Close schließen.
das Hauptfenster dann auf .enabled:= true setzen.

Gruß

Pfoto

hoika 22. Jan 2007 12:35

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo,

im FormActivate ein

Application.ProcessMessages

und nach Abchluss der Arbeiten dort

PostMessage(Handle, WM_CLOSE, 0, 0);


Heiko

sirius 22. Jan 2007 12:39

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Na, wie bekommst du denn mit, ob deine Schnittstelle geantwortet hat?

DelphiManiac 22. Jan 2007 12:45

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Indem ich in meinem Fenster 'Bitte warten' anzeige
und beim Empfang von 25 Bytes (das überpüfen mache ich in einer Schleife (ja ich weiss pollen ist unschön... :? ) aus
meiner Überprüfungsschleife rausspringe..

Es soll dann das Fenster durch 2 Situationen geschlossen werden.

1. 25 Byte sind da (raus aus der blöden Schleife) =>ModalResult:=mrOK;
2. Der Benutzer klickt abbrechen => ModalResult:=mrCancel;

sirius 22. Jan 2007 12:48

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Und genau da kannst du es doch auch hinschreiben.

(manchmal gibt es zum Pollen keine Alternative)

DelphiManiac 22. Jan 2007 12:52

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hi, ersteinmal ein Riesen Dank, dass ihr so zeitnah antwortet :-D

Ich habe das auch gemacht und poste meiner Form die WM_Close Nachricht, dannach schliesst es,
so wollte ich das auch, aber mein Button Abbrechen funktioniert dann nicht, zurzeit habe ich es so:

Delphi-Quellcode:
procedure TWaitForLoaderGUI.FormActivate(Sender: TObject);
begin
  while (aSCI.GetQBytes <> 25) do
  begin
    Application.ProcessMessages;
    Sleep(1);
    if Self.ModalResult <> mrNone then exit;
    if Application.Terminated then exit;
  end;

  Self.ModalResult:=mrOk;
  PostMessage(Self.Handle, WM_CLOSE, 0, 0);
end;

procedure TWaitForLoaderGUI.BitBtn1Click(Sender: TObject);
begin
  Self.ModalResult:=mrCancel; // Hier soll er das Form schliessen...
end;

hoika 22. Jan 2007 13:14

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo,

setzte im OnButtonClick eine Form-Variable (bUserCancel),
die wird im FormCreate auf False gesetzt,
und checke die in deiner Schleife zusätzlich mit.


Heiko

DelphiManiac 22. Jan 2007 13:28

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Mein Problem jetzt ist aber, durch die WindowsMessage ist
das Modalresult immer 2!!

Auch wenn ich es vorher auf (mrOK) setzte

...

DelphiManiac 22. Jan 2007 13:59

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Er schliesst das Fenster nicht, wenn ich den Button drücke,
erst beim 2. mal drücken... komisch..

Ich habe die Steuervariable bUserCancel mit eingebaut, bringt aber auch nix...

Irgendwo habe ich einen Denkfehler.

marabu 22. Jan 2007 14:06

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo,

wenn ich deine Vorgaben nehme, dann würde ich so vorgehen:

Delphi-Quellcode:
type
  TBusyForm = class(TForm)
    Button1: TButton;
  private
    nTicks: Cardinal;
    FOnIdle: TIdleEvent;
    procedure OnIdle(Sender: TObject; var Done: Boolean);
  public
    function Execute: Boolean;
  end;

var
  BusyForm: TBusyForm;

implementation

{$R *.dfm}

function TBusyForm.Execute: Boolean;
begin
  nTicks := GetTickCount;
  FOnIdle := Application.OnIdle;
  Application.OnIdle := OnIdle;
  Result := ShowModal = mrOK;
  Application.OnIdle := FOnIdle;
end;

procedure TBusyForm.OnIdle(Sender: TObject; var Done: Boolean);
begin
  Done := (GetTickCount - nTicks) >= 5000;
  if Done then
    ModalResult := mrOK;
end;
Freundliche Grüße

DelphiManiac 22. Jan 2007 14:16

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
@marabu

Hey Danke für deinen Quellcode.
Leider ist es nicht genau dass was ich suche, liegt wohl daran, dass ich mich nicht genau genug ausgedrückt habe,
ich will das die Form durch 2 Sachen geschlossen werden kann:

1. 25 Bytes im Eingang der Schnittstelle dann soll das modalresult mrOK sein
2. Benutzer klickt auf abbrechen dann soll das modalresult mrCancel sein.

danke

marabu 22. Jan 2007 14:47

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Die 25 Byte aus deiner Schnittstelle musst du selbst einlesen, z.B. in der Idle-Routine.
Und den Button mit ModalResult = mrCancel kannst du ruhig noch mit auf die Form setzen.
Du schaffst das.

hoika 22. Jan 2007 14:56

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo,

die Tatsache, dass das Auslesen erfolgreich war,
packst du in eine zusätzliche Boolean-Variable.

WM_CLOSE erzeugt ja ein Cancel.


Heiko

DelphiManiac 22. Jan 2007 15:03

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Achso jetzt verstehe ich (Online-Hilfe sei dank),

was du meinst, also ich soll ein OnIdle(Wenn die Anwendung im Leerlauf ist) Ereignis erstellen.
Das Alte Ereignis sichern das neue zuweisen und am Ende das Alte wieder zuweisen.

Gut aber wann mach ich dass, bzw wo rufe ich am Besten die Execute Methode auf?

Gracias

DelphiManiac 22. Jan 2007 15:05

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
@hoika

Ja stimmt, das WM_Close erzeugt ein Cancel.
Wie wird das denn intern mit dem modalResult:= XXX gehandelt? Weißt du dass zufällig, wird das auch über eine
Windows Message gemacht?

Ja ich könnte auf das Modalresult komplett verzichten und eine eigene Variable setzten. Wäre wohl die einfachste Lösung,
aber irgendwie wollte ich dass halt mit dem ModalResult lösen.

Wenn ichs gar net hin bekomme. dann mach ich es mit der eigenen Variable und der Windows Message (WM_CLOSE).

Danke

DelphiManiac 22. Jan 2007 15:37

Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
 
Hallo @all

habe das Problem mit einer Formvariablen gelöst.

Setze jetzt beim Manuellen (Benutzergesteuerten)-Abbruch eine Variable
isClosedByUser und überprüfe sie dann nachdem die Form geschlossen wurde.

Danke euch allen und noch einen schönen Tag.

Gruß DelphiManiac


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