请教: 主程序调用dll,我在主程序中如何使用dll中窗体中的控件 !(100分)

  • 主题发起人 主题发起人 glsky
  • 开始时间 开始时间
G

glsky

Unregistered / Unconfirmed
GUEST, unregistred user!
exe 调用 dll,
dll 中有窗体 form1, 其中有dbgrid1;
dll 有一个show出form1的函数供主程序调用,
form1打开后, 我想在主程序exe里用类似于 form1.dgrid1. 的方法操作, 可能吗?
多谢指教!
 
应该不行吧,只能通过调用DLL提供的例程来操作。
 
问题: 急问:如何在一个程序中使用一个DLL中的控件? ( 积分: 100 )
分类: 控件 - 开发

来自: gmwu, 时间: 2000-08-27 15:40:53, ID: 319728
这个问题可能怪一点。不知哪位高手可以告知解决方法。

问题描述如下:
如何在一个可执行程序中使用一个DLL中的frame?
并把它嵌入调用程序的form中?

谢谢!

来自: JohnsonGuo, 时间: 2000-08-27 16:12:15, ID: 319737
>>

来自: Another_eYes, 时间: 2000-08-27 22:35:22, ID: 319920
如果只是一个单纯的dll而没有任何其它附加文件, 在设计期是不可能达到你的要求的
(比如想在设计期将dll中的Frame放到form上).
运行期可行, 不过"放置"的工作要由dll来完成, 比如调用程序给出个坐标RECT, 由
dll中的过程或函数动态创建该frame的实例并放到这个Rect里.

来自: gmwu, 时间: 2000-08-28 10:48:35, ID: 320277
当然是想在运行期放置,不过我不太明白你的意思,如何在DLL中将FRAME放到RECT中?
能不能给出个具体的例子?谢谢!

来自: assassin, 时间: 2000-08-28 11:00:52, ID: 320290
我作过类似的DLL,
DLL要用一个函数导出Frame,
注意的是 要将Frame的ParentWindow设为窗体
还有就是一个我遇到的毛病:
这样导出的窗体,不是很稳定,例如我作的东西,不能调OpenFileDialog,
会出莫名其妙的错误

来自: gmwu, 时间: 2000-08-28 13:40:02, ID: 320509
如何用函数导出FRAME?
我曾试着在DLL中的一个函数中将FRAME的PARENTWINDOW设为一个PANEL的HANDLE,
但是有时什么也没发生,有时出错。

来自: Another_eYes, 时间: 2000-08-28 22:46:06, ID: 320941
最好不要用ParentWindow来设置parent, 有很多功能无法实现, 你完全可以在调用
时将parent作为一个TWinControl传递给被调用过程, 然后在dll中可以直接设置你的
Frame.Parent := 这个传入的TWinControl

来自: gmwu, 时间: 2000-08-29 21:07:05, ID: 321556
这种做法不可行,我已经试过了。

来自: wjiachun, 时间: 2000-09-16 11:55:31, ID: 338372
继续

来自: microbit, 时间: 2000-09-16 12:36:08, ID: 338432
关注此题

来自: thtfsyh, 时间: 2000-09-16 12:58:54, ID: 338452
关注此题

来自: SNKoala, 时间: 2000-09-17 21:21:44, ID: 339779
不知道是不是我不理解,我觉得跟平常的没有两样:
1。在Dll中 Application.Handle := (App的Application.Handle)
2。在Dll中输出函数创建并返回控件。
3。设置Dll返回的控件的Owner,Parent,...

希望能解决问题!
------------------------------

SNKoala = SiNianKoala

来自: wjiachun, 时间: 2000-10-26 20:31:47, ID: 377502
多人接受答案了。

得分大富翁: Another_eYes-50,SNKoala-50,
 
理论上可以,有两种方法,但是都需要你的窗体的声明部分,这样就失去了在DLL中隐藏实现细节的初衷,所以实际用途不大。一下说明我的思路
方法一.在Dll中输出对象,步骤如下
1.定义一个抽象类,里面包含你需要的所有属性和方法,所有的方法都是抽象方法和虚方法,比如你的类中有个属性为dgrid1;
2.定义一个子类实现抽象类,这里的子类就是你的窗体了
3.在子类中实现抽象类的方法

function CreateYourForm: TYourForm; stdcall;
begin
Result := TYourForm.Create;
end;

Exports
CreateYourForm;
4.在应用程序中声明该抽象类,如
function CreateYourForm: TYourForm; stdcall; external '../Your.dll';
var
A: TBaseForm;
那么A := CreateYourForm;
然后你就可以使用A了,如A.dgrid1

方法二 使用COM,将你要的内容封装到接口
这个不是一两句话能说清楚的
自己参考一下书吧

一句话,想很容易的直接读出Form的控件,不容易做到:)
 
to weiliu:
这样虽然可以导出dll中的控件, 但还是不能在设计期实现对其属性的引用啊!能否再帮忙想一下!
 
muhx:
谢谢你的回答,问题解决了, 用你的第一种方法可以,第二种没试,你的第一种方法我前几天用接口的方法试过,不过没通过! 再次感谢你的回答!
 
多人接受答案了。
 
后退
顶部