将多个form放在dll中,通过一个新的form主程序如何动态生成和销毁dll中的form, ( 积分: 100 )

  • 主题发起人 主题发起人 emitsong
  • 开始时间 开始时间
E

emitsong

Unregistered / Unconfirmed
GUEST, unregistred user!
将多个form放在dll中,通过一个新的form主程序如何动态生成和销毁dll中的form,
如:
主程序form中我设置全局变量
var
ChildFrm:array[0..100] TForm;
dll 中有
TForm1 = class(TForm);TForm2= class(TForm);TForm3 = class(TForm)
想通过主程序form中给定参数来动态生成是from1还是form2或form3,当dll有n个form时都有效
 
将多个form放在dll中,通过一个新的form主程序如何动态生成和销毁dll中的form,
如:
主程序form中我设置全局变量
var
ChildFrm:array[0..100] TForm;
dll 中有
TForm1 = class(TForm);TForm2= class(TForm);TForm3 = class(TForm)
想通过主程序form中给定参数来动态生成是from1还是form2或form3,当dll有n个form时都有效
 
你带参数进去呀。。
你是不是想问怎么建立带FORM的DLL呀?要是问这个,我有现成的例子可以发给你。。
bbgsgs@163.com
 
to bbgsgs 就是参数怎么带,主要是为了升级方便,主程序的exe不用重新编译,升级dll和相关配置文件,就能产生新的frm
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Left1,Left2,Left3:integer;
Top1,Top2,Top3:integer;
procedure WMMove(var Message: TWMMove)
message WM_MOVE;
end;

var
Form1: TForm1;

implementation
uses Unit2, Unit3;
{$R *.DFM}

procedure TForm1.WMMove(var Message: TWMMove);
begin
inherited;
if Assigned(Form2) then
begin
Form2.Top:=Form1.Top-Top1+Top2+30
// 30是偏差位置
Form2.Left:=Form1.Left-Left1+Left2+30
// 30是偏差位置
end;

if Assigned(Form3) then
begin
Form3.Top:=Form1.Top-Top1+Top3+60
// 60是偏差位置
Form3.Left:=Form1.Left-Left1+Left3+60
// 60是偏差位置
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Left1:=Form1.Left;
Top1:=Form1.Top;

Form2:=TForm2.Create(Self);
Left2:=Form2.Left;

Form3:=TForm3.Create(Self);
Top2:=Form2.Top;
Left3:=Form3.Left;
Top3:=Form3.Top;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// 要顯示多個窗體,然後移動窗體就有效果了。
Form2.Show;
Form3.Show;
end;

end.
 
ChildFrm是全局变量,在exe和dll之间共享,当dll释放时,应该刷新ChildFrm,
可以通过消息来实现,就是dll窗体关闭时发送一个消息给exe,一定要用postmessage,
不能用sendmessage,exe收到消息后,刷新ChildFrm,如果这时ChildFrm长度为0,应该
释放dll,即freeliarbry(GetModuleHandle(dll名称)),建议ChildFrm最好使用TList变量.
 
后退
顶部