dll中的窗体之间数据传递~~~~~~~~问题
外部程序调用一个dll函数创建一个窗体(此窗体为 a 窗体), 在此dll内部通过 a 窗体创建 b 窗体
,并且把 a 窗体的数据传递给 b 窗体 进行操作。
-----------前面都能实现,接下来就不行了
b窗体操作完以后我要把数据传回给 a 窗体,同时关闭 b 窗体,结果内存报错!
请各位高手帮帮忙,先谢过了!
问题点数:20、回复次数:13Top
1 楼bee2518(迷茫ing)回复于 2004-12-01 15:59:03 得分 4
应该是创建的对象没有释放完整
检查一下Top
2 楼relive8(飘叶)回复于 2004-12-01 15:59:58 得分 0
忘记写问题点数,默认的是20了,如果解决开贴再送分Top
3 楼RockEx(石头)回复于 2004-12-01 16:02:00 得分 3
你返回的数据固定吗
比如说数据为的类型......
说的详细一些。Top
4 楼relive8(飘叶)回复于 2004-12-01 16:08:16 得分 0
TB = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
end;
procedure TB.Button1Click(Sender: TObject);
begin
try
a.Memo1.Lines.Append('sd');
except
showmessage('出错误了');
end;
end;
结果报错误,好象是不能访问 窗体 a 中的对象
Top
5 楼relive8(飘叶)回复于 2004-12-01 16:12:56 得分 0
procedure TA.Button4Click(Sender: TObject);
begin
Application.CreateForm(TB,B);
b.Edit1.Text := memo1.Text;
b.ShowModal ;
end;
这写都是封装在dll中的Top
6 楼relive8(飘叶)回复于 2004-12-02 08:47:03 得分 0
今日高手多多,往上顶Top
7 楼LouisCool(迷惘)回复于 2004-12-02 08:57:55 得分 3
b窗体操作完以后我要把数据传回给 a 窗体,同时关闭 b 窗体,结果内存报错!
你是在B窗体里面关闭的B窗体吧?如果是的话,那这样是肯定出错的!Top
8 楼relive8(飘叶)回复于 2004-12-02 10:09:20 得分 0
我把代码列出来,大家来看分析一下:
//Project2.dll代码如下:
library Project2;
uses
ShareMem,
SysUtils,
Classes,
Unit2 in 'Unit2.pas' {Form2},
Unit4 in 'Unit4.pas' {Form4};
{$R *.res}
{ 下面的语句用于向调用该 DLL的程序提供调用接口 }
exports
TestFrm, { 过程来自单元Unit2 }
GetStr;
begin
end.
//-------------------------'Unit2.pas' 代码如下:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;
type
TForm2 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ADOConnection1 : tADOConnection;
end;
var
Form2: TForm2;
{ 该过程向外提供 }
procedure DoTest(H: THandle; { 获得调用者的句柄 }
AConn: TADOConnection;{ 获得调用者的数据库连接 }
S: string; { 获得一些文本信息 }
N: Integer;comminfo:TCommonInfo); { 获得一些数值信息 }
cdecl; { 指定调用协议 }
function GetStr(iStr:string):string;
implementation
uses Unit4;
{$R *.dfm}
procedure ShowForm3(H:THandle);stdcall;external 'Project3.dll';
procedure DoTest(H: THandle; AConn: TADOConnection; S: string; N: Integer);
var
frmdll : TForm2;
begin
Application.Handle := H;
frmdll := TForm2.Create(nil);
with frmdll do
try{ 创建窗体 }
Memo1.Lines.Append('成功调用');
ADOConnection1 := AConn;
//------------------------------------------------------
memo1.Lines.Append(comminfo.StaffName);
memo1.Lines.Append(comminfo.StaffPassword);
frmdll.Show;
finally
// Free; { 调用结束时销毁窗口 }
end;
end;
function GetStr(iStr:string):string;
begin
result := iStr + iStr ;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
ShowForm3(Application.Handle);
end;
procedure TForm2.Button3Click(Sender: TObject);
var
MyQuery :TAdoQuery;
SqlStr : string;
begin
//-----------------------------------------------------
MyQuery := TAdoQuery.Create(nil);
with MyQuery do
begin
connection := ADOConnection1 ;
SqlStr := ' select * from officestar..person ';
if active then
close;
sql.Clear;
sql.Add(SqlStr);
open;
if not IsEmpty then
begin
while not Eof do
begin
memo1.Lines.Add(fieldbyname('psnname').AsString);
next;
end;
end;
end;
MyQuery.Free;
end;
procedure TForm2.Button4Click(Sender: TObject);
begin
Application.CreateForm(TForm4,Form4);
form4.Edit1.Text := memo1.Text;
form4.ShowModal ;
end;
end.
//----------------------'Unit4.pas'的代码如下:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
begin
try
form2.Memo1.Lines.Append('sd');
except
showmessage('出错误了');
end;
close;
end;
end.
问题:通过主程序调用可以产品 form2, 通过form2也可以产生 form4,就是在form4的
procedure TForm4.Button1Click(Sender: TObject);
执行后就出错了,不把form4关闭也出同样的错误,内存报错误,为什么不能回访form2中的内容呢??
Top
9 楼relive8(飘叶)回复于 2004-12-02 10:12:43 得分 0
纠正一下上面的
library Project2;
uses
ShareMem,
SysUtils,
Classes,
Unit2 in 'Unit2.pas' {Form2},
Unit4 in 'Unit4.pas' {Form4};
{$R *.res}
{ 下面的语句用于向调用该 DLL的程序提供调用接口 }
exports
DoTest, { 过程来自单元Unit2 }
GetStr;
begin
end.Top
10 楼relive8(飘叶)回复于 2004-12-08 08:37:54 得分 0
问题没有解决,UP一下Top
11 楼huaneww(向往牛人)回复于 2004-12-08 08:57:18 得分 3
关注~Top
12 楼zijida(左八荣,右八耻,代表挂腰间,和谐贴胸前,人挡杀人,佛挡杀佛!)回复于 2004-12-09 11:19:24 得分 3
建议:
不要在Form4里面试图操纵Form2,而是反其道而行之。Top
13 楼pl5th2001(白牙)回复于 2004-12-09 12:28:03 得分 4
90%的可能 :form1 创建 from2,在form2关闭时自己释放了,在form1中采用了form2.showmodal; form2.free;的方法,这个 时候form1找不到form2,就报内存错误Top




