Delphi - 创建SuperDll 持续更新
Delphi SuperDll
作为一名5年的Delpher,一直认为Delphi是桌面应用的王者,我相信其他的Delpher也这么认为。
但是,慢慢的我发现普通方式的Delphi开发会造成代码的严重臃肿,特别是MDI类大型项目、多人同时开发的情况下。
举个例子,一个Delphi常用的业务逻辑,数据导出到Excel,完全可以写成一个公用的模块放置在业务单元,子窗体用到时直接调用即可,但是一般情况下,事情并不止想象的那么简单,维护人员的思想真的一言难尽。
后来,我有了将Delphi中常用的业务逻辑功能封装成DLL的想法,所有的业务逻辑只能在DLL中实现,系统中不允许直接写业务逻辑,只能调用DLL。
这么做的好处是,相同的业务功能不会被重复开发,大大减少了代码的臃肿,同时,业务逻辑开发人员和前台开发人员独立开来,提高了开发效率。
这里就是SuperDLL的由来,后续将持续更新。
请看如下代码:
更新日志:
//初始化
//邮件发送
//FTP上传、下载
//cxGrid数据导出
library SuperDll;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils, Classes, Variants, Graphics, Controls, IdBaseComponent, IdComponent, IdFTP,
IdFTPCommon, IdTCPConnection, IdTCPClient, IdMessage, IdMessageClient, IdSMTP, cxGrid,
cxGridExportLink, ComObj,
cxCustomData, cxGraphics,
cxData, cxDataStorage, cxEdit, cxDBData, cxGridLevel,
cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView;
{$R *.res}
function SuperDll_Init: Boolean; stdcall;
begin
Result := True;
end;
function SuperDll_Ftp_PutOrGet(vType: string; var vUserName: string; var vPassWord: string; var vHost: string; var vDir: string; var vDesFilePath: string; vSouFilePath: string): Boolean; stdcall; //2: FTP文件上传下载
var
IdFtp: TIdFTP;
begin
IdFtp := TIdFTP.Create(nil);
Result := False;
try
with IdFtp do
begin
if Connected then Disconnect;
Username := vUserName;
Password := vPassWord;
Host := vHost;
Port := ;
Connect;
ChangeDir(vDir);
TransferType := ftBinary;
if vType = 'Put' then
begin
Put(vSouFilePath, ExtractFileName(vSouFilePath));
end
else if vType = 'Get' then
begin
Get(ExtractFileName(vDesFilePath), vDesFilePath, True);
end;
end;
finally
IdFtp.Disconnect;
IdFtp.Free;
Result := True;
end;
end;
function SuperDll_EMail_Send(vSubject: string; var vFrom: string; var vRecipients: string; var vCCList: string; var vBccList: string; var vBody: string; var vAttachment: string; var vUsername: string; var vPassword: string; var vHost: string): Boolean; stdcall;
var
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
begin
Result := False;
IdSMTP := TIdSMTP.Create(nil);
IdMessage := TIdMessage.Create(nil);
try
with IdMessage do
begin
Clear;
Subject := vSubject;
From.Text := vFrom;
Recipients.EMailAddresses := vRecipients;
CCList.EMailAddresses := vCCList;
BccList.EMailAddresses := vBccList;
Priority := TIdMessagePriority();
if Trim(vAttachment) <> '' then
begin
TIdAttachment.Create(MessageParts, Trim(vAttachment));
end;
vBody := vBody + ##;
vBody := vBody + ##;
vBody := vBody + ##;
vBody := vBody + ##;
vBody := vBody + 'It is Auto Mail System,please do not reply this mail directly,thank you!';
Body.Add(vBody);
end;
with IdSMTP do
begin
if Connected then Disconnect;
AuthenticationType := atLogin;
Port := ;
UserName := vUsername;
Password := vPassword;
Host := vHost;
Connect;
end;
IdSMTP.Send(IdMessage);
IdSMTP.Disconnect;
Result := True;
finally
IdSMTP.Free;
IdMessage.Free;
end;
end;
function SaveCxGridToExcel(vCxGrid: TcxGrid; var vFullPathName: string): Boolean; stdcall;
begin
Result := False;
vCxGrid := TcxGrid.Create(nil);
ExportGridToExcel(vFullPathName, vCxGrid);
vCxGrid.Free;
Result := True;
end;
function SaveCxGridToCSV(vCxGrid: TcxGrid; var vFullPathName: string): Boolean; stdcall;
begin
Result := False;
ExportGridToText(vFullPathName + '.XLS', vCxGrid, True, True, ',', '', '', 'CSV');
Result := True; ;
end;
exports
SuperDll_Init,
SuperDll_Ftp_PutOrGet,
SuperDll_EMail_Send,
SaveCxGridToExcel,
SaveCxGridToCSV;
begin
end.
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Delphi - 创建SuperDll 持续更新的更多相关文章
- Delphi - 调用SuperDll 持续更新
调用SuperDll 接上一篇Delphi创建Superdll,将生成的SuperDll.dll文件复制到本工程路径下,创建如下代码进行Superdll各个接口的测试. 创建uSuperDll.pas ...
- Jenkins持续部署-创建差量更新包
目录 Jenkins持续部署-创建差量更新包 目录 前言 目的 详细流程 生成版本号 获取版本号 创建文件更新清单 压缩 获取上个版本的包 创建差量更新包 读取服务器Json配置 远程创建文件夹目录 ...
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- 总结js常用函数和常用技巧(持续更新)
学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...
- React Native之坑总结(持续更新)
React Native之坑总结(持续更新) Genymotion安装与启动 之前我用的是蓝叠(BlueStack)模拟器,跑RN程序也遇到了一些问题,都通过搜索引擎解决了,不过没有记录. 但是Blu ...
- 干货!IT小伙伴们实用的网站及工具大集合!持续更新!
1.Git 还在担心自己辛辛苦苦写的代码被误删了吗?还在担心自己改错了代码不能挽回吗?还在苦恼于多人开发合作找不到一个好的工具吗?那么用Git就对 了,Git是一个开源的分布式版本控制系统,用以有效. ...
- BLE资料应用笔记 -- 持续更新
BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...
- ( 译、持续更新 ) JavaScript 上分小技巧(四)
后续如有内容,本篇将会照常更新并排满15个知识点,以下是其他几篇译文的地址: 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第二篇地址:( 译.持续更新 ) JavaScr ...
随机推荐
- SQl Server 中的decimal( m , n )的意思
create table sc( cno ), sno ), grade ,), primary key(cno,sno), foreign key(cno) references cou(cno), ...
- php isset()和 in_array()
结果: 结论: isset()完胜
- ES&IK环境搭建
本来打算docker安装es,和腾讯云上的服务器相比,一台赤裸裸的本地机,甚至连很多基础的指令都没有,还花样各种报错,对于我这种新手来说简直了,百度啊cddn啊终于整出来了,记录一下: 一:安装依赖 ...
- VUE Base64编码图片展示与转换图片
图片的 base64 编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址,使用 base64 传输图片文件可以节省一个 http 请求,图片的 base64 编码可以算是前端优化的一 ...
- Java题库——Chapter2 基础程序设计
1)Suppose a Scanner object is created as follows: Scanner input = new Scanner(System.in); What metho ...
- ASP.NET MVC教程八:_ViewStart.cshtml
一.引言 _ViewStart.cshtml是在ASP.NET MVC 3.0及更高版本以后出现的,用Razor模板引擎新建项目后,Views目录下面会出现一个这样的文件: 打开_ViewStart. ...
- 创建线程之三:实现Callable接口
通过Callable和Future创建线程 i. 创建Callable接口的实现类,并实现call方法,该call方法将作为线程执行体,并且有返回值,可以抛出异常. ii. 创建Callable实现类 ...
- BASE64Encoder cannot be resolved to a type类似问题的解决办法
我们有时候会碰见在JDK或者其他jar包中提供了某方法或者类,接口,而开发工具仍然报红,无法使用该类或者方法,那是应为我们的编译器没有识别,或者没有支持某些方法或者类 这个时候需要我们手动的开启.具体 ...
- HTML中特殊符号编码对照表,html特殊符号编码都有哪些?
HTML中一些无法打出来的符号可以用相应的代码进行代替显示,本文提供了一些HTML特殊符号相应的代码供开发者参考. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 ...
- fastadmin中js是如何调用的
想要了解fastadmin中的js是怎么调用的,就应该先了解RequireJs. RequireJs是模块化工具,每一个我们自己的js文件或者库都可以看成是一个模块,按需引入.写法如下: <sc ...