======================================================
注:本文源代码点此下载
======================================================
最近到图书馆里借了一本delphi好书-《*delphi精要*》。说实在的,国内的
delphi书有95%是垃圾,大都是网上的技巧,代码堆积起来的,通常一本书30分
钟就可以搞定。但是这本技术书写得有点武侠
版的味道,而且都是作者切身的经验体会,可以和我先前看过的台湾的牛人陈宽达
的《delphi深度历险》
相提并论。好书当然要做笔记了,以下就是俺的看书笔记。
1.集合
定义
toneset= set of (a,b,c);//全集
声明
partset=[a,b];
运算
+:
partset=partset+[b];//等价于:include(partset,b);
-:
partset=partset-[b];//等价于:exclude(partset,b);
2.指针
除了pchar类型的指针变量,其他类型的指针变量是不允许进行加减运算的
@i等价于addr(i)
3.编译时函数:
编译时函数可以在声明中调用如下:
var
r1:word=trunc(12.6);
编译时函数列表:
ord()
chr()
trunc()
round()
high()
low()
sizeof()
4.dll
1)在dll中编写的函数或过程都必须加上stdcall调用参数.
library delphi;
uses
sysutils,
classes;
function testdll(i:integer):integer;stdcall;
begin
result:=i;
end;
exports
testdll;
begin
end.
2)当使用了长字符串类型的参数、变量时要引用sharemem。
delphi中的string类型很强大,我们知道普通的字符串长度最大为256个字
符,但delphi中string类型在默认情况下长度可以达到2g。(对,您没有看错,确
实是两兆。)这时,如果您坚持要使用string类型的参数、变量甚至是记录信息
时,就要引用sharemem单元,而且必须是第一个引用的。既在uses语句后是第一个
引用的单元。如下例:
uses
sharemem,
sysutils,
classes;
还有一点,在您的工程文件(*.dpr)中而不只是单元文件(*.pas)中也要做
同样的工作,这一点delphi自带的帮助文件没有说清楚,造成了很多误会。不这样
做的话,您很有可能付出死机的代价。避免使用string类型的方法是将string类型
的参数、变量等声明为pchar或shortstring(如:s:string[10])类型。同样的问
题会出现在当您使用了动态数组时,解决的方法同上所述。
3)静态调用例子:
unit unit1;
interface
uses
windows, messages, sysutils, classes, graphics,
controls, forms, dialogs, stdctrls;
type
tform1 = class(tform)
edit1: tedit;
button1: tbutton;
procedure button1click(sender: tobject);
private
...{ private declarations }
public
...{ public declarations }
end;
var
form1: tform1;
implementation
...{$r *.dfm}
//本行以下代码为我们真正动手写的代码
function testdll(i:integer):integer;stdcall;
external ’delphi.dll’;
procedure tform1.button1click(sender: tobject);
begin
edit1.text:=inttostr(testdll(1));
end;
end.
4)动态调用:
这一点很重要,使用静态调用方法时要求所调用的dll文件以及要调用的函数或过
程等等必须存在。如果不存在或指定的路径和文件名不正确的话,运行主程序时系
统会提示“启动程序时出错”或“找不到*.dll文件”等运行错误。
动态调用dll相对复杂很多,但非常灵活。为了全面的说明该问题,这次我们
举一个调用由c++编写的dll的例子。首先在c++中编译下面的dll源程序。
#include
extern ”c” _declspec(dllexport)
int winapi testc(int i)
...{
return i;
}
编译后生成一个dll文件,在这里我们称该文件为cpp.dll,该dll中只有一个
返回整数类型的函数testc。为了方便说明,我们仍然引用上面的调用程序,只是
将原来的button1click过程中的语句用下面的代码替换掉了。
procedure tform1.button1click(sender: tobject);
type
tintfunc=function(i:integer):integer;stdcall;
var
th:thandle;
tf:tintfunc;
tp:tfarproc;
begin
th:=loadlibrary(’cpp.dll’); ...{装载dll}
if th>0 then
try
tp:=getprocaddress(th,pchar(’testc’));
if tpdelphi application->(twincontrol)mainwndproc->wndproc->dispatch->handler
(1)application->dispatchmessage(const lpmsg:tmsg)根据参数lpmsg的接受者句
柄字段,将消息正文发给该句柄对应的窗口控件在windows中注册的窗口过程:
twincontrol.mainwndproc.所以到这里,消息就传递给twincontrol了。这是在
windows中派遣,是底层api函数的调用。
(2)tobject.dispatch(var message);
dispatch首先在本类中查找相应的消息方法,如果没有找到,那么逐级上溯父
类,祖先类,直到找到对应的消息方法。
procedure tobject.dispatch(var message)
begin
搜索handler;
如果没有找到就调用defaulthandler(var message);
end;
========================================================
19:40 2005-12-9
1.发送消息的多种方法
1).给指定窗口发送消息
给窗口发送消息:
function sendmessage(hwnd:hwnd;msg:uint;wparam:wparam;lparam:lparam):lresult;stdcall;
//that is, sendmessage does not return until the target control has handled the message, even if it //is in another thread.
function dispatchmesage(const lpmsg:tmsg):longint;stdcall;
------------------------------------------------------------------------------
function postmessage(hwnd:hwnd;msg:uint;wparam:wparam;lparam:lparam):bool;stdcall;
2) 给应用程序发送消息:
function sendappmessage(msg:cardinal;wparam,lparam:longint);
3) 给线程发送消息
function postthreadmessage(idthread:dword;msg:uint;wparam:wparam;lparam:lparam):bool;stdcall;
获取idthread可用api函数得:
function getwindowthreadprocessid(hwnd:hwnd;lpdwprocessid:pointer=nil):dword;stdcall;overload;
function getwindowthreadprocessid(hwnd:hwnd;var dwprocessid:dword):dword;stdcall;overload;
今天郁闷啊,去玩魔兽输了两盘,好没面子,以后不玩了,魔兽bye了!虽然
你很完美,但是与你无缘了,但是我盼望着在未来的某一天我可以开发一款像你这
样的游戏!加油,加油,继续加油!
========================================================
2005-12-12
1.字符串资源
resourcestring
authorname = ’marco cantù’;
bookname = ’essential pascal’;
procedure tform1.button1click(sender: tobject);
begin
showmessage (bookname + #13 + authorname);
end;
以上代码中的两个字符串将分两行输出显示,因为字符串被分行符 #13 隔开。
有趣的是,当你用资源编辑器打开执行文件时,你会在程序资源中看到你所定义的
字符串。这意味着字符串并没有进入编译代码,而是保存在执行文件 (exe文件)
的一个单独区域。
注意:简而言之,采用资源的好处一方面可让windows 来完成有效的内存处理,另
一方面不用更改源代码就可实现程序的本地化 (把字符串翻译成不同的语言)。
2.位操作
type tintbitpos=0..31;
//取得一个integer中的某位
function getbitofint(i:integer;bitpos:tintbitpos):boolean;
begin
result:=(i shr bitpos) and $1=1;
end;
//替换一个integer的某位
procedure replacebitofint(var i:integer;bitpos:tintbitpos;newvalue:boolean);
var
newv:integer;
begin
if getbitofint(i,bitpos)0 then
begin
sendmessage(h,id,0,0);
postthreadmessage(getwindowthreadprocessid(h),id,0,0);
end;
end;
end;
本文来自csdn博客,转载请标明出处:http://blog.csdn.net/pottos/archive/2007/03/13/1528397.aspx
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/