Hallo, ich habe ein großes Projekt von Delphi 10.1 nach Delphi 10.4.1 umgestellt. Soweit so gut. Beim verlassen der Anwendung erhalte ich die Meldung: EIB_Error ... Session ist nicht definiert. Das Programm läßt sich nicht beenden.
Was kann das sein?
Delphi-Quellcode:
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
timMain.Enabled := false;
tmMedikament.Enabled := false;
foriginalMenuStream.Free;
dmMain.Threadbeenden;
Action := caFree;
TForm(Self) := nil;
end
caFree heißt, dass das Formular freigegeben werden kann.
Bevor Dein Programm das tun kann, setzt Du das Formular aber schon auf NIL, was aber nicht einer Freigabe entspricht. Alles, was nach dieser Zuweisung noch irgendwie mit dem Formular interagieren muss, wird scheitern.
Bei meinem ollen Delphi 7 ist eine der letzten Aktionen beim Programmende
if Application.MainForm = Self then Application.Terminate
Wenn man nun vorher Self auf Nil setzt, dürfte das Beenden des Programmes scheitern, da ja Self inzwischen Nil ist und damit einen anderen Wert enthält, als Application.MainForm.
Sprich: Application.Terminate wird nicht aufgerufen und damit ist das von Dir beobachtete Verhalten
Zitat:
Das Programm läßt sich nicht beenden.
eine schlüssige Konsequenz. Weitere (negative) Nebenwirkungen sind nicht ausgeschlossen.
Oder anders formuliert:
Delphi kann beim Schließen des Hauptformulares (seit gefühlt Jahrzehnten) Programme sauber beenden. Man muss dort nicht (wie auch immer) eingreifen, was mit der Zuweisung
TForm(Self) := nil;
aber klar geschieht.
Aufgeräumt wird nur selbsterstelltes. Das Aufräumen der von Delphi automatisch erstellten Formulare ... sollte man beim Programmende Delphi überlassen.