在子窗体中调用父窗体过程的问题,请进来看看(50分)

  • 主题发起人 主题发起人 ppp
  • 开始时间 开始时间
P

ppp

Unregistered / Unconfirmed
GUEST, unregistred user!
Form1,Form2,Form3分别是三个窗体名。
Form1是主窗体,在Form1中动态创建了窗体Form2,在Form2中又动态创建了窗体Form3,
Form2中定义了一个public的过程procedure1,我在Form3中用Form2.Procedure1调用
过程procedure1时,总是出现内存错误,是不是因为Form2是动态创建的,必须用form2
创建时的实例名才能调用其中的过程?但我在form3中又如何才能得到form2创建时的实例
名呢?
 
大家来讨论讨论呀。
 
可以这样做吧
在form1中定义一个list之类的东西
当你每次创建一个form2的时候
都把他的窗体的指针记下来
然后在form3中使用form1上list记载中的procedure1
 
自己解决了,在Form3中
for i:=0 to Screen.FormCount-1 do
begin
if screen.form.caption='Form2' then (Screen.Form as TForm2).Procedure1;
end;
怎样收回积分呀?
 
顺便问一句,怎样动态生成窗体,请指教
 
我感觉解决方法不是太好,这样有些太勉强,你可以把 Form2在Form1只声明为Public
 
还有个好办法,用继承。
 
创建form3的时候:
...:=TForm3.Create(self)
form3调用form2的时候:
TForm2(Owner).Procedure1
 
这应该不会有什么问题吧,

语句:
implementation

之上的uses为全局性的,

之下的uses为本单元的,只要这样写,你看是否不出出错,
试试我的方法:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Form2;

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//Form2.Prode.....
end;

end.



 
一定是在Form1中創建Form2時語句有問題。
不能僅用這一句或類似這一句:
Tform2.create(Application);
應為:
If not assigned(Form2) then
Form2:=TForm2.Create(Application);
Form2.Show;
在form2的關閉時加上:
form2:=nil;
 
我是这样创建form2和form3的
procedure Tform1.onbutton1click()
var
frm2:TForm2;
begin
frm2:=TForm2.create(self);
Frm2.showmodal;
end;
procedure Tform2.onbutton1click()
var
frm3:TForm3;
begin
frm3:=TForm3.create(self);
Frm3.showmodal;
end;
 
在form3,你就用 TForm2(Owner) 得到form2
在form2,你就用 TForm1(Owner) 得到form1
 
pipi的方法不错,接受答案了
 
后退
顶部