请教:DLL创建的FORM怎么传递数据?(100分)

  • 主题发起人 主题发起人 cxreal
  • 开始时间 开始时间
C

cxreal

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟刚学习DLL,通过调用接口,创建一个主FORM,然后在DLL中由主FORM动态创建
其他FORM;
比如说:
unit1:
procedure TForm1.Button1Click(Sender: TObject);
var
form2:Tform2;
begin
form2:=Tform2.creat(nil);
form2.showmodal;
end;
在form1中动态创建了form2;

但是FROM2的数据怎么传会FORM1(主FORM)?
我这样写
procedure TForm2.Button1Click(Sender: TObject);
begin
form1.edit1.text:=form2.edit1.text;
end;

这样的参数传不回去。请问怎么才能在DLL的各个FORM中自由传递参数
 
你需要在form2中 uses unit1; 注意应该放在 implementation 后面
 
我已经USES unit1了的,
procedure TForm2.Button1Click(Sender: TObject);
begin
form1.edit1.text:=form2.edit1.text;
end;
一点击就抱DLL读址错误..不知道怎么回事
 
你改成以下就可以了,应该是类的对象动态创建时,地址发生改变,而不是原来编译时的地址了:
Button2Click事件要去掉!
procedure TForm1.Button1Click(Sender: TObject);
begin
with Tform2.create(nil) do try
showmodal;
form1.edit1.text:=edit1.text;
finally
free;
end;
end;
 
楼上的,你的事件是什么意思?
我是想FORM2中的BUTTON点击后,把EDIT的值返回form1中
你的事件?
 
或者那位大大给我一个DLL中FORM传递数据的简单例子
让我自己看看 littler@vip.163.com
谢谢了
 
修改那段代码写在Form1里面,在ShowModal之后
 
地址发生改变,而不是原来(FORM1)编译时的地址了:
//你把TForm2.Button1Click事件改为form1.edit1.text:=edit1.text;这样也可以
unit1:
procedure TForm1.Button1Click(Sender: TObject);
var
form2:Tform2;
begin
form2:=Tform2.creat(nil);
form2.showmodal;
end;

unit2;
procedure TForm2.Button1Click(Sender: TObject);
begin
form1.edit1.text:=edit1.text;
end;
 
unit Unit1;

interface

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

type
TTestFrm = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
published
end;

var
TestFrm: TTestFrm;
function CreateTestForm: widestring;

implementation

{$R *.dfm}

function CreateTestForm: widestring;
var
frm: TTestFrm;
s: widestring;
begin
Result := '';
frm := TTestFrm.Create(nil);
if frm.ShowModal = mrOk then
begin
Result := frm.Edit1.Text;
end;
s := Result;
frm.Free;
end;

procedure TTestFrm.Button1Click(Sender: TObject);
begin

ModalResult := mrOk;
end;

end.
 
to wtopia:还是DLL报错...

大虾们有简单例子没,我对照着好看看
 
注意dll中如果传String参数的话,一定要uses ShareMem.看看注示的内容.




library BAPSale;

{ 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
ShareMem,
 
uses
ShareMem,
我也写了的...
 
sharemem写在最上面没错,应该好使的
在主form中你是动态还是静态调用,是不是没声名呀[:)]
 
注意dll中不能用String,只能用string形式的。长度要确定。
 
to:fisher70,
我这样写还是不对啊

procedure TForm2.Button1Click(Sender: TObject);
var
s: string;
a: array of Char;
I: integer;
begin
s := 'dksafjlasfjlasfjal';
SetLength(a, Length(s));
for I := 1 to Length(s) do
begin
a:= s;
Form1.edit1.Text:=MainForm.edit1.Text+a;
end;
end

我的主FORM是动态调用的,是不是找不到FORM1的句柄呢?
 
你想要怎么传数据
我给你发过去
 
to 孤灯夜影:
form1创建的FORM2,form2能回传值给FORM1的例子,DLL中
谢谢了 littler@vip.163.com
 
我 正在给你做
一会给你
 
用不用DLL创建
 
DLL创建一个主FORM1,然后在DLL中由主FORM1动态创建FORM2
form2回传给form1
麻烦了
 
后退
顶部