TApplicationEvents作为动态组件或静态跟踪Delphi中的调用例程

时间:2009-07-12 06:52:52

标签: delphi dynamic static event-handling components

不幸的是,我没有从我的开发PC中写这个问题所以我可能会犯一些错误。请抱歉... 那么 - 我的问题 - 您使用什么方法在应用程序中实现错误记录?

在web(http://delphi.about.com)中是很好的事件处理程序,但它只是复制文件中的系统错误,但我想通过捕获内存和堆栈(以及处理器信息,如果我有时间)来扩展其功能。我是否应该知道我是否动态调用它,而不是在表单上添加其组件?

procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception) ;
var
   ErrorLogFileName : string;
   ErrorFile : TextFile;
   ErrorData : string;
begin
   ErrorLogFileName := ChangeFileExt(Application.ExeName,'.error.log') ;
   AssignFile(ErrorFile, ErrorLogFileName) ;

   //either create an error log file, or append to an existing one
   if FileExists(ErrorLogFileName) then
     Append(ErrorFile)
   else
     Rewrite(ErrorFile) ;

   try
     //add the current date/time and the exception message to the log
     ErrorData := Format('%s : %s',[DateTimeToStr(Now),E.Message]) ;
     WriteLn(ErrorFile,ErrorData) ;
   finally
     CloseFile(ErrorFile)
   end;

   //Show the exception
   Application.ShowException(E) ;
end;

...和http://delphi.about.com/cs/adptips2001/a/bltip0101_2.htm

众所周知,Delphi还提供类似C的内存管理 - 使用&符号和Pascal函数,但最有效的日志记录是什么?

先谢谢!希望这个主题对其他高质量的程序员有用。

2 个答案:

答案 0 :(得分:6)

可能值得一看第三方组件,而不是自己写一些东西。 EurekaLogmadExcept都完全符合您的要求。两者都提供了很好的输出,并且支持连接到FogBugzMantisBugZilla等错误跟踪系统。有了它,你可以实际整理你得到的错误报告,发现常见的模式,并希望更快地修复错误。

就个人而言,安装Jedi JVCL / JCL对于它的异常跟踪来说有点过分,因为它是一个非常大的安装。我提到的上述两种都是商业产品,但你可以得到你付出的代价。

答案 1 :(得分:3)

IIUC,你想要一个包含行号,系统信息等的堆栈跟踪报告。如下所示:

Exception class: EVariantTypeCastError
Exception address: 004170ED
------------------------------------------------------------------------------
Stack list, generated 12/7/2009 11:32:19
[004170E8]{A.exe       } Variants.HandleConversionException (Line 614, "sys\variants.pas" + 10)
[0057ACAC]{A.exe       } cxDataStorage.TcxSmallintValueType.SetDataValue (Line 1067, "cxDataStorage.pas" + 2)
[005AC6C5]{A.exe       } cxCustomData.TcxCustomDataController.SetStoredValue (Line 12752, "cxCustomData.pas" + 2)
[005A8AD3]{A.exe       } cxCustomData.TcxCustomDataController.SetValue (Line 10401, "cxCustomData.pas" + 12)
[0059DA0B]{A.exe       } cxCustomData.TcxCustomDataProvider.SetEditValue (Line 3180, "cxCustomData.pas" + 4)
[005A8F9B]{A.exe       } cxCustomData.TcxCustomDataController.SetEditValue (Line 10560, "cxCustomData.pas" + 2)
[0066EBBE]{A.exe       } cxGridCustomTableView.TcxCustomGridTableItem.SetEditValue (Line 14396, "cxGridCustomTableView.pas" + 1)
[006637C5]{A.exe       } cxGridCustomTableView.TcxGridEditingController.UpdateValue (Line 7474, "cxGridCustomTableView.pas" + 4)
[00673F30]{A.exe       } cxGridCustomTableView.TcxCustomGridTableView.UpdateRecord (Line 17771, "cxGridCustomTableView.pas" + 1)
[0059D97F]{A.exe       } cxCustomData.TcxCustomDataProvider.PostEditingData (Line 3170, "cxCustomData.pas" + 1)
[00A80870]{A.exe       } fFilterLine.TFilterLine.UMLayoutChanged (Line 1034, "fFilterLine.pas" + 0)
[00482DBF]{A.exe       } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111)
[004824E8]{A.exe       } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3)
[00431D84]{A.exe       } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8)
[0049F981]{A.exe       } Forms.TApplication.MessageBox (Line 8293, "Forms.pas" + 22)
[0049FA99]{A.exe       } Forms.TApplication.ShowException (Line 8312, "Forms.pas" + 3)
[00A7D7B1]{A.exe       } ExceptionDlg.TfrmException.ExceptionHandler (Line 428, "..\Shared\ExceptionDlg.pas" + 2)

...
<snipped>
...

------------------------------------------------------------------------------
System   : Windows XP Professional, Version: 5.1, Build: A28, "Service Pack 2"
Processor: Intel, Intel(R) Core(TM)2 Quad CPU    Q6700  @ 2.66GHz, 2666 MHz MMX 64 bits
Memory: 1043; free 196
Display  : 1920X1200 pixels, 32 bpp
------------------------------------------------------------------------------
Active Controls hierarchy:
TcxCustomInnerTextEdit ""
TcxTextEdit ""
TcxGridSite ""
TcxGrid "cxgHeader"
TPanel "pnlMain"
TTabSheet "tshAccMov"
TPageControl "pcoMov"
TfrmMain "frmMain"
------------------------------------------------------------------------------

......好吧,imho,不值得重新发明轮子。 这已经完成,它是免费的。下载(如果您还没有)JEDIJVCL+JCL from SourceForge并安装它们。在文件中|新的|其他| Delphi文件...... 你将有一个新项目:'Delphi的Jcl Exception对话框'

而且(imho)这比你能做的更成熟/更先进'如果你有时间'。您还可以自定义生成的异常处理程序以满足您的需要。还有一个支持新闻组。顺便说一句,IIRC,你只需要JCL用于对话,但我不确定。此外,您还有商业选项(madExcept,EurekaLog等),但这些只是高级错误记录器,而JVCL除了免费之外,还将为您提供超过600个组件。

HTH