Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehler vor OnCreate finden (https://www.delphipraxis.net/199762-fehler-vor-oncreate-finden.html)

peterbelow 20. Feb 2019 09:56

AW: Fehler vor OnCreate finden
 
Zitat:

Zitat von Ykcim (Beitrag 1425869)
Hallo Zusammen,

ich habe ein großes Projekt, welches im Unternehmen seit Monaten ohne Probleme läuft. Mit diesem Programm arbeiten 2 Abteilungen und ca. 30 User täglich.
Da die Software ein Benutzerberechtigungssystem beinhaltet gibt es natürlich auch einen LogIn.

Jetzt habe ich einen Rechner, auf dem das Programm einen Fehler auswirft. Nach der Anmeldung mit irgendeinem Benutzernamen kommt angehängte Fehlermeldung.
Da es der einzige Rechner ist, der Probleme macht, und ein altes Betriebssystem drauf war, welches einige Fehler im Protokoll anzeigte, habe ich Windows10 aufspielen lassen. Leider ohne Erfolg.
Das Programm wurde vorher auf dem Rechner nicht verwendet, weil es der Azubi-Rechner ist...

Ich dachte, ich könnte einfach ganz schlau alles mitloggen, was passiert. Leider ohne Erfolg, denn ich habe die LogIn-Procedure komplett geloggt und die OnCreate und OnShow Procedure des Hauptfenderts der Software. Die LogIn-Procedure läuft ohne Fehler durch. Leider tritt der Fehler dann auf, bevor OnCreate oder OnShow starten. Das heißtz ich habe ein schwarzes Loch, indem ich nicht weiß, was passiert und wie ich da dran kommen kann.
Ich vermute das er in dieser Zeit die DFM-Datei den Main-Form ausführt, aber die kann ich meines Wissens nicht loggen, oder?

Im Debugger kann man das schon verfolgen, aber das nützt Dir wenig (Create-Constructor overriden, breakppoint auf das "inherited Create" setzen, mit debug DCUs bauen, mit F7 in das Statement steppen).

Sieh Dir mal die Comboboxen etc. im Designer genauer an. Es gibt ein paar Dinge, die manchmal nicht in der creation sequence des forms funkionieren, wie z. B den ItemIndex einer Combobox zu setzen. Das hängt damit zusammen, das einige der Operatione eine Window handle erfordern. Die VCL legt das zwar nach Bedarf an (versucht es zumindestens), aber das kann schiefgehen. Was oft auch nicht funktioniert, ist der Versuch, den focus explizit in Code zu setzen, anstatt dafür die Activecontrol-Eigenschaft des Forms zu verwenden.

Sherlock 20. Feb 2019 09:56

AW: Fehler vor OnCreate finden
 
Relevant scheinen mir diese Teile zu sein:
Zitat:

exception class : EInvalidOperation
exception message : Deaktiviertes oder unsichtbares Fenster kann den Fokus nicht erhalten.

main thread ($938):
005fac86 +006e NedCom.exe Vcl.Forms TCustomForm.SetActiveControl
005fad8f +0053 NedCom.exe Vcl.Forms TCustomForm.FocusControl
005341ae +0012 NedCom.exe Vcl.Controls TWinControl.SetFocus
007bfa25 +000d NedCom.exe AdvGrid 26797 +1 TAdvStringGrid.EditCell
01122d5f +005b NedCom.exe Frame_ListendruckUnit 284 +1 TFrame_Listendruck.Grid_not_printedClick
0052cf87 +006f NedCom.exe Vcl.Controls TControl.Click
007d7659 +0005 NedCom.exe AdvGrid 37053 +1 TAdvStringGrid.Click
00667211 +0021 NedCom.exe Vcl.Grids TCustomGrid.FocusCell
0066a59a +0012 NedCom.exe Vcl.Grids TCustomGrid.SetRow
Der Aufrufstack gibt die Liste der Aufrufe, die zum Problem führten an, letzter ganz oben. Es wird aus welchem Grund auch immer ein Click-Event ausgelöst. Was zum Create oder auch Show-Zeitpunkt reichlich verfrüht ist. Dann wird versucht ein Control zu aktivieren bzw. den Fokus zu geben, das (noch) nicht sichtbar ist. Schau nach, was es mit diesem Click auf sich hat, das kannst Du zur Not auch lokal durchsteppen.

Sherlock

Delphi.Narium 20. Feb 2019 10:32

AW: Fehler vor OnCreate finden
 
Im Zweifelsfalle:

Die Fehlermeldung enthält eine Fehleradresse.

Programm kompilieren und auf betroffenen Laptop starten.

Fehleradresse merken.

In der IDE auf den ersten Befehl in der dpr nach dem führenden Begin 'nen Breakpoint setzen.
Programm in der IDE mit Debugger starten.

Wenn das Programm am Breakpoint stehen bleibt im Menü die Option "Suchen/Laufzeitfehler suchen" wählen. Dort die Fehleradresse eingeben. Die IDE sollte Dich dann zu der Stelle bringen, an der der Fehler aufgetreten ist. Im Umfeld dieser Stelle nach möglichen Fehlerursachen suchen.

Alternative:

Programm mit ausführlicher MAP-Datei erstellen.

Programm auf Laptop starten. Fehlereradresse merken und diese in der MAP-Datei suchen. Wird sie gefunden, so steht vor der Fehleradresse die Nummer der Zeile, in der der Fehler auftritt. Mehr oder weniger weit darüber steht, um welche Quelltextdatei es sich handelt. Dort dann nach möglichen Fehlerursachen suchen.

Ansonsten: EurekaLog, madExcept

Nutzt Du die JEDIs? Dann nimm dort den TJvDebugHandler, der hilft Dir an Fehlerursachen zu gelangen.

Ykcim 20. Feb 2019 11:15

AW: Fehler vor OnCreate finden
 
Hallo Zusammen,

ich habe es jetzt mit dem Remote-Debugger versucht. Mit einer "Hello World" Anwendung klappt das wunderbar.
Aber wenn ich mein Projekt compiliere, startet das Prgramm nicht auf der Remote-Maschine. Die exe-Datei wird zwar angelegt, aber starten tut sie nicht. Komischer Weise beendet sich auch scheinbar der Debugger. Jedenfalls wird der grüne Button wieder sichbar. Aber wenn ich draufklicke passiert nichts...
Wenn ich aber die das Projekt in Delphi schließen möchte, wird gesagt, dass es eine Debugger-Sitzung gibt...

Kennt jemand das? Ich mein Projekt zu groß? Die Debugger-EXE ist 70MB groß, die Release-EXE ca. 25MB.

Vielen Dank
Patrick

Sherlock 20. Feb 2019 11:20

AW: Fehler vor OnCreate finden
 
Mach doch mal eines nach dem anderen. Du hast einen Call Stack, was sagst Du dazu? Meine Anmerkungen schon gelesen?

Sherlock

Ykcim 20. Feb 2019 11:48

AW: Fehler vor OnCreate finden
 
Hallo Sherlock,

ich habe Deine Anmerkung gelesen. Aber ich weiß nicht, wie ich sie umsetzen muss.:oops:
Ich weiß nicht, wie ich gezielt zu dem Punkt komme. Ich habe Haltepunkte im OnCreate und OnShow des Hauptfensters gesetzt, aber vorher crasht das Programm. Aber nicht auf der Entwicklungsmaschine, deshalb tue ich mich gerade so schwer damit...

LG Patrick

Ykcim 20. Feb 2019 12:09

AW: Fehler vor OnCreate finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi.Narium,

ich habe jetzt aus dem Bug-Report von MadExcept die Fehler-Adresse ausfindig gemacht (00534460).
Dann habe ich die Adresse gesucht. Jetzt stehe ich vor diesem Bildschirm. Bei dieser Ansicht habe ich noch nie verstanden, was ich damit anfangen kann und wie ich von dort aus zu dem entsprechenden Code komme...

Ich habe den Bildschirm als Screenshot angehängt.

Vielen Dank
Patrick

hoika 20. Feb 2019 12:22

AW: Fehler vor OnCreate finden
 
Hallo,
der Fehler steht doch direkt da.

Deaktiviertes oder unsichtbares Fenster kann den Fokus nicht erhalten.

Ursache1:
Du hast im Code ein xxx.SetFocus;
Wahrscheinlich im FormCreate.
Zu diesem Zeitpunkt existiert aber das (Windows-)Fenster-Handle der Komponente noch nicht.

Ursache2:
Die xxx bei xxx.SetFocus ist zu dem Zeitpunkt nicht sichtbar

Quick&Dirty1:
try
XXX.SetFocus;
except
;
end;

Quick&Dirty2:
ins FormActivate verschieben und trotzdem try except drumrum

Ykcim 20. Feb 2019 12:28

AW: Fehler vor OnCreate finden
 
Mein Problem ist aber, dass ich nicht weiß was xxx ist und wo es aufgerufen wird. Ich habe OnShow und OnCreate schon komplett auskommentiert, damit der Inhalt garnicht zur Anwendung kommt. Aber das Programm crasht trotzdem. Im ganzen Main-Form gibt es nur einmal SetFocus und das habe ich gerade herausgenommen - ohne Erolg...
Auf der Entwicklungsmaschine und ca. 40 anderen Rechnern läuft es ohne Probleme, sondern nur auf zwei Rechnern, die nicht produktiv genutzt werden.

Ich bin leider noch nicht bei der Fehlerbehebung, sondern ich versuche herauszufinden, wo der Fehler entsteht...

Hast Du eine Idee, wie ich das anstellen kann?

LG Patrick

hoika 20. Feb 2019 12:30

AW: Fehler vor OnCreate finden
 
Hallo,
das war zu schnell.

Es geht ja um das TMS TAdvStringGrid, genauer und dein Grid_not_printed.

Das hier grätscht rein
Vcl.Themes TUxThemeStyle.DoDrawText

dann folgt
AdvGrid 41726 +667 TAdvStringGrid.WMLButtonUp

und der Auslöser ist
AdvGrid 26797 +1 TAdvStringGrid.EditCell

Das ganze soll beim Erzeugen des Formulars passieren? Sehr verwunderlich.

Notlösung wäre das Editieren des Grids im Objektinspektor zu deaktivieren.
Bei TAdvStringGrid gibt es ja mehrere Stellen, nicht nur Gridoptions-goEditing, DirectEdit usw..

Bei den beiden Rechnern scheint jemand an den Grafikeinstellungen rumgeschraubt zu haben.


Test wäre ein leeres Projekt und dann das Grid_not_printed per Copy&Paste dort drauf.

Außerdem würde ich mal bei den Events des Grids nachschauen, ob da "böses" passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Seite 2 von 5     12 34     Letzte »    

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