Blogs

衡量软件质量的一个标准

以前写程序时,不太注意细节,编译后代码总也一些警告和提示,一直也没太在意,前两天写的程序提交给用户测试,结果用户发现所有的快捷键都不好使了,检查才发现一个从基类派生的方法没有声明为Override,其实代码在编译时对静态方法覆盖了虚方法报过警告,但我给忽视了。有了这个教训,我把所有的警告都给修正了。以后一定要注意看似不起眼的警告同软件的质量也息息相关。

编写GUI和控制台双模式程序

program RegH2;

uses
SysUtils,
Windows,
Forms,
CMain in 'CMain.pas' {FormMain},
H2Reg in 'H2Reg.pas',
WbemScripting_TLB in '..\..\Imports\WbemScripting_TLB.pas';

{$R *.res}

begin
if ParamCount = 0 then
begin
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
Application.Run;
end
else
begin
AllocConsole;
try
Writeln('Usage:RegH2 -help');
Writeln('Please Enter to terminate...');

俘获Tab按键消息

一般组件无法在OnKeyDown, OnKeyPress事件中俘获到Tab按键,要想俘获Tab按键消息,需要在你的组件中对WMGetDlgCode消息作处理,如下代码示意:

type
TSACombo=class(TComboBox)
protected
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;

implementation

procedure TSACombo.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
Inherited;
Message.Result := Message.Result or DLGC_WANTTAB;
end;

<

不要使用QuickReport生成Excel报表

前两天用QuickReport做了一个报表,客户要求是能够导出为Excel文件,因为一直以来我虽然没有用QuickReport做过Excel,但是知道QuickReport中提供了导出Excel的ExportFilter组件,所以也就没当回事,直接用QuickReport做了一个报表,结果做好后测试的时候发现,格式总是乱七八糟的,无论怎么调整位置,也无法实现客户要求的整齐的效果,试验了几个卖了很高价格的商业组件,效果也是一塌糊涂,分析原因在于QuickReport的布局是基于像素的,而Excel布局是基于网格的,两者本质上矛盾是很难调和的,没办法改用Excel 自动化编程通过Excel来直接生成的Excel报表,终于实现了精确定位,缺点就是需要在客户端安装Excel2000,同时速度特别慢,进一步的解决办法可以考虑使用商业的Excel生成组件了。

ActiveX安全签名问题

今天同Crane讨论到ActiveX组件要怎样才能在IE中不需要调低安全级别也能
加载不提示警告信息,一开始我们认为是签名问题,但是发现签名只能使该控件可以弹出下载框,但不能消除警告信息,后来crane发现只要实现了IObjectSafety接口就没问题了。

Delphi中获取时间范围

今天写的一个报表要取时间范围,我首先到DateUtils单元中找了找,发现一个MonthSpan好像比较符合我的要求,看了看帮助,突然发现Delphi中的

 MonthSpan的算法是将两个日期之间的天数除以一个每月平均天数算出来的,而不是我想要的两个日期的月份相减,险些上当,只好自己写了一个函数来完成。看了看其他的类似方法如MonthBetween等也有类似问题,以后使用时一定要看看源码才敢用(即便是Borland公司写的函数也有问题的说)

 

HtmlHelp2 真tmd的变态

为了制作一个完善的HtmlHelp2的项目,整整花了我三个晚上,总算摸到了一点点门道,虽然不是特别完美,但总算是可以凑合着用了。HtmlHelp2真是有点复杂的变态,最烦的莫过于手工编辑MSI数据库了:(

检查DotNet Framework是否已经安装

检查注册表键是否存在 HKLM\SOFTWARE\Microsoft\,NetFramework\Policy\v1.1

检查$WinDir\Microsoft.NET\Framework\目录是否存在

创建QuickReport的自定义函数

n年没有用QuickReport了,最近要用它写报表,中间写一个复杂的报表表达式时,觉得太复杂了,决定自己写一个QuickReport的自定义函数。QuickReport的函数实现方法还是挺简单的,只要从TQREvElementFunction基类派生,并实现Calculate方法就可以了,所有传进来的参数可以通过Argument方法获取。

function TQREvAcountFunction.Calculate: TQREvResult;
var
strDeType:string;
function GetResultType:TQREvResultType;
begin
Result:=resDouble;
end;
function ZeroResult:TQREvResult;
begin
Result.Kind:=resDouble;
Result.dblResult:=0;
end;
begin
if (ArgList.Count = 2) and (Argument(0).Kind = resString) and ((Argument(1).Kind=resDouble) or (Argument(1).Kind=resInt)) then
begin
strDeType:=Trim(Argument(0).strResult);
if MatchType(strDeType) then
Result := Argument(1)
else
Result :=ZeroResult ;
end else
Result := ErrorCreate(Format(SqrExpWrongArguments, ['Account Function'])); // Do not translate
end;

const
SqrDesc = 'Returns <X> or 0 depending on the <Type>';
SqrSoft = 'Sysa';
initialization
RegisterQRFunction(TQREvEtcFunction,'Etc', 'Etc(<Type>, <Count>)|' + SqrDesc, SqrSoft, '2SN');

唯一要注意的是RegisterQRFunction的第四个参数是一个字符串,2表示统计函数,S表示第一个参数是字符串,N表示第2个参数是数字。

Norton真tmd烂

以前对Norton的印象还算不错,不过自打装了Norton2005之后,发现我的机器整个慢了一个数量级,打开Office文档的时间够我喝杯茶的,另外它带了一个Internet Security的狗屁软件,速度狂慢,每次机器开机时,这东西加载数据要花5分钟。我今天实在是忍无可忍,无须再忍,将他们彻底从我的机器上清除了出去。经过这回不愉快的经历,我发现还是瑞星的杀毒和防火墙好一些,系统资源的占用小多了。

Syndicate content