地 址:联系地址联系地址联系地址电 话:020-123456789网址:kkkk.twqueen.com邮 箱:admin@aa.com
这个例子我放到范例里了:
运行这个范例 ,会自动检测 Delphi 编写的中嵌 DLL 是否存在 ,不存在会自动打开 Delphi 工程,中嵌也就是中嵌这个文件:
~codes范例程序2) 调用其他语言D) DelphiProject1.dpr
注意上面路径前面 ~ 符号,这在 aardio 里表示当前 EXE 文件所在目录。中嵌
首先在 Delphi 的中嵌窗口源码( Unit1.pas 文件) 添加一个创建窗口的函数如下:
function CreateForm(parentHandle: HWND): HWND; stdcall;nvarn Form1 : TForm1;nbeginn Form1 := TForm1.CreateParented(parentHandle);n Form1.Show;n Result := Form1.Handle;nend;nn
这个函数接收一个外部窗口的句柄,并且将 TForm1 创建为外部窗口的中嵌子窗口 ,然后返回创建窗口的中嵌句柄,注意在 Delphi 工程的中嵌 exports 语句中导出 CreateForm 函数 。
然后在 aardio 中调用该函数创建控件 ,中嵌这里要注意几个知识点:
1、中嵌在 win.ui.ctrl 名字空间下创建类 ,中嵌就可以在窗体上使用该控件类名,中嵌例如我们新建或导入一个类 win.ui.ctrl.delphiForm,中嵌 然后我们就可以拖一个自定义控件到窗体上,并且将该控件的中嵌类名改为 delphiForm 就可以了 。
2 、自定义控件可以返回创建控件的参数或类名,也可以直接创建控件并将控件窗口的句柄包含到 hwnd 属性中。
下面我们在 aardio 中编写 win.ui.ctrl.delphiForm 控件:
var delphiDll = raw.loadDll($"Project1.dll");nclass win.ui.ctrl.delphiForm{ n ctor(parent,tParam){ n this.hwnd = delphiDll.CreateForm(parent.hwnd);n };n @..win.ui.ctrl.metaProperty()n}
可以将上面的源码放到库文件中,再用 import win.ui.ctrl.delphiForm 语句导入,大家可以在标准库中打开 win.ui.ctrl 名字空间 ,可以看到非常多的控件类库 。
这里要说明一下 ,为什么 raw.loadDll($"Project1.dll"); 这里要加一个 $ 符号 ,这在 aardio 中用于将文件编译到代码中,然后运行时通过内存加载该 DLL文件,也就是发布后就不再需要该 DLL了 ,这非常方便。当然,不是必须要这样做,也有一些 DLL 并不支持内存加载。
可以看到 ,在 aardio 中调用 Delphi 的导出函数非常简单 ,直接调用就可以了,不需要任何复杂的代码,实际上只要能编写 DLL 的语言,我们都可以类似去调用他。
那么在 Delphi 里如何调用 aardio 函数呢? !其实很简单 ,只要能调用 Delphi 函数,那么就可以把 aardio 函数作为回调函数传给 Delphi ,这种方法很常用 ,在文档里也有详细说明 ,但这次我们不用这个方法。
今天我们换一个更简单的方法,aardio 窗口对象支持一个神奇的 _WM_THREAD_CALLBACK 消息 ,通过发送这个消息,就可以调用该窗口的成员函数,我们可以在 aardio 自带的范例查看这个消息的用法 :
~codes范例程序1) aardio 语言1) 多线程12.threadCallback.aardio
有趣的是,这个方法也可以在 Delphi 里使用 ,我在Delphi 工程范例里提供了一个 aardio .pas 文件,导入这个模块就可以使用这个消息调用 aardio 窗口的成员函数了,例如:
aardio.sendCallback(self.ParentWindow,'onTest( { int x;int y;} )',@TestStruct);
@TestStruct 是 Delphi 的一个结构体指针,而上面的 self.ParentWindow 则是 aardio 窗口的句柄,'onTest( { int x;int y;} )' 是函数原型声明,这句代码会调用 aardio 中的 winform.onTest 函数 ,并且参数会解析为 aardio 结构体 { int x;int y;}
aardio 中 winform.onTest 函数的源码如下:
winform.onTest = function(delphiStructParam){ n winform.edit.print("Delphi 调用了aardio 函数,参数如下:");n winform.edit.print(delphiStructParam);n delphiStructParam.x = 90;nn //可选返回修改后的结构体n return delphiStructParam;n}
从上面的代码可以看到 ,我们不但可以接收 Delphi 传过来的结构体参数,还可以修改这个结构体( 也就是直接修改 Delphi 的结构体,Delphi 中结构体的值会被改变)
在与Delphi 交互要注意 ,Delphi 字符串使用的是ANSI 编码,而 aardio 使用的是 UTF-8 编码 。
看一下运行后的效果 :
注意上面的结构体的值在第二次调用时已经被修改了。
使用这种方式嵌入 Delphi 控件 ,跟其他普通的自定义控件一样,具有 aardio 控件的所有自适应布局能力,支持固定边距、自适应大小等属性设置。