close
定制Delphi的新建文件模板
by eGust(转载请注明
 
在Delphi 7中,新建一个Console项目文件会自动生成如下的代码:
program Project*;
{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  { TODO -oUser -cConsole Main : Insert code here }
end.
 
常常我会建一个Console项目用来测试一段简单的代码,毕竟在VCL窗体上拖来拖去也挺麻烦的。但是每次都要在里面加一句Readln,避免在ide中运行完就直接退出而看不到输出结果。用多了的话,也无形中也浪费了不少时间,写起Readln来也嫌麻烦。不愿透露姓名的eGust常常说:懒是推动人勤快的原动力。一直以来有个想法,能不能改动Delphi的新建文件模板,把自己常用的一些代码塞进去——毕竟删代码的速度比敲代码快多了。但还是因为懒,简单在网上搜过没找到,也一直没动手自己找……
今天终于下定决心,一定要找到这些该死的模板到底在什么位置,于是开始在d7的目录开始第一步搜索:找有没有包含原封不动的“{$APPTYPE CONSOLE}”文本的文件。好在第一步就比较顺利,在一堆文件中我决定先拿“delphide70.bpl”开刀,就丫长的就不像好人。用eXeScope打开它,果然在资源中找到了一个疑似模板的RCDATA:PASCRTRS。导出来一看,应该就是它了,里面出现了一些比较眼熟的代码:
unit %s;
interface
implementation
end.
|
|unit %s;
interface
uses
  SysUtils, Classes;
type
  %s = class(%s)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('%s', [%1:s]);
end;
end.
...
这些%s明显是给Format用的内容,都是些还没决定的名称。而其它的应该就是新建文件的模板内容了,而“|”估计是用来区分不同单元文件之类的东西,不管它。比较熟悉Delphi的人一眼就能看出来,这些代码里,第一个显然是空Unit文件,第二个是New Component用的等等。找到“{$APPTYPE CONSOLE}”之后,马上拿D2009的默认Console项目文件加上一句Readln,把Console Project的相关部分改成:
|program %s;
{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.
 
想写回去的时候遇到了点儿小麻烦,我发现eXeScope 6.5居然只有导出没有导入,在RCDATA里它只管导入图片和dfm之类文件……这要是自己写程序就麻烦了,万一不是它不就白忙活了么?而且我还想不起来win里有没有写入资源文件的api了(读的倒是有),要是没有还得自己把PE文件拆了再给装回去。好在终于想起来,还有Visual Studio这个万金油。把.bpl改成.dll之后往vs里一丢,M$满塞,我的地盘我可以作主了!关了d7替换掉delphide70.bpl后,再打开d7新建一个Console项目,oh~yeah……亚卖、亚卖……以够...
 
其实中间还有个小插曲,一开始我想给生活加点儿料,代码里用了个“Format('...%s...', [...])”。结果囧了,新建Console项目时蹦出来个错误提示:No argument for format '%s'——于是创建失败了。愣了好一会儿才意识到哪出问题了,如果模板里带“%”字符的话,一定要写成“%%”,因为模板中的字符串是Format的第一个参数,不转义就挂了。
 
在delphide70.bpl的RCDATA中,PASCRTRS里包括了多数文件模板,除了前面说的空Unit、Component外,还有DLL Project之类的。比如DLL项目常常需要弄一个类似 DllMain(dwReason) 的东西出来,直接定制bpl资源中的模板文件就方便多了。
btw,对于BDS 2009来说,这个模板文件在 delphicoreide120.bpl 中。
 
最后再顺便补充一下改变d7新建窗体的默认字体的方法。DelphiDistiller提供了一个功能,可以把d7的默认窗体字体的替换成Tahoma。既然有了这个工具,想知道改哪就方便很多了:使用之后只有vcl70.bpl的日期变了。打开之后一看,很遗憾用来表示字体名的数据不是资源文件,不过这个格式也已经熟悉到一眼就知道是啥了:正是用Delphi的ShortString格式储存的。在字符串正文开始之前的1字节用来说明字符串长度,后面紧跟着整个字符串。从字符串后面跟着0的数量来看,这里塞20多字节的名称应该没啥问题的。
如果既不习惯Borland默认的MS Sans Serif,也不喜欢DelphiDistiller唯一能改成的Tahoma字体的话,那就自己动手丰衣足食吧:找个可以16进制编辑的编辑器,如WinHex、UltraEdit之类,打开vcl70.bpl搜当前的默认字体的文本(如“MS Sans Serif”);找到之后,在相应位置填入你喜欢的字体,如果不够覆盖掉原来的,后面清不清0其实无所谓,但为了美观还是清吧;如果要改的字体名超过30个字符(我……无语了 -_-);最后别忘了,要把字符串前面那个说明字符串长度的字节改成新字体名的长度(别说不会数数……)。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 eGust 的頭像
    eGust

    eGust的部落格

    eGust 發表在 痞客邦 留言(1) 人氣()