关于窗口间过程调用的问题(100分)

  • 主题发起人 主题发起人 328xy
  • 开始时间 开始时间
3

328xy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个程序时遇到了以下问题:
主窗口 mainform
主窗口事件:创建并打开新窗口
managerform:=Tmanagerform.create(application);
managerform.show;
在MANAGERFORM中有一事件:创建并打开新窗口
CheckForm:=TCheckform.create(application);
checkForm.show;
在checkform有一事件调用managerform的方法
managerform.listbox1.clear;
运行时报错
但改为:mainform.listbox1.clear;
正确
请问各位大虾这是如何,我应该如何调用才正确
 
各位,帮帮忙啊
 
>>运行时报错
说明编译可以通过。你是不是在“checkform调用managerform的方法”时已经将managerform
关闭了?

>>改为:mainform.listbox1.clear; 正确
你想做什么?到底是改变managerform还是mainform?

还有,建议TXXXForm在创建的时候将 Create的参数设定为 mainform,而不是Application。
 
没有 USE MANAGERFORM单元吧?
 
要么managerform里没有listbox1
要么checkform里没有USE managerform单元
 
managerform没有关闭
我是想调用managerform的对象

已经uses了单元
 
是运行时出错,不是编译时出错
 
什么错误?

用断点截获一下,看看当时 managerform 是什么状态。
 
我发现如果三个窗口都在APPLICATION运行前自动创建就可以调用,但是这样太浪费资源了

如何使在程序运行中创建的窗体可以互相调用对象呢,请指教
 
用APPLICATION.CreateForm来创建窗口试试
 
你的程序有问题,我试验了一下,没有任何错误。

unit unit1;
...
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
...
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(Self);
Form2.Show;
end;


unit unit2;
...
TForm2 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
...
var
Form2: TForm2;
implementation
uses Unit3, Unit1;
{$R *.DFM}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3:=TForm3.Create(Form1);
Form3.Show;
end;


unit Unit3;
...
var
Form3: TForm3;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm3.Button1Click(Sender: TObject);
begin
Form2.ListBox1.Clear; //No problem
end;


program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1); //没有自动创建 Form2,Form3
Application.Run;
end.


你的变量定义和引用有问题
 
在mainform中定义managerform为全局变量就没问题了
 


procedure TForm2.Button1Click(Sender: TObject);
var form3:Tform3; //我在这里加了这个所以出错,能解释下为什么吗
begin
Form3:=TForm3.Create(Form1);
Form3.Show;
end;

先送50分

另有一问:
我为DBGRID定义了多个columns,我想在另一个窗体进行Columns是否显示的控制
例如上面例子
form2中有DBGRID1
有事件:
DBGRID1.COLUMNS[0].VISIBLE:=FALSE;
那么DBGRID中的字段一消失
而我在form3中有同样事件:
form2.DBGRID1.COLUMNS[0].VISIBLE:=FALSE;
执行后并无变化,这是为什么
creation兄,帮忙解决了剩余分数就全给你好吗
 
to creation-zy,
你怎么没错呢???????


正确的做法是:
把managerform定义在mainform的public中,在checkform的调用是
mainform.managerform.listbox1.Clear;

解释:
因为在checkform中访问到的managerform是在managerform的头里定义的,他(managerform)
没有被create,(create的是mainform中的事件),所以他没有被系统分配内存空间,访问的
时候就会报错。

 
>>var form3:Tform3; //我在这里加了这个所以出错,能解释下为什么吗
如果你在此处进行了定义,那么在此过程中用到的变量Form3就是局部变量,而不再是在
Unit3中定义的Form3了。——我认为Form3的定义与否没有关系,关键是Form2一定要是全局
唯一的。

to 楼上的兄弟:
你的作法同样有效,我同意——但是,如果他的三个窗体都是对等的——即其中任何一个
都可能被关闭,那么你的public方案就不行了。

>>执行后并无变化
怎么可能?其它的操作有效吗?
 
后一个问题是我不小心所致,现在问题解决了,散分了
 
多人接受答案了。
 
后退
顶部