gougou's blog

将一个相对于基本路径的相对路径转化为绝对路径


Delphi中没有提供将一个相对于基本路径的相对路径转化为绝对路径的函数,我迫不得已自己写了一个。

function GetAbsolutePath(BasePath, RelativePath:string):string;

implementation
uses ComObj, ComConst, dialogs;

function PathCombine(lpszDest: PChar; const lpszDir, lpszFile: PChar):
PChar; stdcall; external 'shlwapi.dll' name 'PathCombineA';
function PathCombineA(lpszDest: PAnsiChar; const lpszDir, lpszFile:
PAnsiChar): PAnsiChar; stdcall; external 'shlwapi.dll';
function PathCombineW(lpszDest: PWideChar; const lpszDir, lpszFile:
PWideChar): PWideChar; stdcall; external 'shlwapi.dll';

function GetAbsolutePath(BasePath, RelativePath:string):string;
var
Dest:array [0..MAX_PATH] of char;
begin
FillChar(Dest,MAX_PATH+1,0);
PathCombine(Dest,PChar(BasePath), PChar(RelativePath));
Result:=string(Dest);
end;

Blog升了一下级

除了image_filter无效,其他还算顺利,新功能等明天再来研究了

TStringGrid的糟糕设计

最近在给客户作一个更加强大的类似于TStringGrid的支持多种自定义编辑器的网格控件,结果发现TStringGrid的设计是比较糟糕的,它所使用的原位编辑器的虚方法只能是从TInputEdit派生,而TInplaceEdit又是从TMaskEdit派生出来的,这样的结果就是如果要从TStringGrid派生新组件的话,无法通过重载CreateEditor来支持其他的编辑器控件,虽然Grids单元中Borland也做了一些其他的原位编辑器,但是实现的非常生硬。另外TStringGrid中很多重要的方法没有声明为虚方法,甚至没有放在Protected部分,导致扩展性极差,看了一些其他的商业的网格控件,好多作者直接放弃了扩展TStringGrid的想法,直接从TCustomControl来重新做的。

发布ActionList For WinForm

WinForm中没有提供类似于VCL中的ActionList组件,我写了一个ActionList For WinForm的组件,大家有兴趣的可以用用,提提意见。

特性

 

  • 支持VS2003,Delphi2005的IDE中组件集成,HtmlHelp2的帮助集成。
  • 提供了一个方便的Action绑定组件设计器,提供了对于MenuItem,Toolbar Button和标准按钮的集成
  • 几乎没有侵入性,无须修改原有组件代码,就可以很容易的扩展支持其他的界面组件。
  • 内置了EditCopyAction,EditCutAction,EditClearAction,EditPasteAction, EditSelectAllAction, EditUndoAction, WindowCloseAction, WindowArrangeAction,WindowCascadeAction,WindowMinimizeAllAction,WindowTileHorizontalAction,WindowTileHorizontalAction, WindowTileVerticalAction等十几个预定义的Action。

下载:

ActionList For WinForm .Net 1.1 Trial Version

调用集合属性编辑器

TDBGrid的组件编辑器双击后会调出Columns的属性编辑器,这要调用未公开的ColnEdit中的方法ShowCollectionEditorClass方法来实现,代码示意如下

uses ColnEdit,...;

....

procedure TSAGComponentEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0://Show Column Editor;
begin
ShowCollectionEditorClass(Designer, TCollectionEditor, Component,
TSAGrid(Component).GridColumns, 'GridColumns', [coAdd, coDelete, coMove]);
end;
end;
end;

衡量软件质量的一个标准

以前写程序时,不太注意细节,编译后代码总也一些警告和提示,一直也没太在意,前两天写的程序提交给用户测试,结果用户发现所有的快捷键都不好使了,检查才发现一个从基类派生的方法没有声明为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接口就没问题了。

Syndicate content