Einzelnen Beitrag anzeigen

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, 09: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