![]() |
modales Fenster ohne Benutzerakt. selbst schliessen lassen
Hallo ich stehe vor folgendem Problem:
Ich zeige ein Bitte warten Form an.
Delphi-Quellcode:
Jetzt muss ich das Formular sich selbst nach einiger Zeit selbst schliessen lassen, aber wo packe ich dass
aSCIAuswahl:=TSCIAuswahlGUI.Create(self);
modalresult:=aSCIAuswahl.ShowModal;
Delphi-Quellcode:
hin??
Self.ModalResult:=mrOK;
Im FormCreate bewirkt es nicht, dass was es soll.. (es bleibt offen). Danke schonmal Gruß DelphiManiac |
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 |
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? |
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 |
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 |
Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
Na, wie bekommst du denn mit, ob deine Schnittstelle geantwortet hat?
|
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; |
Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
Und genau da kannst du es doch auch hinschreiben.
(manchmal gibt es zum Pollen keine Alternative) |
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; |
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 |
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 ... |
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. |
Re: modales Fenster ohne Benutzerakt. selbst schliessen lass
Hallo,
wenn ich deine Vorgaben nehme, dann würde ich so vorgehen:
Delphi-Quellcode:
Freundliche Grüße
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; |
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 |
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. |
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 |
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 |
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 |
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 05:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz