Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: aktuelle Quellcodezeile im Programm ermitteln

  Alt 28. Aug 2014, 19:59
Sprich da wird die aktuelle Codezeilennummer wie in diesem Fall Zeile "309" mit in das Programm einkompiliert. Kann man sowas in Delphi auch machen?
Ja das geht. Das wird aber nicht "reinkompiliert" sondern zur Laufzeit ermittelt.

Die JCL (JEDI Component Library) kann das zum Beispiel.

Ein neues leeres VCL Projekt erstellen, einen TButton drauf, deppelklicken und folgenden Quelltext darauf legen:

Delphi-Quellcode:
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  StrToInt('Zwei');
end;
...
Es kommt dann z.B. folgendes im Logfile an:
Code:
Exception class: EConvertError
Exception message: ''Zwei'' ist kein gültiger Integer-Wert.
Exception address: 0041EFB6
------------------------------------------------------------------------------
Stack list, generated 28.08.2014 20:51:12
[0041EFB1]{Project1.exe} SysUtils.ConvertErrorFmt
[0041FEF4]{Project1.exe} SysUtils.StrToInt
[0087B2FD]{Project1.exe} Unit1.TForm1.Button1Click (Line 31, "Unit1.pas")
[00497C6B]{Project1.exe} Controls.TControl.Click
[004CD2FA]{Project1.exe} StdCtrls.TCustomButton.Click
[004CDDE8]{Project1.exe} StdCtrls.TCustomButton.CNCommand
[00497700]{Project1.exe} Controls.TControl.WndProc
[0049BFC4]{Project1.exe} Controls.TWinControl.WndProc
[004CCFC4]{Project1.exe} StdCtrls.TButtonControl.WndProc
[00497324]{Project1.exe} Controls.TControl.Perform
[0049C117]{Project1.exe} Controls.DoControlMsg
[0049CB73]{Project1.exe} Controls.TWinControl.WMCommand
[0050F428]{Project1.exe} Forms.TCustomForm.WMCommand
[00497700]{Project1.exe} Controls.TControl.WndProc
[0049C0C4]{Project1.exe} Controls.TWinControl.DefaultHandler
[00497700]{Project1.exe} Controls.TControl.WndProc
[0049BFC4]{Project1.exe} Controls.TWinControl.WndProc
[0050C32C]{Project1.exe} Forms.TCustomForm.WndProc
[00405DBC]{Project1.exe} System.TMonitor.Enter
[00405C90]{Project1.exe} System.TMonitor.CheckOwningThread
[00405F66]{Project1.exe} System.TMonitor.Exit
[0049B664]{Project1.exe} Controls.TWinControl.MainWndProc
[0045792C]{Project1.exe} Classes.StdWndProc
[0049C0C4]{Project1.exe} Controls.TWinControl.DefaultHandler
[004980BC]{Project1.exe} Controls.TControl.WMLButtonUp
[00497700]{Project1.exe} Controls.TControl.WndProc
[0049BFC4]{Project1.exe} Controls.TWinControl.WndProc
[0049BBF3]{Project1.exe} Controls.TWinControl.WndProc
[004061BE]{Project1.exe} System.TMonitor.TryEnter
[00405DBC]{Project1.exe} System.TMonitor.Enter
[00405C90]{Project1.exe} System.TMonitor.CheckOwningThread
[00405F66]{Project1.exe} System.TMonitor.Exit
[00405F9F]{Project1.exe} System.TMonitor.Exit
[0047D543]{Project1.exe} Graphics.FreeMemoryContexts
[0049B664]{Project1.exe} Controls.TWinControl.MainWndProc
[0049B679]{Project1.exe} Controls.TWinControl.MainWndProc
[0049B857]{Project1.exe} Controls.TWinControl.IsControlMouseMsg
[0045792C]{Project1.exe} Classes.StdWndProc
[0049BFC4]{Project1.exe} Controls.TWinControl.WndProc
[00612599]{Project1.exe} dxHooks.TdxSystemHook.ProcessHookProcs
[004CCFC4]{Project1.exe} StdCtrls.TButtonControl.WndProc
[0049B664]{Project1.exe} Controls.TWinControl.MainWndProc
[0045792C]{Project1.exe} Classes.StdWndProc
[005152FB]{Project1.exe} Forms.TApplication.ProcessMessage
[0051533E]{Project1.exe} Forms.TApplication.HandleMessage
[00515669]{Project1.exe} Forms.TApplication.Run
[00889959]{Project1.exe} Project1.Project1 (Line 13, "")
------------------------------------------------------------------------------
Active Controls hierarchy:
TButton "Button1"
TForm1 "Form1"
Wir loggen noch viel viel mehr Informationen zu jedem Fehler.
Aber das sollte Deinen Ansprüchen erst mal genügen.

Das tolle ist, es ist kostenlos.

JCL installieren, Beispiel kompilieren und sehen wie es funktioniert. Dann einfach die für einen relevanten Teile in eine eigene Funktion extrahieren und fertig.

Ach ja, wenn man "Debug DCUs" in dem Projekt Optionen aktiviert, gibt es zu jeder Zeile im Stack den Dateinamen und Zeilennummer

Ich hoffe das hilft Dir.
MaBuSE

[edit]
Anmerkung:
Wenn Du es nicht selbst programmieren möchtest, schau Dir mal madExcept an. (http://www.madexcept.com/madExceptDescription.htm)
Den Dialog kannst du auch abschalten und entsprechend die Infos im Code verwenden.
[/edit]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)

Geändert von MaBuSE (28. Aug 2014 um 20:10 Uhr)
  Mit Zitat antworten Zitat