Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

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)

hoika 20. Feb 2019 15:50

AW: Fehler vor OnCreate finden
 
Hallo,
Zitat:

Wo steht da etwas von FormCreate? Das ist ein normaler Mausklick, durch den das Editieren einer Zelle ausgeführt wird
Es steht im Titel "Fehler vor OnCreate", also nix Mausklick.
Und es stet ja auch kein ButtonClick-Event im MadExcept-Log auf Seite 1.
Ausserdem gibt es kein WMLButtonDown, sonder nur ein WMLButtonUp;

Noch mal an den Threadersteller:
Woher weißt Du, dass es in/vorm OnCreate passiert?
So wie ich es verstanden habe, hast Du ein Hauptprogramm,
was ein anderes Form startet und dort kommt schon beim Erzeugen (nicht in FormActivate) der Fehler?

Was mir noch aufgefallen ist. Das Grid steckt ja in einem Frame, ist der vielleicht nicht sichtbar oder hat den Focus nicht?!
Schreib mal in TFrame_Listendruck.Grid_not_printedClick eine einfache MessageBox als erste Zeile,
um zu sehen, wann die Klick-Methode aufgerufen wird.
Ausserdem noch eine MessageBox zu Beginn und Ende des FormActivate.

MessageBox = Remote-Debugger für Arme ;)

Delphi.Narium 20. Feb 2019 16:16

AW: Fehler vor OnCreate finden
 
Such in der MAP-Datei bitte nach :005345D4.

Wenn das nicht da ist, nach :005345 und wenn das nicht da ist nach :0053.

Findest Du irgendwo hinter dem ersten "Line numbers" der MAP-Datei was dazu?

Wenn nein, könnte es sein, dass der konkrete Fehler nicht in dem Teil des Programmes geschieht, für den Du Quelltext besitzt, also z. B. Komponenten, für die Du nur die DCUs hast. (Gibt es sowas oder hast Du für alles auch die Quelltexte?)

Zitat:

Zitat von hoika
MessageBox = Remote-Debugger für Arme

Ja, aber manchmal extrem hilfreich, wenn man überhauptnicht weiß, wo denn da was klemmt oder der Fehler halt mit dem Debugger nicht zu lokalisieren ist, weil der entweder garnicht bis zu der Stelle kommt oder eben (wie hier) der Fehler auf der Entwicklungsmaschine nicht zu reproduzieren ist.

@Ykcim

Schlimmstenfalls:

Pflastere jede, wirklich jede Prozedure am Anfang und am Ende mit ShowMessage ein:
Delphi-Quellcode:
// irgendwo am Anfang:
{$DEFINE MsgDebug}


Function TForm1.NameDerFunktion : keineAhnung;
begin
{$IFDEF MsgDebug}ShowMessage('Start NameDerFunktion');{$ENDIF}
 
... der eigentliche Funktionsinhalt.

{$IFDEF MsgDebug}ShowMessage('Ende NameDerFunktion');{$ENDIF}
end;
Durch den Kompilerschalter muss Du dann nicht alles wieder entfernen, bevor die Software in Betrieb geht. Den Kompilerschalter kannst Du dann von
Delphi-Quellcode:
{$DEFINE MsgDebug}
nach
Delphi-Quellcode:
{ $DEFINE MsgDebug}
ändern und die Meldungen sind mit dem nächsten Kompilieren wieder weg.

Statt ShowMessage ... kannst Du auch 'ne Loggingfunktion nehmen, die diese Meldungen in 'ne Datei schreibt (sofern Du sowas gerade zur Verfügung hast).

Und nein, wirklich schön ist dieser Lösungsvorschlag nicht, aber als Notnagel kann man's schonmal durchgehen lassen ;-)

Ykcim 20. Feb 2019 16:26

AW: Fehler vor OnCreate finden
 
Hallo hoika,

Zitat:

