刚做个小程序。在panel上显示窗体。有点疑问。
procedure TForm1.Button1Click(Sender: TObject);
var
form2:Tform2;
begin
form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.show;
end;
//******************
procedure TForm2.Button1Click(Sender: TObject);
var
form3:Tform3;
begin
formchoose:=true;//定义为公共变量
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
//*****************************************
if form2.formchoose then //这为什么不执行?
begin
i:=i+500;
if label1.Color=$006A714F then
begin
label1.Color:=clAqua;
end else label1.Color:=$006A714F;
if i>4000 then
begin
i:=0;
timer1.Enabled:=false;
form2.formchoose:=false;
form4:=Tform4.create(nil);
form4.parent:=form1.Panel1;
form4.align:=alclient;
form4.BorderStyle:=bsNone;
form4.show;
end;
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
i:=0;
end;procedure TForm3.FormShow(Sender: TObject);
begin
timer1.Enabled:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
form2:Tform2;
begin
form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.show;
end;
//******************
procedure TForm2.Button1Click(Sender: TObject);
var
form3:Tform3;
begin
formchoose:=true;//定义为公共变量
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
//*****************************************
if form2.formchoose then //这为什么不执行?
begin
i:=i+500;
if label1.Color=$006A714F then
begin
label1.Color:=clAqua;
end else label1.Color:=$006A714F;
if i>4000 then
begin
i:=0;
timer1.Enabled:=false;
form2.formchoose:=false;
form4:=Tform4.create(nil);
form4.parent:=form1.Panel1;
form4.align:=alclient;
form4.BorderStyle:=bsNone;
form4.show;
end;
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
i:=0;
end;procedure TForm3.FormShow(Sender: TObject);
begin
timer1.Enabled:=true;
end;
不过理论上说,这样也没错...
搞不灵清
formchoose返回的是boolean,没错。
end;
end;
在这后面加点代码就可以了
用这句话之后 程序执行的焦点转移了
你把 form3.show;
改为
form3.ShowModel ;应该就可以了
var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
form2:Tform2;
begin
form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.show;
end;
--------------------------
var
Form2: TForm2;
frmchoose : boolean;
i : integer;
implementationuses Unit3, Unit1, Unit4;{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
var
form3:Tform3;
begin
frmchoose:=true;//定义为公共变量
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
//*****************************************
end;
--------------------------
type
TForm3 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form3: TForm3;implementationuses Unit2, Unit4, Unit1;{$R *.dfm}procedure TForm3.FormCreate(Sender: TObject);
begin
i:=0;
end;procedure TForm3.FormShow(Sender: TObject);
begin
Timer1.Enabled := true;
end;procedure TForm3.Timer1Timer(Sender: TObject);
begin
if {form2.}frmchoose then //这为什么不执行?
begin
i:=i+500;
if label1.Color=$006A714F then
begin
label1.Color:=clAqua;
end else label1.Color:=$006A714F;
if i>4000 then
begin
i:=0;
timer1.Enabled:=false;
{form2.}frmchoose:=false;
form4:=Tform4.create(nil);
form4.parent:=form1.Panel1;
form4.align:= alclient;
//form4.BorderStyle:=bsNone;
form4.show;
end;
end;
end;
var
form2:Tform2;
i:Integer;
begin
i := 0;
formchoose:=true;
form2:=Tform2.create(nil);
form2.Show;
form2.align:=alclient;
if formchoose then
begin
i:= i+500;
end;
showmessage(IntToStr(i));
var
form2:Tform2;
begin
form2:=Tform2.create(self);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.show;
end;
//******************
procedure TForm2.Button1Click(Sender: TObject);
var
form3:Tform3;
begin
formchoose:=true;//定义为公共变量
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
//*****************************************
if formchoose then //这为什么不执行?
begin
i:=i+500;
if label1.Color=$006A714F then
begin
label1.Color:=clAqua;
end else
label1.Color:=$006A714F;
if i>4000 then
begin
i:=0;
timer1.Enabled:=false;
formchoose:=false;
form4:=Tform4.create(nil);
form4.parent:=form1.Panel1;
form4.align:=alclient;
form4.BorderStyle:=bsNone;
form4.show;
end;
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
i:=0;
end;procedure TForm3.FormShow(Sender: TObject);
begin
timer1.Enabled:=true;
end;你timer中做什么了?
你跟踪formchoose,看看都谁改变了他?
我找到了解决的办法。是在form1的button1ckick中这么写。
procedure TForm1.Button1Click(Sender: TObject);
//var
// form2:Tform2;
begin
//form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.formchoose:=true;
//form2.BorderStyle:=bsNone;
form2.show;
这么写对不?
procedure TForm1.Button1Click(Sender: TObject);
//var
// form2:Tform2;
begin
//form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.formchoose:=true;
//form2.BorderStyle:=bsNone;
form2.show;
这么写成不?
var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(Form2) then
begin
form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
end;
form2.show;
end;
///////////////////////////////////////
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
frmchoose : boolean;
end;var
Form2: TForm2;
i : integer;
implementationuses Unit3, Unit1, Unit4;{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
begin
frmchoose:=true;
if not assigned(form3) then
begin
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
end;
form3.show;
end;
///////////////////////////////////////
type
TForm3 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form3: TForm3;implementation{$R *.dfm}procedure TForm3.FormCreate(Sender: TObject);
begin
i:=0;
end;procedure TForm3.FormShow(Sender: TObject);
begin
Timer1.Enabled := true;
end;procedure TForm3.Timer1Timer(Sender: TObject);
begin
if form2.frmchoose then
begin
i:=i+500;
if label1.Color=$006A714F then
begin
label1.Color:=clAqua;
end else label1.Color:=$006A714F;
if i>4000 then
begin
i:=0;
timer1.Enabled:=false;
form2.frmchoose:=false;
form4:=Tform4.create(nil);
form4.parent:=form1.Panel1;
form4.align:= alclient;
//form4.BorderStyle:=bsNone;
form4.show;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
//var
//form2:Tform2;
begin
form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.show;
end;
把這個去掉。
問題就是:類與變量的問題。 :)
if Self.formchoose then ,这样,所有TForm2的实例在运行这一句时都是检查实例自己的成员formchoose而如果把form2声明为全局变量,则if form2.formchoose then 只是检查form2的成员formchoose----你或许要问,已经有一个全局变量form2了,为什么检查不到它的formchoose?因为你在TForm1.Button1Click里又声明了一个局部变量form2,而它在过程外是不可见的(事实上一旦TForm1.Button1Click运行结束,这个局部变量form2已被清理出栈,不存在了)
所以,32楼所说“类与变量的问题”并不准确---应该是“局部变量与全局变量”“变量的可见性”的问题。
var
form2:Tform2; {这是那个局部的}begin
form2:=Tform2.create(nil);
form2.parent:=form1.Panel1;
form2.align:=alclient;
form2.show;
end;
//******************
procedure TForm2.Button1Click(Sender: TObject);
var
form3:Tform3;
begin
formchoose:=true;{此时是为局部的form2的成员赋值}
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
//*****************************************
if form2.formchoose then {此时是在检查全局的form2的成员。在这里TForm1.Button1Click里的那个局部的form2是不可见的}
如果你的意思是每次都是判断form2.formchoose,那就这样:procedure TForm2、3、4、5、6、7.....Button1Click(Sender: TObject);
var
form3:Tform3;
begin
form2.formchoose:=true;
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
//*****************************************
if form2.formchoose then其实我更多地是在为你讲解“为什么”,一旦你真正理解了“为什么”,那就能应付所有改变了
procedure TForm2.Button1Click(Sender: TObject);
里加一句代码,看一下你创建的对象(用局部变量创建的那个)的名字是不是form2:Showmessage(Self.Name);
提前给大家拜个年吧,谢谢这一年来大家给我的帮助。
搞笑。 form2 去掉,你還要再訪問到 :formchoose .
怎么,不可以吗?请您看清楚,我讲的是:
if formchoose then 这样判断的当前TForm2实例的formchoose;
if form2.formchoose then 这样判断的是全局变量form2的formchoose
莫非您不知道有一个隐含的东东叫Self?
var
form3:Tform3;
begin
formchoose:=true;//定义为公共变量
form3:=Tform3.create(nil);
form3.parent:=form1.Panel1;
form3.align:=alclient;
//form3.BorderStyle:=bsNone;
form3.show;
唉,陰溝裏翻船。Tform2.button1click 沒看翠為他說的是 Tform1. 所以才說:FormChoose 是 Tform2 的類的成員,你去掉訪問????
這次笑話搞大了。
哈哈,這次真搞笑了。 不過立華 兄, C++ 有個 this. DELPHI 有個 SElf. 對吧??? 我還沒到那麼水,哈哈。開個玩笑