现在有一窗体(比如是frmTest),他是这么创建的:
ShowForm(frmTest, TfrmTest);procedure TfrmMain.ShowForm(FormName: TForm; FormClassName: TFormClass);
begin
FormName := FormClassName.Create(plMain); //plMain 是一个Panel,frmMain为主窗体,主窗体包含plMain。
FormName.Parent := plMain;
FormName.Align := alClient;
FormName.Show;
end;在frmMain创建完frmTest之后,现在在frmTest又创建了一个ModalForm(frmModalTest)来和frmTest进行交互,或者说frmModalTest和frmTest需要互相访问一些数据。在frmTest创建frmModalTest代码如下:
frmModalTest := TfrmModalTest.Create(nil);
try
frmModalTest.ShowModal;
finally
FreeAndNil(frmModalTest);
end;但是问题现在出现了:无法在frmModalTest里面访问frmTest里面的数据。比如:
frmModalTest.label1.Caption:=frmTest.label1.Caption 这样就会出错。查看得知frmTest的句柄竟然是nil(0)!我已经在frmModalTest里面uses frmTest 的单元了!
请问这究竟是怎么回事?该如何访问 frmTest.label1.Caption ?谢谢!
ShowForm(frmTest, TfrmTest);procedure TfrmMain.ShowForm(FormName: TForm; FormClassName: TFormClass);
begin
FormName := FormClassName.Create(plMain); //plMain 是一个Panel,frmMain为主窗体,主窗体包含plMain。
FormName.Parent := plMain;
FormName.Align := alClient;
FormName.Show;
end;在frmMain创建完frmTest之后,现在在frmTest又创建了一个ModalForm(frmModalTest)来和frmTest进行交互,或者说frmModalTest和frmTest需要互相访问一些数据。在frmTest创建frmModalTest代码如下:
frmModalTest := TfrmModalTest.Create(nil);
try
frmModalTest.ShowModal;
finally
FreeAndNil(frmModalTest);
end;但是问题现在出现了:无法在frmModalTest里面访问frmTest里面的数据。比如:
frmModalTest.label1.Caption:=frmTest.label1.Caption 这样就会出错。查看得知frmTest的句柄竟然是nil(0)!我已经在frmModalTest里面uses frmTest 的单元了!
请问这究竟是怎么回事?该如何访问 frmTest.label1.Caption ?谢谢!
在 frmModalTest 里 use frmMainfrmMain 里声明 frmTest ,
你可以把 FrmTest的句柄显式的传给frmModalTest。仅仅Uses了frmTest单元式不够的。
1、将frmModalTest := TfrmModalTest.Create(nil);改为
frmModalTest := TfrmModalTest.Create(self);
2、将frmModalTest.label1.Caption:=frmTest.label1.Caption 改为
frmModalTest.label1.Caption:=TfrmTest(self.owner).label1.Caption 建议你创建模式窗体时如果模式窗体和其他窗体有关联得话不要用create(nil),用create(self)
ShowForm(frmTest, TfrmTest);procedure TfrmMain.ShowForm(FormName: TForm; FormClassName: TFormClass);
begin
FormName := FormClassName.Create(plMain); //plMain 是一个Panel,frmMain为主窗体,主窗体包含plMain。
FormName.Parent := plMain;
FormName.Align := alClient;
FormName.Show;
end;
主要是想做一个类似OutLook那样的左右形的界面(就像现在CSDN论坛形式),最初使用TNote做的,但是一则窗体(NoteItem)较多,二则窗体多比较类似,所以就采用再主窗体上点击OutLookBar的时候就显示相应的窗体。其他的就好说了。这个创建的窗体需要输入的数据的一部分可以通过一个类似向导的窗体来辅助完成的。因此就发生了上面的代码。一个最无奈的解决办法就是引用第三方单元(比如全局变量、public函数什么的)。或者就笨笨地遍历各个窗体,判断为需要的就使用。这可以回答一些朋友的问题了。另外对一些朋友的回答也还望这些朋友再解惑一下:To:ahyf
在 frmModalTest 里 use frmMain,frmMain 里声明 frmTest
//已经这样声明过,不行的。:(To:zeroxing
难道你认为调用了这个ShowForm后,你的frmTest就已经指向你在该过程里面创建的那个FormName了么?还是参数的传递问题!你这样过后,frmTest该是nil还是nil!
//那应该怎么做呢?诚心求教。之所以做成一个函数是因为不想重复这些创建类似窗体的代码,而且就算不用这个函数,直接创建那也是不行的。还是不能直接引用。To:zkw
不知Create(self)和Create(nil)有什么区别呢?
直接写:frmModalTest := TfrmModalTest.Create(self); 是可以运行的,但是如果写成一个函数则不能编译:
ShowModalForm(frmModalTest, TfrmModalTest);
procedure ShowModalForm(FormName: TForm;FormClassName: TFormClass);
begin
FormName := FormClassName.Create(Self); //不能编译,说Self未定义。:(
try
FormName.ShowModal;
finally
FreeAndNil(FormName);
end;
end;
begin
FormName := FormClassName.Create(Self); //不能编译,说Self未定义。:(
try
FormName.ShowModal;
finally
FreeAndNil(FormName);
end;
end;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你对Self的含义完全没理解,你的这个函数不是类的成员,自然没办法在函数里面用Self.
procedure TfrmMain.ShowForm(var FormName: TForm; FormClassName: TFormClass);