So wie ich es verstanden habe, hast Du ein Hauptprogramm,
was ein anderes Form startet und dort kommt schon beim Erzeugen (nicht in FormActivate) der Fehler?
Das Programm ruft bei Aufruf ein LogIn-Fenster auf (DoLogin):
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  if ( not DoLogin ) then
      Exit;
  Application.CreateForm(TMain, Main);
  Application.CreateForm(TForm_Zeichnungen, Form_Zeichnungen);
  Application.CreateForm(TForm_Filter, Form_Filter);
  Application.CreateForm(TForm_Passwort, Form_Passwort);
  Application.CreateForm(TForm_LogIn, Form_LogIn);
  Application.CreateForm(TForm_Start, Form_Start);
  Application.CreateForm(TForm_Return, Form_Return);
  Application.Run;
  Main.WindowState:=wsMaximized;
end.
Der Benutzer gibt seinen LogIn-Namen und ein Passwort ein. Wenn beides passt, wird über eine Datenbankabfrage geprüft, schließt sich das LogIn-Fenster und das Programm setzt den Start fort.
Die Eingabe kann ich auch machen. Allerdings muss ich jedes Mal meinen Benutzer neu eingeben. In der OnShow-Procedure des Main-Form wird der Benutzer in eine Tabelle geschrieben, gemeinsame mit dem Computernamen. Beim öffnen des LogIn-Fensters wird geprüft, ob sich dieser Rechner schon mal angemeldet. Wenn ja, wird der letzte Benutzer-LogIn in das Eingabefeld geschrieben. Das Passiert nicht. Also tritt der Fehler vorher auf.

Zitat:

Woher weißt Du, dass es in/vorm OnCreate passiert?
Ich habe mir auch einen Remote_Debugger für Arme gebaut:
Ich habe in der Procedure des Ok-Buttons des LogIn-Fensters und in der onCreate Procedure des Main-Forms und in der onShow-Procedure des Main-Forms mit Hilfe einer TStringList eine Datei schreiben lassen, wobei ich nahzu Zeileweise den Durchlauf den Programm-Codes logge. Diese Datei habe ich dann auf den FileServer abgelegt - immer unter dem Namen des Rechners mit Datum und Uhrzeit. Die Datei würde auch im Exception-Fall geschrieben.
Bei den Problem-Rechnern wird die Datei im Login-Fenster geschrieben, aber keine vom Main-Form. Bei allen anderen Rechnern klappt das.

Deshalb gehe ich davon aus, dass der Fehler nach dem erfolgreichen LogIn, aber vor dem onCreate des Main-Form auftritt. Aber was ist dazwischen und wie kann ich das loggen?

Vielen Dank
Patrick

hoika 20. Feb 2019 16:29

AW: Fehler vor OnCreate finden
 
Hallo Delphi.Narium,
warum den Umweg über die Map-Datei?
Auf Seite 1 ist der komplette Call-Stack.

Der Fehler tritt intern im TAdvStringGrid auf,
weil der Inplace-Edit anzuzeigt wird.
Der Fehler sagt ja, dass das SetFocus des Inplace-Editors fehlschlägt.
Entweder ist das Grid oder der Frame nicht sichtbar,
oder siehe StrLCopy es wird Speicher bei Theming überschrieben.

Da fallen mir noch 2 Sachen ein
1. FastMM4 wegen dem möglichen Speicherüberschreiben
2. in den Grafikoptionen mal alle visuellen Effekte außer Kantenglättung deaktivieren
(rechte Maustaste auf Computer/dieser PC -> Erweiterte Systemeinstellungen -> Leistung)

Ykcim 20. Feb 2019 16:32

AW: Fehler vor OnCreate finden
 
Hallo Delphi.Narium

Zitat:

Such in der MAP-Datei bitte nach :005345D4.
Wenn das nicht da ist, nach :005345 und wenn das nicht da ist nach :0053.
Findest Du irgendwo hinter dem ersten "Line numbers" der MAP-Datei was dazu?
Wenn nein, könnte es sein, dass der konkrete Fehler nicht in dem Teil des Programmes geschieht, für den Du Quelltext besitzt, also z. B. Komponenten, für die Du nur die DCUs hast. (Gibt es sowas oder hast Du für alles auch die Quelltexte?)
Habe leider nichts gefunden. Neben den Standard-Komponenten habe ich die TMS-Komponenten, UniDac und JamShellBrowser verbaut.

