Delphi输出日志的方法
[url=http://blog.csdn.net/lff0305/archive/2006/10/20/1342161.aspx][img=15,13]http://blog.csdn.net/images/authorship.gif[/img][color=#800080] Delphi输出日志的方法[/color][/url] [img]http://blog.csdn.net/images/star.gif[/img][img]http://blog.csdn.net/images/star.gif[/img][img]http://blog.csdn.net/images/star_half.gif[/img] [img]http://blog.csdn.net/images/ask.gif[/img][size=3][font=宋体]1、使用[/font][font=Times New Roman]OutputDebugString[/font][/size]
[font=Times New Roman][size=3][/size][/font]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][color=#000000]procedure TForm1.BtnDebugClick(Sender: TObject);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]begin
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]这里调用OutputDebugString发送调试信息到调试器。在Delphi
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]里面,用View - Debug Windows - Event Log 来查看。[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] OutputDebugString(PChar([/color][color=#000000]'[/color][color=#000000]测试OutputDebugString[/color][color=#000000]'[/color][color=#000000]));
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]end;[/color]
[size=3][font=宋体]很简单。这个函数是[/font][font=Times New Roman]Windows[/font][font=宋体]提供的,专门用来进行调试。调用后,将把字符串发送给当前的调试器。对于[/font][font=Times New Roman]Delphi[/font][font=宋体]来说,就是[/font][font=Times New Roman]Delphi IDE[/font][font=宋体]本身。在程序运行的时候,可以通过[/font][font=Times New Roman]View - Debug Windows - Event Log [/font][font=宋体]来查看,如图:[/font][/size]
[size=3][/size]
[font=Times New Roman][size=3] [img]http://p.blog.csdn.net/images/p_blog_csdn_net/lff0305/1.JPG[/img][/size][/font]
[size=3][font=Times New Roman]2[/font][font=宋体]、发送日志到操作系统日志记录。[/font][/size]
[size=3][font=宋体]这个基本上使用在[/font][font=Times New Roman]Release[/font][font=宋体]版本中,记录一些重要的信息,帮助用户反馈信息给开发人员。[/font][/size]
[color=blue][size=3][font=Times New Roman][/font][/size][/color]
[font=Times New Roman][size=3][/size][/font]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][color=#000000]procedure TForm1.BtnEventClick(Sender: TObject);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]var
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] h,b:THandle;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] msg:String;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] p:Pointer;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] i:integer;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] size:integer;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] q:[/color][color=#000000]^[/color][color=#0000ff]byte[/color][color=#000000];
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]begin
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]注册事件源,随便起了个名字。这个名字就是下图事件列表的’来源’一列
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]然后判断是否成功。
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]注意后面要注销[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] h:[/color][color=#000000]=[/color][color=#000000]RegisterEventSource(nil, [/color][color=#000000]'[/color][color=#000000]test1[/color][color=#000000]'[/color][color=#000000]);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#0000ff]if[/color][color=#000000] h [/color][color=#000000]=[/color]
[color=#000000]0[/color][color=#000000] then
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] begin
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] ShowMessage([/color][color=#000000]'[/color][color=#000000]注册事件源失败![/color][color=#000000]'[/color][color=#000000]);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] Exit;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] end;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]这里记录一个字符串
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]这个字符串显示在下面第二个图选中的位置。[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] msg:[/color][color=#000000]=[/color][color=#000000]'[/color][color=#000000]记录字符串[/color][color=#000000]'[/color][color=#000000];
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] ReportEvent(h,EVENTLOG_INFORMATION_TYPE,[/color][color=#000000]0[/color][color=#000000], [/color][color=#000000]0[/color][color=#000000], nil, [/color][color=#000000]1[/color][color=#000000], [/color][color=#000000]0[/color][color=#000000], @msg, nil);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]这里记录一块内存,size大小[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] size:[/color][color=#000000]=[/color][color=#000000]32[/color][color=#000000];
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]申请[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] GetMem(p, size);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] q:[/color][color=#000000]=[/color][color=#000000]p;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]填充这块内存[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color]
[color=#0000ff]for[/color][color=#000000] i:[/color][color=#000000]=[/color][color=#000000]0[/color][color=#000000] to size [/color][color=#000000]-[/color]
[color=#000000]1[/color]
[color=#0000ff]do[/color][color=#000000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] begin
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] q[/color][color=#000000]^[/color][color=#000000]:[/color][color=#000000]=[/color][color=#000000]i;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] inc(q);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] end;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]这里记录内存的内容。大小为size, 首字节的指针p
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]同样也有说明信息msg[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] msg:[/color][color=#000000]=[/color][color=#000000]'[/color][color=#000000]记录某块内存[/color][color=#000000]'[/color][color=#000000];
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] ReportEvent(h,EVENTLOG_INFORMATION_TYPE , [/color][color=#000000]0[/color][color=#000000], [/color][color=#000000]0[/color][color=#000000], nil, [/color][color=#000000]1[/color][color=#000000], size, @msg, p);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] FreeMem(p);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#008000]//[/color][color=#008000]注销事件源[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] DeregisterEventSource(h);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]end;[/color]
[size=3][font=宋体]程序运行后,可以通过控制面板[/font][font=Times New Roman] – [/font][font=宋体]管理工具[/font][font=Times New Roman] – [/font][font=宋体]事件查看器来查看。上面的代码运行结果如图:[/font][font=Times New Roman] [/font][/size]
[size=3][font=Times New Roman][img]http://p.blog.csdn.net/images/p_blog_csdn_net/lff0305/2.JPG[/img][/font][/size]
[font=宋体][size=3]双击第一个事件,如图:[/size][/font]
[font=宋体][img]http://p.blog.csdn.net/images/p_blog_csdn_net/lff0305/3.JPG[/img][/font]
[size=3][/size]
[font=宋体][size=3]双击第二个事件,如图:[/size][/font]
[font=宋体][img]http://p.blog.csdn.net/images/p_blog_csdn_net/lff0305/4.JPG[/img][/font]
[size=3][/size]
[size=3][font=宋体]重写[/font][font=Times New Roman]Assert[/font][/size]
[size=3][font=Times New Roman]Delphi[/font][font=宋体]内置了[/font][font=Times New Roman]Assert[/font][font=宋体]调试过程,语法是[/font][/size]
[size=3][font=Times New Roman]
Assert(cond, msg);[/font][/size]
[size=3][font=宋体]如果[/font][font=Times New Roman]cond[/font][font=宋体]为[/font][font=Times New Roman]false[/font][font=宋体],那么显示错误信息[/font][font=Times New Roman]msg[/font][font=宋体],并且触发异常(可在[/font][font=Times New Roman]IDE[/font][font=宋体]里中断)。[/font][/size]
[font=宋体][size=3]因为这个函数是编译器内置的,里面提供了源代码文件名、行号的信息,所以可以通过重写这个函数,完成日志记录的功能:[/size][/font]
[size=3][font=Times New Roman]1[/font][font=宋体]、加入初始化代码,保存旧的[/font][font=Times New Roman]Assert[/font][font=宋体]函数地址,然后将新的赋入:[/font][/size]
[size=3]
[/size]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][color=#000000]initialization
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] oldAssertErrorProc :[/color][color=#000000]=[/color][color=#000000] AssertErrorProc;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] AssertErrorProc:[/color][color=#000000]=[/color][color=#000000]@OtherAssertProc;[/color]
[color=blue][size=3][font=Times New Roman][/font][/size][/color]
[size=3][font=宋体]其中,新函数[/font][font=Times New Roman]OtherAssertProc[/font][font=宋体]如下:[/font][/size]
[color=blue][size=3][font=Times New Roman][/font][/size][/color]
[font=Times New Roman][size=3][/size][/font]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][color=#000000]procedure OtherAssertProc([/color][color=#0000ff]const[/color][color=#000000] Message, Filename: [/color][color=#0000ff]string[/color][color=#000000];
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] LineNumber: Integer; ErrorAddr: Pointer);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]Var
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] runErrMsg:String;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]begin
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] runErrMsg :[/color][color=#000000]=[/color][color=#000000] format([/color][color=#000000]'[/color][color=#000000]Error: %s, in file(%d): %s, Addr: %p[/color][color=#000000]'[/color][color=#000000],
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [Message, LineNumber, FileName, ErrorAddr]);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#0000ff]if[/color][color=#000000] IsConsole then
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] Writeln(runErrMsg)
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] [/color][color=#0000ff]else[/color][color=#000000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] MessageBox([/color][color=#000000]0[/color][color=#000000], pChar(runErrMsg), [/color][color=#000000]'[/color][color=#000000]Error Log by AssertLogs[/color][color=#000000]'[/color][color=#000000], [/color][color=#000000]0[/color][color=#000000]);
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]end;[/color]
[size=3][font=Times New Roman]2[/font][font=宋体]、在程序中,就可以使用[/font][/size]
[size=3][font=Times New Roman]
Assert(false, msg);[/font][font=宋体]来进行调用了。因为我们使用[/font][font=Times New Roman]Assert[/font][font=宋体]来记录信息,所以条件一定是[/font][font=Times New Roman]false[/font][font=宋体]保证函数被调用。运行结果如下图:[/font][/size]
[size=3][font=宋体][img]http://p.blog.csdn.net/images/p_blog_csdn_net/lff0305/5.JPG[/img][/font][/size]
[size=3][/size]
[size=3][font=宋体]这是通过[/font][font=Times New Roman]MessageBox[/font][font=宋体]函数输出的,当然也可以通过其他方式显示或者记录。[/font][/size]
[size=3][font=Times New Roman]3[/font][font=宋体]、最后,将[/font][font=Times New Roman]AssertErrorProc[/font][font=宋体]恢复初始值:[/font][/size]
[color=blue][size=3][font=Times New Roman][/font][/size][/color]
[font=Times New Roman][size=3][/size][/font]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][color=#000000]finalization
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] AssertErrorProc :[/color][color=#000000]=[/color][color=#000000] oldAssertErrorProc;[/color]
[size=3][font=Times New Roman]4[/font][font=宋体]、[/font][font=Times New Roman]JCL[/font][font=宋体]库[/font][font=Times New Roman] [/font][/size]
[size=3][font=Times New Roman]JCL[/font][font=宋体]库是著名的开源[/font][font=Times New Roman]Delphi[/font][font=宋体]库,包括大量的函数、类,基本上分为系统、日期、调试、字符串等等。其中的[/font][font=Times New Roman]JCLDebug[/font][font=宋体]库可以方便的列出代码的调用情况,也可以做到类似与[/font][font=Times New Roman]Java[/font][font=宋体]的逐层打印调用栈。运行情况如下图:[/font][/size]
[size=3][font=宋体][img]http://p.blog.csdn.net/images/p_blog_csdn_net/lff0305/6.JPG[/img][/font][/size]
[size=3][/size]
[font=Times New Roman][size=3] [/size][/font]
[font=宋体][size=3]代码为:[/size][/font]
[color=blue][size=3][font=Times New Roman][/font][/size][/color]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][color=#008000]//[/color][color=#008000]这是一个日志函数,拼装日志信息[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000]function log(S:String):String;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]var
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] f, proc:String;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] line:Integer;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] r:String;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]begin
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img] f:[/color][color=#000000]=[/color][color=#000000]FileByLevel([/color][color=#000000]1[/color][color=#000000]); [/color][color=#008000]//[/color][color=#008000]获得调用它的文件名[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] line:[/color][color=#000000]=[/color][color=#000000]LineByLevel([/color][color=#000000]1[/color][color=#000000]); [/color][color=#008000]//[/color][color=#008000]获得调用它的行号[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] proc:[/color][color=#000000]=[/color][color=#000000]ProcByLevel([/color][color=#000000]1[/color][color=#000000]); [/color][color=#008000]//[/color][color=#008000]获得调用它的模块名[/color][color=#008000]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/color][color=#000000] Result:[/color][color=#000000]=[/color][color=#000000] f [/color][color=#000000]+[/color]
[color=#000000]'[/color][color=#000000]:[/color][color=#000000]'[/color]
[color=#000000]+[/color][color=#000000] IntToStr(line) [/color][color=#000000]+[/color]
[color=#000000]'[/color]
[color=#000000]'[/color]
[color=#000000]+[/color][color=#000000] proc [/color][color=#000000]+[/color]
[color=#000000]'[/color]
[color=#000000]'[/color]
[color=#000000]+[/color][color=#000000] S;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]end;[/color]
页:
[1]
