![]() |
Session ist nicht definiert
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 |
AW: Session ist nicht definiert
Hält der Debugger nicht irgendwo an?
Ansonsten im Destruktor mal der Reihe nach Sachen auskomentieren, bis die Meldung nicht mehr kommt um rauszufinden woher die kommt? |
AW: Session ist nicht definiert
EIB_Error hört sich nach Datenbank-Zugriffskomponenten an.
Wir hatten auch mal sporatische Probleme mit DB-Komponenten (hier beim Zugriff auf das globale Screen-Objekt, welche schon teileweise freigegeben war) beim beenden der Anwendung. Wir haben den Code (bzw. neuen Code) in das OnCloseQuery des Hauptformulares verlagert und dort die Datenbankverbindung explizit geschlossen. Damit kollidierten die DB-Aufräumarbeiten nicht mehr mit den Aufräumarbeiten der VCL. |
AW: Session ist nicht definiert
Zitat:
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
Delphi-Quellcode:
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.
if Application.MainForm = Self then Application.Terminate
Sprich: Application.Terminate wird nicht aufgerufen und damit ist das von Dir beobachtete Verhalten Zitat:
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
Delphi-Quellcode:
aber klar geschieht.
TForm(Self) := nil;
Aufgeräumt wird nur selbsterstelltes. Das Aufräumen der von Delphi automatisch erstellten Formulare ... sollte man beim Programmende Delphi überlassen. |
AW: Session ist nicht definiert
Zitat:
|
AW: Session ist nicht definiert
Also habe jetzt alles ausprobiert. Es muss an dem Thread liegen den ich benutze. Dieser ist für den Google Kalender da.
Die Verbindung wird so getrennt.
Delphi-Quellcode:
Um das Hauptformular habe ich FormClose so verändert.
procedure Tdata.DataModuleDestroy(Sender: TObject);
begin ncal.Free; con.Close; con.Connected := False; end;
Delphi-Quellcode:
Aber alle Versuche sind gescheitert. Der Debugger läuft bis zum Ende durch
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin timMain.Enabled := false; tmMedikament.Enabled := false; foriginalMenuStream.Free; dmMain.Threadbeenden; Action := caFree; TForm(Self) := nil; Application.Terminate; exit; end;
Delphi-Quellcode:
Erst hier zum Schluss erscheint diese Meldung.
begin
// IB_Session.IB_GetClientLibNameFunc := GetFBClientLibName; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TdmMain, dmMain); Application.CreateForm(TForm2, Form2); Application.Run; end. |
AW: Session ist nicht definiert
Und wie sieht der Stacktrace zu der Meldung aus?
Wie sieht die Routine Threadbeenden aus? Und wo wird das Datenmodul freigegeben? Gar nicht selbst? Dann passiert der Fehler vielleicht dabei, weil das erst ganz am Ende passiert, wenn schon viel aufgeräumt ist. |
AW: Session ist nicht definiert
Hier wird der Thread beendet:
Delphi-Quellcode:
Ich bin ein bisschen weiter gekommen und weiß jetzt es liegt an IBObjects. Bin aber noch nicht dahintergekommen was die Meldung zu bedeuten hat. Werder mal den Support von IBObjects konsultieren.
procedure TdmMain.Threadbeenden;
var I : Integer; begin (* Calendersync *) if CalSyncThread = nil then Exit; if CalSyncThread.Worker <> nil then begin try CalSyncThread.Worker.stopped := true; CalSyncThread.Terminate; except; end; end; while Assigned(CalSyncThread) do begin Application.ProcessMessages; if FAbbrechen then Break; end; end; |
AW: Session ist nicht definiert
Liste der Anhänge anzeigen (Anzahl: 1)
Komme nicht weiter. Habe mal einen madexcept Fehlerbericht beigefügt. siehe Anlage
|
AW: Session ist nicht definiert
Bei der Freigabe des Threads (im Destruktor) zerstörst du auch das Datenmodul dmData, führst dort aber bei der Zerstörung noch ein ExecSQL aus?
Das finde ich ein wenig spät. Wie wäre es, wenn du den Thread schon vor dem end des Projektquelltextes deinitialisierst? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz