AGB  ·  Datenschutz  ·  Impressum  







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

Form1 aus Form2 schluießen

Ein Thema von BAMatze · begonnen am 5. Mär 2009 · letzter Beitrag vom 23. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Form1 aus Form2 schluießen

  Alt 5. Mär 2009, 14:29
Hallo nochmal,

hab ein weiteres Problem über welchem ich sitze, wo ich dachte, eigentlich ziemlich trivial, aber ist nicht so.

ersteinmal zur Erklärung der Programmaufbau:

-----------|--------------------Form1-------------------|--------------> // dient nur der Überwachung
| |
-----------|--------Thread---------|---------> // Arbeitsthread
| |
----------Form2---------> // Bedienoberfläche

Also hoffe mit dieser kleinen Grafik kann ich die jetzt folgenden Worte etwas anschaulischer darstellen. Ich möchte, dass sich mein Programm SAUBER schließt, wenn der Bediener die Form2 beendet. Ich habe versucht, dies mittels eines Events zu tun, was allerdings zu reihenweisen Fehlermeldungen führt. Bin jetzt auf dem Stand, dass anscheinend meine Art, d.h. so wie ich die Events derzeit verwende zwar funktionieren (es wird realisiert, dass die Form2 geschlossen wird) aber nachdem in der Form1 dieses realisiert wird:

Delphi-Quellcode:
procedure TForm1.Beenden; // Procedure, in die beim Auftreten des Events gesprungen wird
begin
  close;
end; <-- hier springt er anscheinend zurück in die Eventfunktion in Form2, obwohl sie geschlossen ist
scheint sie auf die Form2 nocheinmal zugreifen zu wollen, was nicht geht, da die Form2 schon geschlossen ist. Das Event wird bei mir wie folgt in der Form2 ausgelöst:

Delphi-Quellcode:
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if assigned(Schliessevent) then Schliessevent;
end;
Kann mir jemand sagen, wie ich dies eventuell abändern kann, damit sich das Programm vollständig schließt? oder hat jemand eventuell eine gängigere Methode, wie ich in z.B. meinem Thread überprüfen kann, ob die Form2 noch existiert oder schon geschlossen wurde?

Vielen Dank
BAMatze

Edit1: Die grafik wird leider nicht so dargestellt, wie ich mir das dachte. Im Endeffekt ist Form1 der Hauptthread, in dem der Arbeitsthread erzeugt wird und in diesem wird die Form2 erzeugt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Form1 aus Form2 schluießen

  Alt 5. Mär 2009, 14:37
Wenn du auf visuelle Elemente wie ein Formular aus dem Thread heraus zugreifst, dann musst du dich nicht wundern, wenn es Probleme gibt. Derlei Zugriffe müssen generell synchronisiert und damit im Kontext des Hauptthreads ausgeführt werden.

Wie genau erzeugst du da Form2? Tatsächlich direkt im Thread ohne Synchronisierung?

Wenn Form2 beim Schließen auch aus dem Speicher entfernt werden soll, dann kannst du in OnClose Action auf caFree setzen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Form1 aus Form2 schluießen

  Alt 5. Mär 2009, 14:42
Also der Thread erzeug nicht wirklich die Form2, die Form2 wird mehr oder weniger nur aktiviert im Thread. Die Form2 ist ganz normal über Datei>Neu in das Projekt eingearbeitet worden, damit die Benutzeroberfläche ordentlich erstellt werden konnte.

Edit1: Denke mal ein eventuell anderes Konzept müsste hier verwendet werden, als das was ich versucht hab. Vieleicht hat ja jemand schonmal eine ähnliche Programmarchitektur gehabt und diese SAUBER terminiert und kann mir da mal einen Tipp geben.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 09:34
Schreibe hier nochmal, damit das Thema nochmal aufgenommen wird. Habe mir jetzt den gestrigen Abend um die Ohren geschlagen und leider immer noch keine wirkliche Lösung gefunden.

bisher versucht: 1.) Event in Form2 sagt der Form1, dass sie geschlossen wird. Problem Procedure in Form1 springt anscheinend zurück in Form2 und dies erzeugt eine Exception.
2.) Form1 aus Form2 schließen und im onClose-Ereignis der Form1 versuchen alles zu schließen, leider auch nur Exceptions.
Hab diese beiden Methoden in unzähligen Varianten versucht und leider keinen Erfolg gehabt.

Hoffe jemand hat eine gängige Methode, mit der ich das Problem lösen kann.

Vielen Dank
BAMatze
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 09:49
Zitat von BAMatze:
bisher versucht: 1.) Event in Form2 sagt der Form1, dass sie geschlossen wird. Problem Procedure in Form1 springt anscheinend zurück in Form2 und dies erzeugt eine Exception.
2.) Form1 aus Form2 schließen und im onClose-Ereignis der Form1 versuchen alles zu schließen, leider auch nur Exceptions.
Hab diese beiden Methoden in unzähligen Varianten versucht und leider keinen Erfolg gehabt.

Hoffe jemand hat eine gängige Methode, mit der ich das Problem lösen kann.

Vielen Dank
BAMatze
Versuch mal folgendes:

In der OnClose von Form2
  PostMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0); Sollte funktionieren.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 10:23
Versuch mal folgendes:

In der OnClose von Form2
  PostMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0); Sollte funktionieren.

Gruß, Chris[/quote]

bekomme ich leider auch Fehlermeldungen, aber ich denke mal ich stelle euch einfach mal das Projekt jetzt zur Verfügung, da macht sich die Fehlersuche vieleicht einfacher.

