24小时热门版块排行榜    

Znn3bq.jpeg
查看: 746  |  回复: 0

zyj8119

木虫 (著名写手)

[交流] 【转帖】妙用Delphi编译器开关为程序增加便捷的控制台调试/日志窗口

在编写WIN32的窗口程序时,由于其不同于命令行的运行方式,我们经常为调试系统而被折磨的几近抓狂。因此很多通用的方法被设计出来:
设置断点是个好主意,但很多业务层的代码无法有效的调试。
使用对话框、LIST、文件来记录日志,无故增加了设计量不说,每次Release的时候,还要一个一个删除这些调试信息,虽然使用一些配置文件可以达到开关调试的目的,但这些额外的代码却也为系统带来了很多无用的代码。
那么,有没有更加便捷的方法呢?答案是肯定的。
Delphi在编写WIN32程序时,为我们提供了一系列非常有用的编译器指令,那么我们可以用它们来为我们的程序增加一个随叫随到,随放随消的控制台调试窗口,这样会让我们的调试信息更加清晰的反映出来。
我们用到三个delphi的编译器指令:{$APPTYPE}、{$IFDEF}、{$ENDIF}
{$APPTYPE},可以设置程序的运行方式,有两种形式,{$APPTYPE GUI}说明程序是普通窗口模式,而{$APPTYPE CONSOLE}说明程序是命令行控制台模式的,如果在普通窗口程序中会增加一个命令行控制台窗口
{$IFDEF}和{$ENDIF},是条件编译语句
使用以上的编译器指令,我们可以轻松的实现我们的目标(对于这些编译器指令的详细说明可以参见delphi的官方文档),OK,Let's go!
首先,建立一个UNIT,将其命名为ucTConsoleDebuger(这是我的命名方式,uc代表为类声明的unit,后面是类名),并建立TConsoleDebuger类,代码及解释如下:

unit ucTConsoleDebuger;

interface

type
    TConsoleDebuger = class(TObject)
    public
        class procedure DebugThis(debugMsg: string); static; //输出一条信息
    end;

implementation

class procedure TConsoleDebuger.DebugThis(debugMsg: string);
begin
    {$IFDEF CONSOLE}  //编译器条件开关,后面的CONSOLE为判断是否为控制台程序,其值是{$APPTYPE}的值
    Writeln(debugMsg);
    {$ENDIF}  //编译器条件开关结束
end;

end.
TConsoleDebuger类很简单,它只是实现了一个输出函数,而真正的核心在于两条编译器开关。
{$IFDEF CONSOLE} 判断程序的类型,如果是控制台程序,则编译其与{$ENDIF}间的代码(注:由于普通窗口程序中,没有设置writeln的Output流定向,所以执行writeln会出现I/O错误),否则不会编译。
这时,我们只需将{$APPTYPE CONSOLE}放到工程文件的最前端,编译执行程序,就会发现我们的程序多出了一个控制台窗口,所有的writeln信息都会输出到这个窗口。嗯,就是这么简单。
当我们的程序发布时,只需去掉{$APPTYPE CONSOLE},控制台窗口就会消失,那个函数的代码也不会被编译到程序中,嗯,清爽。
当然,这只是一个比较简单的调试方法,一般的调试已足够使用。你还可以使用{$DEFINE XXX}和{$IFDEF XXX} 结合来构造你的调试代码(XXX时任意变量名)。
这里所提到的些许技巧也只是抛砖引玉,你完全可以活用这些编译器指令来设计更加强大、便捷的调试代码。
回复此楼
好好学习,天天向上。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zyj8119 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 西安交大新媒学院副院长用撤稿论文结题 +3 bjvtcliu 2026-05-24 5/250 2026-05-24 10:16 by kudofaye
[教师之家] 论文撤稿了 +3 bjvtcliu 2026-05-24 5/250 2026-05-24 10:06 by Equinoxhua
[教师之家] 某211大学教师把个人教师官方主页改成:我跑了我跑了我跑了!官宣跑路! +4 zju2000 2026-05-21 5/250 2026-05-24 09:35 by songwz
[考博] 26/27申博自荐 10+4 ZXW0202 2026-05-22 9/450 2026-05-24 08:47 by bjvtcliu
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 hvkbtfonbv 2026-05-23 3/150 2026-05-24 08:01 by 9ps9vgkqva
[硕博家园] 售SCI一区T0P文章,我:8.O.5.5.1.O.5.4,科目齐全,可+急 +3 pmo95bazuy 2026-05-23 7/350 2026-05-24 06:35 by fpo5ljpv91
[基金申请] 河北省自然科学基金 +5 Peterchao 2026-05-18 7/350 2026-05-23 16:57 by articlefan
[基金申请] 揭秘青基评审内幕:几个A才能顺利中标 +3 国自然国社科中 2026-05-23 4/200 2026-05-23 15:37 by 2000zf36392
[基金申请] 青B发送上会通知了吗 +5 chemBioBro 2026-05-22 7/350 2026-05-23 12:35 by zhuifengzhy
[考博] 博士申请 +3 焦晓明 2026-05-21 3/150 2026-05-23 11:26 by mlc840311
[论文投稿] 投稿求助,期刊 +4 希冀,有书读 2026-05-20 8/400 2026-05-22 10:16 by 希冀,有书读
[基金申请] 面上本子正文33页,违规吗?会被低分嘛? +14 1234567wang 2026-05-17 16/800 2026-05-21 17:58 by 脆脆的饼干
[基金申请] 国自然评分 +4 无名者登山 2026-05-20 5/250 2026-05-21 16:35 by swuq
[基金申请] 国自然上会要求 +7 无名者登山 2026-05-18 11/550 2026-05-21 15:50 by draco1987
[基金申请] 提交了我也来说说感想 +9 fummck 2026-05-20 10/500 2026-05-21 14:17 by draco1987
[基金申请] 评审有感 +15 popular289 2026-05-18 26/1300 2026-05-21 10:35 by 西葫芦炒鸡蛋
[有机交流] 反应很差,大量原料没有反应 5+3 Mr.Zot 2026-05-19 8/400 2026-05-20 22:19 by Equinoxhua
[考博] 如果工作了想读博,可以边工作边读全日制嘛? 30+3 铁达火车 2026-05-18 5/250 2026-05-20 09:33 by tfang
[考博] 博士申请 +5 星…… 2026-05-18 6/300 2026-05-18 23:49 by 糊糊涂涂好
[硕博家园] 我在等一个没有答案的答案 +3 Love_MH 2026-05-17 3/150 2026-05-18 02:22 by 竹林孤影
信息提示
请填处理意见