2006-09-30

记录一下关于绘画方面的规划

都封装好了,懒得再合并到一堆,干脆各负责各的,这样效率也更高(虽然麻烦点):

1. 重新设计了个全新的CCanvas类,这个类主要用于双缓冲绘画(如果只是需要使用内存位图/内存画刷等简单资源,其它都自行处理的话,没必要使用如TCanvas那么包罗万象的类,虽然delphi的TCanvas写的很好,不过用它就代表资源的浪费/效率的损失。),解决闪烁问题。
2. 专门设计了个TPicture类,该类用于直接加载图片文件/流数据绘画。

其它:两者如果有需要交互的话也可以互相使用,并不影响其它。现在生成的程序已经150多K了,Pack测试看看发现还有80多K,汗~当然,发表的时候就不Pack了,免得看到这么小的程序孩以为是病毒。。。
另:刚备份了一下源代码,一不小心才发现,居然都写了1000多个文件了。。。难怪我管理的时候转来转去觉得比较头晕呢。。。还好使用了Delphi2006,比较便于源文件管理,如果还是Delphi7我实在不敢想象!

2006-09-25

正式转到Beta版使用 - Blogspot

Beta版得Template也可以直接修改HTML了,而且关于它得Template得A2功能Classes版已经不再提供,必须升级。
目前Blog改动:
1. 字体统一为 宋体 12px
2. 增设 Recent Comments 得 Feed (升级后Blog的Answer给出的HTML增加修改模板功能已经不能使用,Beta版如何添加又没告知,所以暂时这样,反正效果都一样)
3. The End.

Google Blog Template Walkthrough

Answer地址:Template Walkthrough
自定义性非常强,不过好像只有Classes版本可以用,我升级到Beta用很多标签都会被禁止,有点郁闷。

2006-09-18

wsprintf和wvsprintf的区别

最近写点东西,由于不想使用Delphi自带的Format函数(该函数会增加程序负担),所以采用标准API方式格式化字符串,但Delphi的Windows单元有很多问题,wsprintf就是其中有问题的一个。

不晓得Delphi怎么搞的,wsprintf的参数都不给全,Windows定义的为:
int wsprintf(
LPTSTR lpOut, // 输出缓冲区地址
LPCTSTR lpFmt, // 格式化串地址
... // 变量列表

Delphi居然直接把变量列表省略了。汗 - -!
如果只有一个变量需要转换都必须使用wvsprintf,而wvsprintf本来就是wsprintf的升级版,何必多次一举呢?

所以我重新定义了一下:
function winsprintf(Output: PChar; Format: PChar; Data: PChar): Integer; stdcall;
external user32 name 'wsprintfA';

这样就没问题了,另外关于标题的答案为:
前者为单一变量使用,后者为多变量使用,传递的是该引用地址的指针而已。

That's all

2006-09-17

unresolved external symbol _Atl{错误}@【ATL】

对VC非常不熟悉,包含各种各样头文件,连使用哪个都不知道,汗的不得了,今天就遇到一个问题。

为了一个Delphi的项目,想偷懒用VC的ATL来创建DLL调用,用ATL COM AppWizard新建了个DLL工程,使用MinDependency模式编译,结果出现如标题所示错误,百思不得其解,结果Google了一下,才知道少了两头文件:

#include <atlcom.h>
#include <atlhost.h>

还有个_main错误处理方法也很简单:屏蔽StdAfx.cpp中的#include <atlimpl.cpp>就可以了。

另外:VC也挺方便的,如果用 ATL 的话,CComBSTR, CComPtr等都会自动释放,开始还提心挑担的使用IStream*接口,再Release,这下了解了就方便了,嘿嘿!

本来是用D7+自己编译的system,现换D2006

主要是太麻烦了,太累,而且我只作SDK级开发,D7代码编辑器也没D2006好用!

FastMM随时都在升级,用D7的话就每次都要自己把原system.pas的内存操作该为基于FastMM的,再Dcc32一下,再替换D7的dcu,每次都累的半死,还担心会有错。吃力不讨好!

而且D7的一些内置操作真的很讨厌,比如 function Pos(),大爷的,我就没看到哪儿有这函数的过程,应该是编译器内置的(没深入考证),想做Unicode处理就只有改名使用,比如重新声明为 PosA() PosW(),kao!太不利于移植了!

刚好想到D2006已经在使用FastMM了,干脆就用它了!
什么升级打补丁的,就麻烦Borland代劳了,虽然目前发现D2006如果加载ActiveX unit会跟着加载SysUtils,我写的程序需要用的接口声明很少,就懒的去深究了,自己声明了就是,我还是专心做项目吧。

Say goodbye to Delphi7.

不得不用Delphi2006

为了安心,做了个小测试,比较Delphi7和Delphi2006的内存操作效率。

想法:循环做一亿次申请内存块,移动内存数据,销毁内存块,比较两者时间差距。

代码:
var
s: String;
p: PChar;
i: integer;
Start: Cardinal;
begin
Start := GetTickCount;
s := '123';
for i := 0 to 100000000 do
begin
GetMem(p, 256);
Move(Pointer(s)^, p^, Length(s));
FreeMem(p);
end;
Memo1.Lines.Add(IntToStr(GetTickCount - Start));
end;

结果:
Delphi7 用时:19000 (19秒)
Delphi2006 用时:7063 (大约7秒)

两者相差接近3倍。汗一个!