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 Form.Close funktioniert manchmal nicht (https://www.delphipraxis.net/121172-form-close-funktioniert-manchmal-nicht.html)

Flippo 23. Sep 2008 13:59


Form.Close funktioniert manchmal nicht
 
Hallo,

also mein Problem ist folgendes. Ich lese Daten aus Textdateien ein und speichere diese dann in einer Datenbank. (Das funktioniert ohne Fehlermeldungen und die Daten sind auch da wo sie sein sollen.) Den Fortschritt dieses Einleseprozesses gebe ich auf einer Form Namens frmProgress aus. Leider schließt sich frmProgress manchmal trotz fehlerfreiem Einlesevorgang nicht, wenn das Einlesen beendet ist.(Der Einlesevorgang wird auch beendet, in frmProgress wird "Fertig" ausgegeben, bis zu dieser Zeile läuft der Code also auch durch)
Der Abbrechen Button, der frmProgress normalerweise auch schließen sollte hat auch keine Wirkung, wenn der Fehler auftritt.
Ich konnte leider auch keine Struktur hinter den Fehlern erkennen, bei ein und demselben Datensatz schließt sich die Form manchmal und manchmal eben nicht.

Da der Einlesevorgang recht lange dauert und man manchmal das Fenster minimiert usw. hatte ich zuerst den Verdacht das es damit zusammenhängen könnte. Aber auch da konnte ich keine festen Zusammenhänge feststellen.

Habt ihr Ideen woran es liegen könnte? Habt ihr irgendwelche Erfahrungen mit verrückt erscheinenden nicht schließbaren Forms, die weiterhelfen könnten?

(Ich habe bei meiner Suche Themen mit "CloseQuery" gefunden, was wohl verhindern kann, dass eine Form geschlossen wird, aber da sind alle Werte so wie sie sein sollen)

Danke schonmal an alle die sich damit beschäftigen

MfG

Flippo

Hier der Code:

Delphi-Quellcode:
procedure TfrmMain.ImportData(Sender: TObject);
var
.
.
begin
  database.enableStandFiler(false);
  if frmDataImport.showModal(false) = mrOk then begin
    frmProgress.Show('Importiere Daten...', false, true, true, true, self);
    frmProgress.addLine('Lese Daten...');
    .
    .
    .
    frmProgress.addLine('Analysiere und schreibe Daten in die DB...');
    application.ProcessMessages;
    .
    .
    .
    //Routinen die Daten in die Datenbank schreiben
    .
    .
    .
    database.openDataSets(actProject.actStand, actProject.actBereich);
    self.pageControlDatenChange(Sender);
    frmProgress.addLine('Fertig.');
    application.BringToFront;
    application.ProcessMessages;
    sleep(1500);
  end;
  frmProgress.close;
end;


procedure TfrmProgress.show(caption:String; show_bar, show_memo, show_btnAbort,beep: boolean; Sender: TControl);
begin
  inherited show;
  self.mySender := sender;
  self.mySender.Enabled := false;
  self.ModalResult := mrNone;
  .
  .
  .
  //unwichtige Zuweisungen a la Memo1.visible:=false;
  .
  .
  .
end;


procedure TfrmProgress.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  self.mySender.Enabled := true; // Aufrufer wieder Aktivieren
  if signalEnd then beep;
end;

SirThornberry 23. Sep 2008 14:03

Re: Form.Close funktioniert manchmal nicht
 
ein Close sorgt nur dafür das dein Form die Nachricht geschickt bekommt das es sich schließen soll. Der Code nach dem schließenbefehl wird also noch abgearbeitet. Bist du also in einer Schleife wird die Schleife auch weiter abgearbeitet.

Flippo 23. Sep 2008 14:33

Re: Form.Close funktioniert manchmal nicht
 
Ok, aber in diesem Fall bin ich meiner Meinung nach nicht in einer Schleife, denn frmProgress.close ist ja der letzte Befehl der von ImportData ausgeführt wird und ImportData wird einmalig auf die Benutzereingabe ausgeführt.
Oder hab ich Dich jetzt falsch verstanden?

SirThornberry 23. Sep 2008 15:21

Re: Form.Close funktioniert manchmal nicht
 
Hast du vielleicht mehrere Instanzen der Klasse TfrmProgress offen so das es dir so vorkommt das frmProgress nicht schließt aber es tatsächlich eine andere Instanz ist?
Vielleicht hast du ja sinngemäß sowas:
Delphi-Quellcode:
frmProgress := TfrmProgress.Create();
frmProgress := TfrmProgress.Create();
frmProgress.Close;
dann würdest du ja auch nur eines der erzeugten Fenster schließen. Oder erzeugst du das Fenster manuell und es ist zusätzlich noch in der Liste der zu automatisch erstellenden drin?

Flippo 23. Sep 2008 15:28

Re: Form.Close funktioniert manchmal nicht
 
Nein, das Fenster existiert nur einmal und wird nur zum Anfang einmal erzeugt. :?

Achja, frmProgress wird auch an anderen Stellen des Programms aufgerufen, macht aber nur beim einlesen Probleme.

nahpets 23. Sep 2008 15:37

Re: Form.Close funktioniert manchmal nicht
 
Hallo,
Zitat:

Zitat von Flippo
Nein, das Fenster existiert nur einmal und wird nur zum Anfang einmal erzeugt. :?

Achja, frmProgress wird auch an anderen Stellen des Programms aufgerufen, macht aber nur beim einlesen Probleme.

Das könnte eventuell bedeuten, das von woanders ein Fenster "überbleibt".
Mach in FormClose mal ein
Delphi-Quellcode:
self.visible := false;
hinein, manchmal hilft das. Prüfe, ob FormClose tatsächlich immer aufgerufen wird (Uhrzeit in 'ne Datei schreiben oder sowas).
Hatte auch schonmal so Effekte, dass ein Fenster nicht verschwinden wollte oder ein anderes nicht wie gewünscht in den Vordergrund kam.

Stephan

Flippo 23. Sep 2008 16:10

Re: Form.Close funktioniert manchmal nicht
 
Formclose wird immer aufgerufen, das hab ich schon getestet. Werde visible:=false mal ausprobieren.

Werde Morgen posten ob es mich weitergebracht hat, jetzt hab ich Feierabend :oops:

MfG

flippo

Flippo 25. Sep 2008 08:56

Re: Form.Close funktioniert manchmal nicht
 
...das hat mich leider auch nicht weitergebracht und ich muss mich selber korrigieren: frmProgress ist jetzt auch an einer anderen Stelle des Programms sichtbar geblieben.

Dawn87 25. Sep 2008 13:31

Re: Form.Close funktioniert manchmal nicht
 
Hallo Flippo,

probier mal folgendes, um dein Fenster zu schließen:

Delphi-Quellcode:
PostMessage(self.Handle, WM_CLOSE, 0, 0);
Grüße
Stefan

Flippo 26. Sep 2008 09:36

Re: Form.Close funktioniert manchmal nicht
 
Hi, ich danke euch für die Hilfe. So ganz sicher über die Ursache und die Lösung bin ich mir zwar immernoch nicht, aber wie es aussieht tritt das Problem nur auf, wenn ich das Programm über den Debugger laufen lasse, wenn ich die .exe per Doppelklick starte habe ich das seltsame Verhalten der Form nicht beobachten können.
Falls jemand weiß warum der Debugger so etwas tut, würde mich das interessieren. Von großer Priorität ist das Problem für mich allerdings nicht mehr.


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