Blogs
衡量软件质量的一个标准
Submitted by gougou on Mon, 2005-04-04 22:52以前写程序时,不太注意细节,编译后代码总也一些警告和提示,一直也没太在意,前两天写的程序提交给用户测试,结果用户发现所有的快捷键都不好使了,检查才发现一个从基类派生的方法没有声明为Override,其实代码在编译时对静态方法覆盖了虚方法报过警告,但我给忽视了。有了这个教训,我把所有的警告都给修正了。以后一定要注意看似不起眼的警告同软件的质量也息息相关。
编写GUI和控制台双模式程序
Submitted by gougou on Sun, 2005-03-27 20:46uses
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按键消息
Submitted by gougou on Sun, 2005-03-20 11:58一般组件无法在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报表
Submitted by gougou on Fri, 2005-03-18 23:02前两天用QuickReport做了一个报表,客户要求是能够导出为Excel文件,因为一直以来我虽然没有用QuickReport做过Excel,但是知道QuickReport中提供了导出Excel的ExportFilter组件,所以也就没当回事,直接用QuickReport做了一个报表,结果做好后测试的时候发现,格式总是乱七八糟的,无论怎么调整位置,也无法实现客户要求的整齐的效果,试验了几个卖了很高价格的商业组件,效果也是一塌糊涂,分析原因在于QuickReport的布局是基于像素的,而Excel布局是基于网格的,两者本质上矛盾是很难调和的,没办法改用Excel 自动化编程通过Excel来直接生成的Excel报表,终于实现了精确定位,缺点就是需要在客户端安装Excel2000,同时速度特别慢,进一步的解决办法可以考虑使用商业的Excel生成组件了。
ActiveX安全签名问题
Submitted by gougou on Thu, 2005-02-24 20:22今天同Crane讨论到ActiveX组件要怎样才能在IE中不需要调低安全级别也能
加载不提示警告信息,一开始我们认为是签名问题,但是发现签名只能使该控件可以弹出下载框,但不能消除警告信息,后来crane发现只要实现了IObjectSafety接口就没问题了。
Delphi中获取时间范围
Submitted by gougou on Wed, 2005-02-16 18:44今天写的一个报表要取时间范围,我首先到DateUtils单元中找了找,发现一个MonthSpan好像比较符合我的要求,看了看帮助,突然发现Delphi中的
MonthSpan的算法是将两个日期之间的天数除以一个每月平均天数算出来的,而不是我想要的两个日期的月份相减,险些上当,只好自己写了一个函数来完成。看了看其他的类似方法如MonthBetween等也有类似问题,以后使用时一定要看看源码才敢用(即便是Borland公司写的函数也有问题的说)
HtmlHelp2 真tmd的变态
Submitted by gougou on Wed, 2005-02-16 00:10检查DotNet Framework是否已经安装
Submitted by gougou on Sat, 2005-02-12 21:41检查注册表键是否存在 HKLM\SOFTWARE\Microsoft\,NetFramework\Policy\v1.1
检查$WinDir\Microsoft.NET\Framework\目录是否存在
创建QuickReport的自定义函数
Submitted by gougou on Sat, 2005-02-12 12:54n年没有用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个参数是数字。