问delphi的两个问题,传参问题和内存问题

xf5o5o5o5122 2008-03-11 10:21:03
传参问题
1.在b/s中一般用url和session就可以实现传参了,那么在delphi的c/s模式的窗体开发怎么传参到另一个窗口。

我现在做法是在原窗体建一个变量,把值附到这个变量上去,弹出其他窗体时再在这个弹出的窗体掉用原窗体的这个变量。

还有就是在原窗体create一个要弹出的窗体,把值写到这个新创建窗体的变量里去。

我想知道那种比较好?大家平时写又是如何传参的?


内存问题
2.我是用window的任务管理器看的。
我在一个窗体里创建并弹出另一个窗体,另一个窗体只是从数据库里拿了些数据出来显示在datagrid里,然后关掉这个弹出窗口。
只有原窗口用的内存是9500左右,弹出后是9800,但是我关了这个弹出窗口它还是占9800,而且就算我再打开该窗口,它的内存使用也不会升了。这是正常的吗?
不是关了弹出窗口后内存使用会降回来的?
一下是弹出窗口的代码

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
ADOconnection1.Connected :=false;
ADOconnection1.ConnectionString:= 'Provider=MSDASQL.1;Persist Security Info=False;;User ID=admin;Password=admin;DATABASE=MyadvertiseSystem;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PORT=0;SERVER=192.168.71.238;';
ADOconnection1.LoginPrompt:=false;
ADOconnection1.Connected:=true;
with ADOQuery1 do
begin
close;
SQL.Text := 'SET NAMES GB2312;';
ExecSQL();
SQL.Clear;
SQL.Text := 'select * from adstyle order by ID;';
open;
end;
end;



下面是原窗口代码

procedure TForm1.Button3Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.ShowModal;
end;


希望高手们指点一下。
...全文
152 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony_102 2008-03-14
  • 打赏
  • 举报
回复
这个问题的原因是,Form2是你自己创建的,那么必须要自己进行释放。
这是在主窗体里创建的Form2,
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);
Form2.ShowModal;
end;

当你不用Form2是必须回到主窗体释放它:

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Free;
end;
xf5o5o5o5122 2008-03-14
  • 打赏
  • 举报
回复
谢谢大家了
hongqi162 2008-03-14
  • 打赏
  • 举报
回复
form2:
private
Faa:string;
public
property aa:string read Faa write Faa;


form1:
with TForm2.Create(Owner) do
begig
aa:='123';
showmodal;
destroy;
end;

这样就可以把参数传递到form2里了

另外你还可以重载form2的构造函数
constructor create(AOwner:TComponent;aa:string ....);
禹爸爸 2008-03-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 scfanxzq 的回复:]
第一个问题,我们公司的解决方案我觉得挺不错的,这里共享一下。
在弹出窗体的pas文件里面定义一个函数(不是窗体类的函数),自己设置参数,这个函数的作用就是接受参数,并且调用弹出窗口的Creat和ShowModal的。
然后在主窗体直接调用刚才定义的那个函数,就能把想传的参数都传进去了。楼主你可以看看好不好使
[/Quote]

这个方法的确不错,但使用的还是面向过程的方法。

有种比较OO的作法,就是将这个定义改为弹出窗体类的类函数,然后在主窗体中直接调用该类的类函数即可。

例:
type
TPopForm = class(TForm);
private
...........
protected
...........
public
class function Execute(Param: Variant): Boolean; //可以将参数类型改为你需要的类型
end;

class function TPopForm.Execute(Param: Variant): Boolean;
begin
with TPopForm.Create(Nil) do
try
//接收参数
...........
Result := ShowModal = mrOK;
finally
Free;
end;
end;


主窗体里只要使用类似TpopForm.Execute('aaa')的语句调用。
xf5o5o5o5122 2008-03-13
  • 打赏
  • 举报
回复
问题2. “不能适时看到内存变化”,你把程序最小化到任务栏,然后再还原,你就能看到内存变了。
----------
我试过了,没变化,但是再开同个窗口内存又没再加,证明应该释放了.



