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