一个包多窗体的问题(100分)

  • 主题发起人 主题发起人 newmoonfaw
  • 开始时间 开始时间
N

newmoonfaw

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个运行期包:InvPlan.bpk中有两个窗体
Form1.pas
Form2.pas
在主程序调入包之后通过findclass创建窗体Form1,现在通过Form1运行Form2窗体:
Form2:=TForm2.Create(self);
Form2.showmodal;
现想在Form2界面中修改Form1的控件Edit1.Text的属性,但因为窗体Form1在Form2.pas单元中没有创建实例,所以在Form2窗体中一执行修改就出错,不知如何处理?
 
可以考虑

Form2:=TForm2.Create(self);
Form2.showmodal;
改写成函数
function GetEdtTxt: string;
begin
Result := '';
Form2:=TForm2.Create(self);
if mrOK = Form2.showmodal then
Result := ...
end;
放在Form2.pas里面
 
To Japhe:可是那样的话就需要定义很多的变量,因为我想在Form2中设置很多内容的,比如设置打印的属性:页眉页脚等。本来我可以通过定义全局变量来,让Form2给全局变量赋值,然后地完Form2.showmodal就可以利用全局变量给Form1相应控件赋值,但这样总是不灵活,跟你提供的解决方法差不多。
 
可以定义一个记录类型,把你要返回的值全放到记录里面,先把功能实现了再说,呵呵。
type
TArrayTxt = record
edt1: string;
edt2: string;
...
end;
//Form2中函数
function GetEdtTxt(var ArrayTxt: TArrayTxt): Boolean;
begin
Result := FALSE;
Form2:=TForm2.Create(self);
if mrOK = Form2.showmodal then
begin
ArrayTxt.Edt1 := ...;
ArrayTxt.Edt2 := ...;
Result := TRUE;
end;
end;

form1中这么调用
var
tmpArrayTxt: TArrayTxt;
begin
if GetEdtTxt(tmpArrayTxt) then
begin
edit1.text := tmpArrayTxt.edt1;
...
end;
end;
 
你所说的办法就是我能想像的最后一招,现在不太清楚类似findclass方法能否返回类的实例,如果能的话,就好办了。。。
 
不是十分明白,最好有个例子。
 
给我分吧,我太穷了,把分都给别人了,但是别人不像我这么慷慨
 
那么这样的话我需要修改多少个属性就得有多少个参数了,这样似乎比
form2.showmodal;
form1.edit1.text:=form2.edit1.text;
这种方法还麻烦些。
 
参数多自己想办法解决,我就管不了了,你可以不传参数啊,反正Form1可以访问Form2中的任何公共成员
 
所以我希望form2能够访问form1的公共成员,实在不行就只好form1访问form2了,那样总是不太美满。
 
选中窗体二,file/user unit/uint1
之后就可以在form2中修改form1中的属性了嘛
 
调用(TForm(Form2.Ower)).FindComponent('ControlName')
 
to onlyonekgx:关键是form2.pas中无form1的实例,所以没有办法通过findcomponent查询form1的成员。
 
To newmoonfaw
我觉得在TForm2里设置公共属性(不是全局变量)来记录输入信息,TForm1作为客户类来访问这些公共属性才是正路(跟Japhe的建议差不多)。 如果在Form1里创建并打开Form2,Form2里又倒过来修改Form1,这两个类的耦合度就太高了,Form1和Form2的独立重用性一下子就没有了。
 
看来通过包技术真的无法实现像一个application那样使用多个窗体的互相通信。好吧,散分
 
后退
顶部