如何在窗体的控件的事件处理程序中引用当前的窗体变量? (75分)

  • 主题发起人 fatalexception
  • 开始时间
To 小雨哥:
 谢谢,能否讲一下,用指针的话该如何写?
 我的具体要求是:给定窗体内任何一个对象,操作它所在窗体的窗体变量。
 注意,我不是操作这个指针指向的内存区的内容,不是操作窗体的属性和方法,而是
 操作窗体变量本身,给它赋值。
 
你不会双腿盘坐在椅子上而希望双手将椅子提起来吧?
具体问题需要有具体的次序和方法。“给窗体本身赋值”?
var
obj:TObject;
begin
obj:=Form1;
caption:=obj.ClassName;
end;
 
我要:
在窗体运行期,将窗体偷梁换柱,类似“向导”程序。我打算使用一个窗体变量Form1,
先创建一个TForm1的实例赋值给它,在点击“下一步”时,创建TForm2的实例并赋值给
它,同时想办法释放TForm1的实例,一步一步,Form1变量的值变了好多次。但是,我要
把程序做成通用函数,不能在程序里写变量名Form1,希望能有个类似Self的东西,代表
当前对象所在窗体的窗体变量,供我调用。
 
uses unit1,unit2.....;
form1,form2,form3.....:TForm;
begin
form1:=Tform1.Create(Application);
form2:=Tform2.Create(Application);
.
.
.
end;
var
obj:TObject;
begin
Obj:=form1;
Obj.ShowModal;
.
.
.
obj.free;
form1.free;

Obj:=form2;
.
.
.
obj.free;
form2.free;
end;
是这样吗?我没试过,不知道。
但要处理好向导导出来的内容结果和如果用户需要“上一步”你怎么处理硒。
 
不过,做一个向导可以用向导控件,或 PageControl 就可以了,以前有贴子的。
还有就是 Delphi 目录下的 Demo 中有一个 Experts (专家)例子,其中的 dlg.pas
就是一个对话框向导。给,给大家分分喽。
 
老大啊,我已经说了N遍了,不要使用变量名。不要用Form1来操作啊!如果用Form1来
操作的话,那任何人(智商>10)&&(会ObjectPascal)都能做的,就直接Form1:=xxx了!
我现在是要在不能确定变量名的情况下用一个通用的变量或函数来给窗体变量赋值。
OK?麻烦你再想想。我不会赖分的,若为了赖分我就不会在这里守一个晚上了,办公
室就我一个人,泡方便面,还没空调,又热又困。况且75分也没必要赖。
 
fatalexception:
你的思路压根儿就不对,别再钻牛角尖了。
简单一点用PageControl,复杂一点用frame。
 
to Gmxyb,我不是只用于做向导啊,我只是给小雨哥一个例子,好让他思考啊。我要的是
个通用的方法。
 
我实在不知道你要干什么,你可以举个实际例子吗?
 
to Gmxyb:
最简单的例子,在TForm1.Button1Click中,可以用Self.Close来关闭窗体,无论窗体叫
什么名字,以后修改代码,将名字改成Form2了也可以用,将代码粘贴到Form888中也可以
用,这是使用Self给编码带来的好处之一。我就是想利用这个好处。但是,我需要改变这
个窗体变量的值,而不是引用它的属性和方法,明白了?
 
你说的self,是类的方法中的隐含的"当前类"实例指针,TForm1.Button1Click中可以用,你随便
写一个函数xx(),不放在类声明中,在xx()实现代码中要引用TForm1.xxx,必须用TForm1.
^^^^^^^^^^^^^^
再次强调,TForm1是一个指针,指向内存中代表窗体的一块内存,"改变窗体变量的值",
就是让TForm1指向了别处,再说具体点,TForm1本身就是一个integer,用一个integer
数组也可以保存窗体列表,只不过要用强制转换而已.
 
to Gmxyb:
是啊,我也知道Form1是一个指针,我就是要让它指向别处,有没有办法啊?
基本原则:不知道指针变量的名字,但现在正在这个窗体的子对象的事件处理程序中。
 
>>但现在正在这个窗体的子对象的事件处理程序中
"窗体的子对象的事件处理程序"也是窗体类的成员函数!!!不然怎么叫TForm1.xxxxxx..
不叫"子对象.xxxxxxxx"呢.

把你的代码贴出来吧!
 

代码就是我开始时贴过的啊:
procedure TForm1.Button1Click(Sender:TObject);
begin
ParentForm:=nil;
end;

我就是需要ParentForm这样一个变量或函数,能够对当前所在的窗体的窗体变量
进行赋值,但窗体可能是Form1,也可能是Form8,也可能是FormABC,我希望能
像Self一样,写上一个,到处粘贴;或者,改了窗体变量名,不用改实现代码。
就这么简单,还没明白吗?

 
这大概是在打算设计一个新的 VCL 元件时才会碰到的现象,如果没有说到这一点,可能
只能是隔靴搔痒。
 
Faint!
你不想引用窗体实便的方法和属性,那要用这个变量来干嘛呢?怎么操作?只是保存?
你那个 Form1:=xxxxx
中的xxxxx究竟是什么?窗体的实例对象?还是其它的东西?

这样行不行,把MyForm:TForm;定义成全局公共变量

然后在事件中
MyForm:=self;//不管是Form2,Form333都可以取得当前的窗体指针,不就是你想要的能
//代表不同窗体实例的变量吗?self不能接受其它类窗体的值,用通用变
//量保存一下,即可以引用当前的Self,又可以将通用变量赋值为其它的窗
//体指针,OK否?
MyForm:=SomeForm;//可以再指向你想要的其它窗体
 
to beyondair:
这样并没有引用Form1是吗?
 
谢谢各位啦!分数不多,先分了,谢谢小雨哥做了详细的分析。有什么好主义可以继续讨论啊。
 
顶部