hoika 20. Feb 2019 16:36

AW: Fehler vor OnCreate finden
 
Hallo,
zu spät dein Post bemerkt.

Mir sind in der Dpr 2 Sachen aufgefallen
Application.CreateForm(TForm_LogIn, Form_LogIn); wird erzeugt, aber wohl nicht mehr gebraucht?

Application.Run;
Main.WindowState:=wsMaximized;
Das hat keine Wirkung, weil Delphi in der Run-Methode bleibt,
bis das Hauptprogramm (Main) beendet wird.


Aber jetzt zu deinem Post.
Was passiert, wenn du die DoLogin-Methode mal ausklammerst?
Vielleicht macht dein Login-Fenster ja was "kaputt".

Ykcim 20. Feb 2019 16:37

AW: Fehler vor OnCreate finden
 
Zitat:

2. in den Grafikoptionen mal alle visuellen Effekte außer Kantenglättung deaktivieren
(rechte Maustaste auf Computer/dieser PC -> Erweiterte Systemeinstellungen -> Leistung)
Das hatte leider keinen Effekt...

Ykcim 20. Feb 2019 16:41

AW: Fehler vor OnCreate finden
 
Zitat:

Mir sind in der Dpr 2 Sachen aufgefallen
Application.CreateForm(TForm_LogIn, Form_LogIn); wird erzeugt, aber wohl nicht mehr gebraucht?

Application.Run;
Main.WindowState:=wsMaximized;
Das hat keine Wirkung, weil Delphi in der Run-Methode bleibt,
bis das Hauptprogramm (Main) beendet wird.
Vielen Dank, habe ich geändert...
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  if ( not DoLogin ) then
      Exit;
  Application.CreateForm(TMain, Main);
  Application.CreateForm(TForm_Zeichnungen, Form_Zeichnungen);
  Application.CreateForm(TForm_Filter, Form_Filter);
  Application.CreateForm(TForm_Passwort, Form_Passwort);
  Application.CreateForm(TForm_Start, Form_Start);
  Application.CreateForm(TForm_Return, Form_Return);
  Main.WindowState:=wsMaximized;
  Application.Run;
end.

Delphi.Narium 20. Feb 2019 16:46

AW: Fehler vor OnCreate finden
 
Ok, Fehler nicht in MAP-Datei, damit ist dann klar, das hoikas Ansatz der einzig verbleibende Weg zum Finden des Fehlers ist.
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  if DoLogin then begin
    Application.CreateForm(TMain, Main);
    Application.CreateForm(TForm_Zeichnungen, Form_Zeichnungen);
    Application.CreateForm(TForm_Filter, Form_Filter);
    Application.CreateForm(TForm_Passwort, Form_Passwort);
    Application.CreateForm(TForm_Start, Form_Start);
    Application.CreateForm(TForm_Return, Form_Return);
    Main.WindowState:=wsMaximized;
    Application.Run;
  end;
end.
In welchen Formularen wird das TAdvStringGrid genutzt?

Könnte eventuell eine Änderung der Application.CreateForm ... - Reihenfolge was ändern (außer TMain, das als erstes Formular ja zum Hauptformular der Anwendung wird).

Ykcim 20. Feb 2019 16:52

AW: Fehler vor OnCreate finden
 
Zitat:

In welchen Formularen wird das TAdvStringGrid genutzt?
Die Anwendung ist ziemlich groß - besteht aus 29 Frames und 4 Forms. In Summe sind es über 30 TAdvStringLists, die beim Design auf den Frames / Forms liegen. Darüber hinaus können zu einem späteren Zeitpunkt auch noch viele dynamisch erstellt werden, wenn Daten von Maschinen abgerufen werden. Aber das passiert nur nach einer User-Aktivität...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.
Seite 4 von 5   « Erste     234 5      

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