Edit 1: Hinweise zur Verbesserung der Programmiertechnik werden auch angenommen, da ich ja immer noch in der Anfangslernphase bin und mich mit der Programmiersprache Delphi erst seit gut 4Monaten auseinander setze.

Edit 2: Ich weiß es gibt einen Fehler, beim schreiben auf die Datei. Diesen Fehler kann ich beheben, wenn das TProtokoll richtig geschlossen wird. Um diesen Fehler geht es mir auch nicht, wenn man diese Schreib-procedure auskommentiert, dann bleibt ein Fehler:
Erste Gelegenheit für Exception bei $7C812AEB. Exception-Klasse EOSError mit Meldung 'Systemfehler. Code: 1400.
Ungültiges Fensterhandle'. Prozess Proj_EFPI.exe (2728)
Angehängte Dateien
Dateityp: zip tischsteuerung_version_2_427.zip (1,14 MB, 4x aufgerufen)
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 10:54
Ok kann schonmal den Fehler eingränzen, das Fenster-Handel ist ungültig und hab auch schon einige Varianten danach getestet.

getestet:

Delphi-Quellcode:
  PostMessage(Application.Form1.Handle, WM_CLOSE, 0, 0); // <--- diese Form gibt Fehlermeldung beim Compilieren
  PostMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0); // <--- compilierbar aber falsches Handle
  PostMessage(Form1.Handle, WM_CLOSE, 0, 0); // <--- compilierbar aber falsches Handle
sieht jemand den Fehler?
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 10:58
Hallo,

also ich habe mir das mal kurz angeschaut. Und jaenicke war eigentlich schon dabei dich in die richtige Richtung zu lenken.

In dem Execute deines UnterThreads rufst du Form2.ShowModal auf -> es befindet sich somit im Kontext des Threads. Das macht irgendwie schon Probleme.

Ich bin jetzt nicht ganz dahinter gekommen, warum du es so gelöst hast. Ich will jetzt nicht das ganze auflösen in Probleme aber generell gilt erstmal was jaenicke geschrieben hat: Aus Threads heraus solltest du nicht ohne weiteres auf visuelle Elemente zugreifen. Das sollte dem Hauptthread überlassen werden. Auch wenn du den Thread eine Methode ausführen läßt, die einem Formular gehört wird die Methode im Kontext des Threads ausgeführt. Das also irgendwie trennen bzw. per Syncronized aufrufen.

Dein Problem mit dem Schliessen des Forms dürfte sich beheben lassen, indem du den Thread arbeiten läßt und den Thread kurz vor ende eine Nachricht an das Hauptformular schicken läßt. Dieses Reagiert dann entsprechend darauf und versteckt sich und öffnet das Form2. Dann brauchst du nicht mal das PostMessage mit WM_CLOSE in Form2 an das MainForm zu senden.

Sieht dann ungefährt so aus:
Delphi-Quellcode:
unit ThreadUnit;
//...
procedure THUnterthread.Execute;
begin
  Protokoll.Protokolleingang('Unterthread', 'Execute-Fkt');
  ControlerBoard := TControlerBoard.create;
  ControlerBoard.Fehlerevent_ausloesen := Fehler_verifizieren;
  ControlerBoard.Initialising;
  V_Tische := TV_Tische.create;
  V_Tische.Fehlerevent_ausloesen := Fehler_verifizieren;
  V_Tische.Initialising;
  P_Tisch := TP_Tisch.create;
  P_Tisch.Fehlerevent_ausloesen := Fehler_verifizieren;
  P_Tisch.Initialising;
  Fehler_verifizieren(0);
// Form1.visible := false;
// Form2.ShowModal;
  Protokoll.Protokollausgang('Unterthread', 'Execute-Fkt');
  PostMessage(Form1.Handle, WM_MACH_WEITER, 0, 0);
end;
//...


unit LoaderUnit;
//...
const
  WM_MACH_WEITER = WM_USER +1;
//...
type
  TForm1 = class(TForm)
  //...
  private
    procedure WMMachWeiter(var MSG: TMessage);message WM_MACH_WEITER;
  //...
  end;

procedure TForm1.WMMachWeiter(Sender: TObject);
begin
  Self.Visible := FALSE;
  Form2.ShowModal;
  // wenn es geschlossen wird alles beenden
  Self.Close;
end;
Ich hoffe, das bringt dich weiter.

Aber wie gesagt, es ging erstmal nur darum das Problem zu lösen mit dem schliessen. Aber es ist an sich immer noch etwas merktwürdig mit dem Thread und so. Nur so als Info.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 11:18
Das hört sich schonmal gut an. Löse ich dann mit der Postmessage aus der Form2-onClose-procedure das schließen der Form1 aus, ohne dass es zu einer Exception kommt?

Edit 1: Frage hat sich geklärt, hab dein Kommentar ebend erst gelesen. "Wer lesen kann ist klar im Vorteil"
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Form1 aus Form2 schluießen

  Alt 6. Mär 2009, 11:29
Dickes Danke an Chris mit dieser Vorgehensweise ist es wirklich einwandfrei gelöst.

Hab nur mal eine Bitte, weil ich ja noch viel lernen muss in Delphi, kannst du mir mal das mit der Postmessage erklären? Also nicht, was der Computer dabei macht, wenn der Befehl aufgerufen wird, sondern eher:

was bedeutet:
  M_MACH_WEITER = WM_USER +1; verstehe das WM_User+1 nicht genau. Und wie wirken diese Konstante mit der Procedure zusammen?

Vielen Dank
BAMatze
  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 03:18 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