Delphi精要


======================================================
注:本文源代码点此下载
======================================================

最近到图书馆里借了一本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^)/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值