还有谢谢楼上的方法.大家回答一下我第二个问题啦,我肯定结帖的哦.
xf5o5o5o5122 2008-03-13
  • 打赏
  • 举报
回复
问题2. “不能适时看到内存变化”,你把程序最小化到任务栏,然后再还原,你就能看到内存变了。
----------
我试过了,没变化,但是再开同个窗口内存又没再加,证明应该释放了.



还有谢谢楼上的方法.大家回答一下我第二个问题啦,我肯定结帖的哦.
xf5o5o5o5122 2008-03-13
  • 打赏
  • 举报
回复
问题2. “不能适时看到内存变化”,你把程序最小化到任务栏,然后再还原,你就能看到内存变了。
------------------
这个我试过了,没变化.但是再开同一个窗口就没再加了,证明应该是释放掉了.


还有谢谢楼上的方法.
scfanxzq 2008-03-13
  • 打赏
  • 举报
回复
第一个问题,我们公司的解决方案我觉得挺不错的,这里共享一下。
在弹出窗体的pas文件里面定义一个函数(不是窗体类的函数),自己设置参数,这个函数的作用就是接受参数,并且调用弹出窗口的Creat和ShowModal的。
然后在主窗体直接调用刚才定义的那个函数,就能把想传的参数都传进去了。楼主你可以看看好不好使
etomahawk 2008-03-12
  • 打赏
  • 举报
回复
问题1. 我采用给窗体publish出来一个属性,然后给它赋值:

if not Assigned(frmTest)
frmTest:= TfrmTest.Create(nil);

try
frmTest.TestValue:= '测试';
frmTest.ShowModal();
finally
FreeAndNil(frmTest);
end;

问题2. “不能适时看到内存变化”,你把程序最小化到任务栏,然后再还原,你就能看到内存变了。
xf5o5o5o5122 2008-03-11
  • 打赏
  • 举报
回复
Form2 := nil;我试过了 加了没作用,都free掉了,应该不用再附个nil了
火龙岛主 2008-03-11
  • 打赏
  • 举报
回复
free后增加一个
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
Form2 := nil;
end;
xf5o5o5o5122 2008-03-11
  • 打赏
  • 举报
回复
先谢谢两位的回答。

二楼的大大,我以前试过加关闭数据集及数据库连接的代码,还把它们free了,但是完全没作用。我也觉得只要parent被free了,他们就一起被释放了,而且我进去数据库里看过,关了窗口后那个连接自动没掉了,相信不关事。

三楼的大大,我等了很久,任务管理器都没有回落啊,不知道你说的“实时反应内存的变化”是什么意思。但是我把主程序关了,它就有反应了。

这个只是试验程序,我真正的程序里有很多窗口弹出的,每开一个以前没开过的窗口后,内存都会加,如果很久不重启程序,那个内存占有量是我打开过的窗口使用的内存的总和(基本就是我程序里所有窗口都打开的总和了)

我用这个测试程序建了很多个弹出窗口测试,全部都打开过后(打开后关闭了),内存从9500伸到14000左右啊,都不知道怎么回事.
hsmserver 2008-03-11
  • 打赏
  • 举报
回复
2\释放了就可以了,Query1等的parent是新窗口,所以窗口释放它也就释放了
不过windows的任务管理器并不能实时反应内存的变化,这种情况正常
hsmserver 2008-03-11
  • 打赏
  • 举报
回复
新窗体直接定义个变量
private
fval:type;
再加个方法
public Setval(val:type);
begin
fval:=val;
end;
禹爸爸 2008-03-11
  • 打赏
  • 举报
回复
1.如果某一变量需要在两个或更多的窗体间共用,建议将其定义在一个单独的单元文件中,需要使用该变量的窗体引用该单元即可;
2.在弹出窗体的关闭事件(OnClose)中添加关闭数据集及数据库连接的代码。

16,742

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