首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语 |
||
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平 驾驶员 | 网络编辑 |
||
卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 |
||
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 |
表10.3 全局内存块的分配标志
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
标 志 意 义
—————————————————————————————————
gmem_DDEShare 分配可由应用程序共享的内存
gmem_Discardable 分配可抛弃的内存(只与gmem_Moveable连用)
gmem_Fixed 分配固定内存
gmem_Moveable 分配可移动的内存
gmem_Nocompact 该全局堆中的内存不能被压缩或抛弃
gmem_Nodiscard 该全局堆中的内存不能被抛弃
gmem_NOT_Banked 分配不能被分段的内存
gmem_Notify 通知功能。当该内存被抛弃时调用GlobalNotify函数
gmem_Zeroinit 将所分配内存块的内容初始化为零
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
有两个预定义的常用组合是:
GHND = gmem_Moveable and gmem_Zeroinit
GPTK = gmem_Fixed and gmem_Zeroinit
第二个参数用于设置欲分配的字节数。分配的字节数必须是32的倍数,因而实际分配的字节数可能比所设置的要大。
由于用gmem_DDEShare分配的内存在分配内存的模块终止时自动抛弃,因而不必调用GlobalFree显式释放内存。
10.3.2.2 服务器程序的编写
服务器程序必须包含对DLL的调用代码,如:
function GetGlobalMem: THandle; far; external 'c:\dlls\glbmem';
通过调用该函数,服务器可以获得全局内存块的句柄。
在写入数据前,服务器必须锁定全局内存,以避免在写入过程中Windows移动该内存块的位置。
函数GlobalLock锁定全局内存并返回指向该内存块的指针:
pMem := GlobalLock(hMem);
对pMem的任何修改都会反映到全局内存块中。
对内存块进行操作后,调用GlobalUnLock进行解锁。内存块操作之后尽早解锁,有利于Windows充分利用内存资源。
服务器写入数据的实现代码如下。
var
hMem: THandle;
pMem: PChar;
begin
hMem := GetGlobalMem; {获得全局内存块的句柄}
if hMem <> 0 then
begin
pMem := GlobalLock(hMem); {加锁全局内存块}
if pMem <> nil then
begin
StrPCopy(pMem,Memo1.text); {向全局内存块写入数据}
GlobalUnlock(hMem); {解锁全局内存块}
end
else
MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0);
end;
10.3.2.3 客户程序的编写
客户程序几乎是服务器程序的翻版。唯一的区别在于一个是写入数据,一个是下载数据。
下面是客户从全局内存块下载数据的程序清单。
var
hMem: THandle;
pMem: PChar;
begin
hMem := GetGlobalMem; {获得全局内存块的句柄}
if hMem <> 0 then
begin
pMem := GlobalLock(hMem); {加锁全局内存块}
if pMem <> nil then
begin
Memo1.text := StrPas(pMem); {从全局内存块读取数据}
GlobalUnlock(hMem); {解锁全局内存块}
end
else
MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0);
end;
10.4 利用DLLs实现窗体重用
实现窗体重用是Delphi DLLs功能中一个引人注目的特色。当你创建了一个令自己满意的通用窗体并希望能在不同应用程序中使用,特别是希望能在非Delphi 应用程序中使用时,把窗体做进一个动态链接库中是最适当的。这样即使用其它工具开发的应用程序,如C++、Visual Basic等,也都可以去调用它。
包含窗体的DLLs有100K左右的部件库(Component Library)开销。可以通过把几个窗体编译成一个DLLs来最小化这笔开销。DLl中的不同窗体可以共享部件库。
10.4.1 利用DLLs实现窗体重用的一般步骤
利用DLLs实现窗体重用的步骤是:
1.在集成开发环境(IDE)中,按自己的需要设计一个窗体;
2.编写一个用于输出的函数或过程。在该函数或过程中,设计的窗体被实例化;
3.重复步骤1、2,直到完成所有重用窗体的设计;
4.打开工程文件,进行修改,以适应生成 .dll文件的需要:
(1).把保留字program设为library;
(2).从uses子句中去掉Forms单元;
(3).移去begin,end之间的所有代码;
(4).在uses子句下,begin…end块之前,添加保留字exprots。exports 后是输出函数名或过程名。
5.编译生成DLLs文件;
6.在其它应用程序中调用重用窗体。
重用窗体的调用同一般DLLs函数或过程的调用完全一致,不再赘述。读者可参看下面的例子。
10.4.2 窗体重用实例
下面我们通过一个具体的实例来说明窗体重用的设计过程。我们在一个名为passform.dll 的文件中储存了一个口令设置窗口和一个口令检查窗口。而后在一个Delphi 编写的程序和一个VB编写的程序中进行调用。事实证明这种方法是完全可行的。
10.4.2.1 窗体重用DLLs的设计
窗体重用DLLs的设计依照(10.4.1)中介绍的步骤进行。DLLs中的两个窗体 SetPassWordForm和GetPassWordForm分别用于设置和检查口令。它们的设计界面如图所示。
窗体类TSetPassWordForm定义了两个数据成员Verified和PassWord,用于记录口令确认状态和设置的口令。TSetPassWordForm的定义如下:
type
TSetPassWordForm = class(TForm)
Label1: TLabel;
Edit1: TEdit;
OKBtn: TBitBtn;
CancelBtn: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
Verified: Boolean;
public
{ Public declarations }
PassWord: PChar;
end;
窗口生成时,对数据成员和部件状态进行初始化:
procedure TSetPassWordForm.FormCreate(Sender: TObject);
begin
Verified := False;
PassWord := StrAlloc(40);
OKBtn.Enabled := False;
Label1.Caption := 'Please Input PassWord:';
end;
按钮OKBtn在程序启动时Enabled属性设置为False,直到口令被正确设置后Enabled属性才恢复为True。这样就保证了只有口令被正确设置后,口令设置窗口才能正常关闭。否则只能按Cancel按钮取消。
在口令设置代码单元中定义了一个输出函数SetPassWord,用于生成口令设置窗口并返回设置的口令:
function SetPassWord(PWord: PChar): Boolean;
var
SetPassWordForm: TSetPassWordForm;
begin
Result := False;
SetPassWordForm := TSetPassWordForm.Create(Application);
try
with SetPasswordForm do
if ShowModal = mrOK then
begin
StrCopy(PWord,StrUpper(Password));
Result := True;
end;
finally
SetPasswordForm.Free;
end;
end;
相关推荐:2010年9月计算机等级考试试题及答案解析专题北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |