Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Session ist nicht definiert (https://www.delphipraxis.net/206535-session-ist-nicht-definiert.html)

Walter Landwehr 2. Jan 2021 10:56

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

TurboMagic 2. Jan 2021 13:46

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?

Bernhard Geyer 2. Jan 2021 14:30

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.

Delphi.Narium 2. Jan 2021 14:41

AW: Session ist nicht definiert
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1480200)
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
Delphi-Quellcode:
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
Delphi-Quellcode:
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.

jaenicke 2. Jan 2021 15:00

AW: Session ist nicht definiert
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1480220)
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.

Nein, es wird nur Self auf nil gesetzt, also die lokale Referenz auf das Formular. Das hat genau gar keine Wirkung, da Self in der Methode danach gar nicht mehr verwendet wird.

Walter Landwehr 2. Jan 2021 15:42

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:
procedure Tdata.DataModuleDestroy(Sender: TObject);
begin
  ncal.Free;
  con.Close;
  con.Connected := False;
end;
Um das Hauptformular habe ich FormClose so verändert.
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;
  Application.Terminate;
  exit;
end;
Aber alle Versuche sind gescheitert. Der Debugger läuft bis zum Ende durch

Delphi-Quellcode:
begin
//  IB_Session.IB_GetClientLibNameFunc := GetFBClientLibName;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TdmMain, dmMain);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.
Erst hier zum Schluss erscheint diese Meldung.

jaenicke 2. Jan 2021 15:58

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.

Walter Landwehr 3. Jan 2021 10:50

AW: Session ist nicht definiert
 
Hier wird der Thread beendet:
Delphi-Quellcode:
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;
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.

Walter Landwehr 3. Jan 2021 12:18

AW: Session ist nicht definiert
 
Liste der Anhänge anzeigen (Anzahl: 1)
Komme nicht weiter. Habe mal einen madexcept Fehlerbericht beigefügt. siehe Anlage

jaenicke 3. Jan 2021 13:20

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 13:53 Uhr.
Seite 1 von 2  1 2      

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