快讯
- 装机圈新宠儿,微星 MAG B850M MORTAR Wi-Fi迫击炮主板评测
- 微星MPG Z890I EDGE TI WIFI 刀锋 钛评测:14 层 PCB 加持,同级之中强无敌!
- 打造低调而卓越的Ai PC,微星MEG Z890 ACE战神主板开箱
- 解密“星”制造,微星深圳恩斯迈工厂探秘之旅
- 游泳也需音乐相伴!韶音OpenSwim Pro评测
- 又一款轻量化电竞
- 元气满满的充电之旅!铂陆帝商超活动嗨翻周末
- 雷柏机甲编码主题系列警戒线S-07图赏:以机械美感诠释潮流新理念桌搭!
- 更适合新手体质的枪战游戏,《无畏契约》开战!
- 现代与传统的融合之旅:贝尔金笔记本扩展坞体验
- 航天品质下的极速充电体验——航嘉G65 GaN快速充电器评测
- 有颜有实力的外设谁能不爱?来看雷柏商超巡演
- 新潮外设引爆全场!雷柏联合PC打造潮品酷玩趴
- 幻彩绚丽,玩趣十足!雷柏V700DIY键盘图赏
- U皇就该配板皇,超频玩家现身说法教你选主板
- 13代酷睿的超频利器,有好板才有好性能
- 全新升级,雷柏V20S RGB光学游戏鼠标2023版详解
- 马斯克30亿放“烟花”,民航故事为何值钱?
- 让露营生活更精致!铂陆帝户外电源AC180评测
- 惠威音响体验:音响中的艺术品,拥有好听的灵魂
- 装机圈新宠儿,微星 MAG B850M MORTAR WiFi迫击炮主板评测31日
- 微星MPG Z890I EDGE TI WIFI 刀锋 钛评测:14 层 PCB 加持,同级之中强无敌!29日
- 打造低调而卓越的Ai PC,微星MEG Z890 ACE战神主板开箱10日
- 解密“星”制造,微星深圳恩斯迈工厂探秘之旅02日
- 游泳也需要音乐相伴!韶音新一代游泳耳机OpenSwim Pro评测12日
- 又一款轻量化电竞"神鼠"来袭!玄熊猫3395游戏鼠标今晚首发149元10日
- 元气满满的充电之旅!铂陆帝商超活动嗨翻周末27日
- 雷柏机甲编码主题系列警戒线S-07图赏:以机械美感诠释潮流新理念桌搭!24日
- 更适合新手体质的枪战游戏,《无畏契约》国服正式开战!20日
- 玩物近话论:现代科技与甘南秘境的融合之旅 贝尔金笔记本扩展坞体验14日
- 航天品质下的极速充电体验——航嘉G65 GaN快速充电器评测12日
- 有颜有实力的外设好物谁能不爱?雷柏点燃PCGROUP潮品商超巡演15日
- 新潮外设好物引爆全场!雷柏联合PCGROUP打造潮品酷玩趴15日
- 幻彩绚丽,玩趣十足!雷柏V700DIY热插拔机械键盘图赏10日
- U皇就该配板皇,超频玩家现身说法教你选主板26日
- 13代酷睿的超频利器,有好板才有好性能25日
- 全新升级 经典复刻 雷柏V20S RGB光学游戏鼠标2023版详解25日
- 马斯克30亿放“烟花”,民航故事为何值钱?23日
- 告别电量焦虑,让露营生活多一分精致!铂陆帝户外电源AC180开箱评测17日
- 惠威音响体验:音响中的艺术品,拥有好听的灵魂04日
一个实际的OLE服务器的开发
2004-02-14 09:34 出处:PConline 作者:hkbarton/CSDN 责任编辑:linjixiong
1回顶部 先行知识:Delphi/COM/OLEAutomation/SQLServer
难度:★★☆☆☆
在前几篇文章中我们已经讨论过关于VCL和OLE的知识。在这篇文章中我们将完成一个比较有实际意义的OLEAutomation服务器程序,最后我们把他们封装为Delphi中使用的VCL组件。
首先我们来做一个实际的程序,在它没有变为服务器之前,这是个用来管理客户购买记录的程序(它自己与SQLServer连接),它可以录入和删除客户的购买记录并直观的显示出来,所有的数据都存放在SQLServer中。我们将它做为OLEAutomation出于这样一种考虑,假设我们是一家大型的供货公司,我们可能有很多系统需要使用这个客户购买记录程序并用它处理SQLServer中相应的数据,但我们不愿意每次都重复的编写同样的处理代码,我们更希望能把这个处理程序独立出来,并向其它程序提供服务。那么在下面的工作中我们完成了这个服务器程序,界面如下:(注意,这仅仅是一个例子,我们不评价其数据库设计的好坏J)
我们不过多的讨论这个程序的代码(因为这和开发一般的程序没有任何不同,你可以按照最后的地址给我来信索取这篇文章的全部代码)。然后我们来把它变为一个服务器。选择FileàNewàOthersàActiveXàAutomationObject。接下来delphi为我们定义了类型库和实现文件,我们要做的只是在类型库中添加相应的我们要用到的服务器属性和事件。我们简单的给出定义这个OLEAutomation功能的接口(来自类型库所产生的ObjectPascal代码):
ICustFormOLE=interface(IDispatch)
['{D7AE75F9-F838-4702-A8EB-EAD0EED242DE}']
functionGet_CustName:WideString;safecall;
procedureSet_CustName(constValue:WideString);safecall;
functionGet_ProductName:WideString;safecall;
procedureSet_ProductName(constValue:WideString);safecall;
functionGet_ProductNum:Integer;safecall;
procedureSet_ProductNum(Value:Integer);safecall;
functionGet_Remark:WideString;safecall;
procedureSet_Remark(constValue:WideString);safecall;
//下面的方法和属性都对应着原程序中相应的方法和属性
procedureAddToData;safecall;
procedureDelData;safecall;
propertyCustName:WideStringreadGet_CustNamewriteSet_CustName;
propertyProductName:WideStringreadGet_ProductNamewriteSet_ProductName;
propertyProductNum:IntegerreadGet_ProductNumwriteSet_ProductNum;
propertyRemark:WideStringreadGet_RemarkwriteSet_Remark;
end;
希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
2回顶部
ICustFormOLEDisp=dispinterface
['{D7AE75F9-F838-4702-A8EB-EAD0EED242DE}']
propertyCustName:WideStringdispid201;
propertyProductName:WideStringdispid202;
propertyProductNum:Integerdispid203;
propertyRemark:WideStringdispid204;
procedureAddToData;dispid205;
procedureDelData;dispid206;
end;
我们现在回到接口的实现文件,注意代码中的注释,事实上这段代码相当的简单:
unitCustOLEImpUnit;
{$WARNSYMBOL_PLATFORMOFF}
interface
uses
ComObj,ActiveX,CustViewOLE_TLB,StdVcl,windows;
type
TCustFormOLE=class(TAutoObject,ICustFormOLE)
//注意这里实现了我们在前面定义的ICustFormOLE接口
protected
functionGet_CustName:WideString;safecall;
functionGet_ProductName:WideString;safecall;
functionGet_ProductNum:Integer;safecall;
functionGet_Remark:WideString;safecall;
procedureAddToData;safecall;
procedureDelData;safecall;
procedureSet_CustName(constValue:WideString);safecall;
procedureSet_ProductName(constValue:WideString);safecall;
procedureSet_ProductNum(Value:Integer);safecall;
procedureSet_Remark(constValue:WideString);safecall;
end;
implementation
usesComServ,CustFormUnit;
functionTCustFormOLE.Get_CustName:WideString;
begin
result:=CustForm.CustomEdit.Text;
//可以看到,我们只是用了最初程序窗体的控件和属性,这里的接口实现相当于
//只是简单的封状了我们的原始程序,下面的代码情况类似。
希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
3回顶部
end;
functionTCustFormOLE.Get_ProductName:WideString;
begin
result:=CustForm.ProductEdit.Text;
end;
functionTCustFormOLE.Get_ProductNum:Integer;
begin
result:=CustForm.ProNumEdit.Value;
end;
functionTCustFormOLE.Get_Remark:WideString;
begin
result:=CustForm.Memo1.Lines.Text;
end;
procedureTCustFormOLE.AddToData;
begin
CustForm.AddButton.Click;
end;
procedureTCustFormOLE.DelData;
begin
CustForm.DelButton.Click;
end;
procedureTCustFormOLE.Set_CustName(constValue:WideString);
begin
CustForm.CustomEdit.Text:=Value;
end;
procedureTCustFormOLE.Set_ProductName(constValue:WideString);
var
i:integer;
begin
i:=CustForm.ProductEdit.Items.IndexOf(Value);
ifi<>-1then
CustForm.ProductEdit.ItemIndex:=i
else
希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
4回顶部
begin
messagebox(CustForm.Handle,'你在客户程序指定的商品类型并不存在!','CustProOLE常规错误',MB_ICONWARNING);
CustForm.ProductEdit.ItemIndex:=0;
end;
end;
procedureTCustFormOLE.Set_ProductNum(Value:Integer);
begin
CustForm.ProNumEdit.Value:=Value;
end;
procedureTCustFormOLE.Set_Remark(constValue:WideString);
begin
CustForm.Memo1.Lines.Text:=Value;
end;
initialization
TAutoObjectFactory.Create(ComServer,TCustFormOLE,Class_CustFormOLE,
ciMultiInstance,tmApartment);
end.
现在我们就可以实际的测试和使用这个服务器了,我们可以新建立一个工程,选择Project-->ImportTypeLibrary…可以发现这里已经有我们刚才建立的服务器信息了(当然前提是你已经运行过服务器程序),然后CreateUnit将相应的类型文件所生成的pascal文件加入我们的工程中,一但我们启动了服务器我们就可以很轻松的使用接口中的属性和方法了:
functionTForm1.GetDefaultInterface:ICustFormOLE;
begin
ifnotassigned(FInterface)then
FInterface:=CoCustFormOLE.Create;//注意这里,你可以在类型库文件产生的pascal文件中找到CoCustFormOLE的含义
result:=FInterface;
end;
由于篇幅原因,我们不能给出测试程序的全部代码(事实上有了服务器程序,我们的测试客户程序想要处理SQLServer中的相应数据就相当的简单了。),可以照后文的地址向我索取(说明一下,本文中的数据库用到SQLServer,所以我发给你们的程序中你们需要还原其中的数据库备份到你们的SQLServer,并修改相应的连接字符串,否则程序不能运行)。
在本文的最后,我们介绍一种更简单的使用我们刚才所开发的服务器的方法,那就是把它封装为delphi中的组件,选择Project-->ImportTypeLibrary…中我们开发的服务器,然后Install将它安装到一个已经存在的包或你新建的组件包中,delphi将为我们做很多工作,最后你可以从你指定的面板找到安装的新的组件,现在你就可以象使用普通VCL组件一样使用我们开发的服务器了。(注意,delphi为我们定义了一个继承自ToleContol的类,这一切复杂的工作都是由delphi在背后为我们完成的,如果你有兴趣,建议研究一下这个组件中delphi自动为我们生成的大量代码)。
索取地址:hk.barton@sohu.com
希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
|
最热搜索
无线路由器怎么用 会说话的汤姆猫电脑版 12306网上订火车票 跳舞吧 flash player 下载 PP助手电脑版 Adobe Reader(pdf阅读) iOS6正式版12项新功能 QQ空间克隆器 9158视频KTV 植物大战僵尸辅助工具 Win8怎么关机 QQ空间进不去 2013年春节是几月几号 QQ昵称 QQ空间皮肤 PPT模板 电脑输入法不见了怎么办 2012中秋节是几月几日 word安全模式 qq输入法怎么点亮 IE修复 感恩节是几月几日 CSS布局 PS快捷键 Outlook设置 声卡驱动器官方免费下载 格式工厂怎么用 桌面图标有阴影怎么去掉 Windows RT是什么意思 2013年日历设计 Word打不开怎么办 Win8专区 腾讯微云网 windows8激活工具 剑灵什么时候公测 QQ通讯录怎么用 开心斗地主 拖拉机小游戏 麻将游戏 中国象棋 德州扑克 黄金矿工中文版 保皇扑克游戏 四国军棋 万圣节是几月几日 ps抠图教程 12306订票助手 万圣节小游戏大全 rar文件怎么打开 Photoshop CS6教程 iOS6完美越狱 QQ个性签名