![]() |
Windows Programm Login Fenster
Hallo,
es geht bei meiner Frage darum das ich immer wieder mit Bug Reports von Madshi zu tun habe die ich nicht verstehe. Wenn ich so ein Bug Report lese dann sehe ich welche Units nach einander abgearbeitet wurden bis es gekracht hat. In den mysteriösen Bug Reports tauchen aber nur System Units auf und keine von meinen. Jetzt habe ich einen Verdacht. Es hat was mit dem Start Verhalten zu tun. Mein Programm hat in dem Create Bereich der Main Form ein Login Fenster und nach erfolgreichem Login ein Lade Fenster (Variablen werden mit Werten aus DB gefüllt). Wenn alles erfolgreich war kommt erst Application.Run und die Main Form wird angezeigt. Würdet ihr den Aufbau auch so gestalten? Könnte es sein das Madshi erst ab Application.Run vernünftige Bug Reports erstellen kann? Beispiel für ein Bug Report: exception message : Argument außerhalb des Bereichs. main thread ($16bc): 004eb2f6 +00e Test1.Exe System.Classes TCollection.GetItem 007bcd72 +012 Test1.Exe adsdata 1697 +1 TACEFieldDefs.GetItem 007c1b17 +0ff Test1.Exe adsdata 5019 +21 TAdsDataSet.ReadTranslatedRecord 007c1ecd +119 Test1.Exe adsdata 5175 +52 TAdsDataSet.GetCurTranslatedRecord 007c7323 +0e7 Test1.Exe adsdata 8605 +37 TAdsDataSet.InternalCancel 007884fa +062 Test1.Exe Data.DB TDataSet.SetCurrentRecord 007892ae +072 Test1.Exe Data.DB TDataSet.Cancel 007ca8ae +00a Test1.Exe adsdata 11209 +5 TAdsDataSet.Cancel 00785a2d +0ad Test1.Exe Data.DB TDataSet.SetActive 00785828 +004 Test1.Exe Data.DB TDataSet.Close 007850aa +01a Test1.Exe Data.DB TDataSet.Destroy 007be0fb +093 Test1.Exe adsdata 2733 +22 TAdsDataSet.Destroy 007d5b22 +01a Test1.Exe adstable 2292 +5 TAdsTable.Destroy 00409ebc +008 Test1.Exe System 44 +0 TObject.Free 00502116 +076 Test1.Exe System.Classes TComponent.DestroyComponents 00501baf +01b Test1.Exe System.Classes TComponent.Destroy 00503fa6 +066 Test1.Exe System.Classes TDataModule.Destroy 00409ebc +008 Test1.Exe System 44 +0 TObject.Free 00502116 +076 Test1.Exe System.Classes TComponent.DestroyComponents 00721e51 +035 Test1.Exe Vcl.Forms DoneApplication 0045a329 +021 Test1.Exe System.SysUtils DoExitProc 0040bbb2 +06e Test1.Exe System 44 +0 @Halt0 02f5c36e +08e Test1.Exe Test1 504 +12 initialization 77566357 +017 KERNEL32.DLL Teil aus den Quelltext:
Delphi-Quellcode:
begin
Application.Initialize; // -- // -- // -- Application.MainFormOnTaskbar := True; TStyleManager.TrySetStyle('Windows10 Office Light'); Application.HelpFile := 'Test1.chm'; Application.Title := 'Test1 ADS'; Application.CreateForm(TMainForm, MainForm); If Not StartAbbruch Then Application.Run; end. |
AW: Windows Programm Login Fenster
02f5c36e +08e Test1.Exe Test1 504 +12 initialization
Liest sich, als würde das im initialisierungs-Block einer Unit knallen. Schau mal in dieser Richtung. ... Von der Struktur (main-Form erstellt im Create ein Login usw.) klingt das schon fast bekannt. Ich denke so oder so in der Art machen das viele. MfG Incocnito |
AW: Windows Programm Login Fenster
Dein Vorgehen ist insgesamt leicht fehleranfällig, wenn auch nicht unüblich.
Um derartige Probleme zu verhindern, gehe ich her und packe 'nen Timer aufs Formular. Die letzte Zeile im FormCreate aktiviert den Timer. In die Timerroutine kommt dann alles, was mit dem Aufbau der Datenbankverbindung, Login, ... zusammenhängt. Wird dort z. B. das Login abgebrochen, wird das Programm mit 'nem regulären Close des Mainforms wieder beendet. Dadurch ist keine zusätzliche Logik in der dpr erforderlich oder ein bedingtes Application.Run. Das Timerinterval wähle ich so, dass es für eine vollständige Initialisierung des gesamten Programmes ausreicht. Muss man halt ein bisserl probieren, in der Regel reicht eine Sekunde aber locker aus. Der Bugreport sieht für mich so aus, als würde da 'ne Datenbankverbindung beendet, bzw. ein Dataset geschlossen, bevor es überhaupt erst richtig geöffnet und alle zugehörigen "Teile" initialisiert wurden. Gibt es Situationen, in denen das Programm im FormCreate wieder beendet wird? Wenn ja, ist dort sichergestellt, dass die Datenbankverbindung und alle Datasets vorher geschlossen werden? Ist ebenfalls sichergestellt, dass nur bei erfolgreichem Datenbanklogin und Aufbau der Datenbankverbindung, DataSets geöffnet werden und/oder ein Zugriff auf sie erfolgt? Wie verhält sich Dein Programm, wenn das Anmelden im Loginfenster nicht erfolgreich war? Wie verhält es sich, wenn beim Laden der Variabeln aus der DB, etwas nicht funktioniert? In dem Umfeld dürfte der Fehler zu finden sein. Irgendwas bei der Initialisierung der Datenbankverbindung, der DataSets scheint da gehörig schief zu laufen. |
AW: Windows Programm Login Fenster
Was passiert denn wenn man
Delphi-Quellcode:
eine form created und dann nichts macht? also einfach "end."
begin
startabbruch := true; Application.Initialize; Application.CreateForm(TMainForm, MainForm); If Not StartAbbruch Then Application.Run; end. |
AW: Windows Programm Login Fenster
Danke für die Hinweise.
@Incocnito. Ich glaube das ist der interessanteste Hinweis. Es sind ein paar Units mit initialization und finalization. Die hatte ich bis jetzt nicht überprüft. @Delphi.Narium. Über ein Timer hatte ich auch schon nachgedacht. Habe es auch in ein mini Projekt ausprobiert. Bin aber kein Freund von Timern. Das Programm wird im FormCreate Bereich nicht beendet. Es wird an mehreren Stellen der Boolesche Wert „StartAbbruch“ abgefragt und mit „Exit“ der FormCreate Bereich verlassen. Der Hinweis mit dem sicherstellen das die Verbindung zu Datenbank ist auch sehr interessant. Habe es mir eben noch einmal angeguckt und finde es könnte besser abgesichert sein. @KodeZwerg. Leider verstehe ich deinen Beitrag nicht. Wie meinst du das? Vielen Dank für eure Hilfe |
AW: Windows Programm Login Fenster
Zitat:
Du schreibst das im FormCreate ein Login-Formular erzeugt wird bevor Application.Run in Gang gesetzt wird. Warum nicht gleich in der Initialisierung es auch so behandeln. Also nicht in der .dpr Datei sondern in der FormCreate-Phase ein "Application.Terminate" oder ähnliches. In der FormCreate so in etwa Die MainForm.Visible auf False, LoginForm.Visible auf True Dein StartAbbruch darin setzen bzw auswerten und das Visible bzw Terminate dann triggern. Vielleicht liege ich auch total falsch... wenn dem so ist, Verzeih mir Bitte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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