刚做个小程序。在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;

解决方案 »

  1.   

    formchoose  是哪个单元的变量
      

  2.   

    form2.formchoose  这个form2容易引起歧义,用self试试
      

  3.   

    去掉form2.
    不过理论上说,这样也没错...
    搞不灵清
      

  4.   

    不能去掉,因为要是有别的窗体呢?
    formchoose返回的是boolean,没错。
      

  5.   

    为啥加个panel就不行了呢?大家都进来说说!
      

  6.   

    form3:=Tform3.create(Application); 
      

  7.   

    form2在TForm1里定义的,那你在TForm2里使用form2.formchoose ,那这个form2在哪定义初始化的,
      

  8.   

     form4.show; 
        end; 
      end; 
    在这后面加点代码就可以了
      

  9.   

    试了下,我加了个showmessage在后面就能执行,不清楚什么原因,呵呵
      

  10.   

    你上面的代碼在那個單元寫的.要是不在 unit2中,在其他單元,那么你要在uses中 加個Unit2.
      

  11.   

    form3.show; 
    用这句话之后 程序执行的焦点转移了 
    你把 form3.show; 
    改为
    form3.ShowModel ;应该就可以了
      

  12.   


    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;
      

  13.   

    我用两个form试的,可以
    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));
      

  14.   

    procedure TForm1.Button1Click(Sender: TObject);
    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,看看都谁改变了他?
      

  15.   

    simonhehe 。form2.formchoose是不能去掉的。要是有别的窗体呢?比如说form5.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;
    这么写对不?
      

  16.   

    我改了下。在form1的button事件里,就可以了。
    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;
    这么写成不?
      

  17.   


    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;
      

  18.   

    刚做个小程序。在panel上显示窗体。有点疑问。 
    procedure TForm1.Button1Click(Sender: TObject); 
    //var 
    //form2:Tform2; 
    begin 
      form2:=Tform2.create(nil); 
      form2.parent:=form1.Panel1; 
      form2.align:=alclient; 
      form2.show; 
    end; 
    把這個去掉。
    問題就是:類與變量的問題。  :)
      

  19.   

    把Unit2单元的代码贴出来,才能做出诊断
      

  20.   

    if form2.formchoose  then  //这为什么不执行?----------把红色的东东去掉。要么就把form2声明为全局变量
      

  21.   

    续上:if form2.formchoose  then  //这为什么不执行?------把红色的东东去掉。要么就把form2声明为全局变量-------但你需要知道,把“form2.”去掉,实际上就相当于使用“Self.”:
           if Self.formchoose then ,这样,所有TForm2的实例在运行这一句时都是检查实例自己的成员formchoose而如果把form2声明为全局变量,则if form2.formchoose then 只是检查form2的成员formchoose----你或许要问,已经有一个全局变量form2了,为什么检查不到它的formchoose?因为你在TForm1.Button1Click里又声明了一个局部变量form2,而它在过程外是不可见的(事实上一旦TForm1.Button1Click运行结束,这个局部变量form2已被清理出栈,不存在了)
    所以,32楼所说“类与变量的问题”并不准确---应该是“局部变量与全局变量”“变量的可见性”的问题。
      

  22.   

    续上:说得再清楚一点,请看注释:uses Unit2;{Unit1中应该有这句的,并且Unit2中一定有“var form2: TForm2”--这就是那个全局的}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;{此时是为局部的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是不可见的} 
      

  23.   

    lihuasoft 真是热心人,每个回帖都那么认真 :-)
      

  24.   

    lihuasoft 。那我还有个问题了,假设我要还有个form5,在form5里也有个全局变量formchoose。代码跟form2是一样的。不加form2.formchoose或者form5.formchoose拿就没法判断了呀。
      

  25.   

    你的form5也好 form2也好 都在哪调用的。。 是在别的单元里 还是在unit1单元下动态创建的?
      

  26.   


    如果你的意思是每次都是判断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其实我更多地是在为你讲解“为什么”,一旦你真正理解了“为什么”,那就能应付所有改变了
      

  27.   

    续上。提出新的问题、或者把问题引向更具体的应用的时候,你首先要搞懂目前的答复。说白了,就是搞懂45、46楼的意思。如果你没有明白45、46楼的意思,再提问那也是白搭。为了帮助你理解“为什么”,你可以在
    procedure TForm2.Button1Click(Sender: TObject);
    里加一句代码,看一下你创建的对象(用局部变量创建的那个)的名字是不是form2:Showmessage(Self.Name);
      

  28.   

    lihuasoft ,谢谢你,我想我已经懂了。谢谢大家。
    提前给大家拜个年吧,谢谢这一年来大家给我的帮助。
      

  29.   


    搞笑。  form2   去掉,你還要再訪問到 :formchoose  .
      

  30.   

     唉,  FormChoose   是 Tform2 的類的成員,你去掉訪問????
      

  31.   


    怎么,不可以吗?请您看清楚,我讲的是:
    if formchoose then 这样判断的当前TForm2实例的formchoose;
    if form2.formchoose then 这样判断的是全局变量form2的formchoose
      

  32.   


    莫非您不知道有一个隐含的东东叫Self?
      

  33.   

    回楼上:那请您详细讲解一下“唉,  FormChoose  是 Tform2 的類的成員,你去掉訪問???? ”这句话的意思?或者说一下我在前面的讲解哪处搞笑
      

  34.   

    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; 
      唉,陰溝裏翻船。Tform2.button1click  沒看翠為他說的是 Tform1.   所以才說:FormChoose  是 Tform2 的類的成員,你去掉訪問???? 
    這次笑話搞大了。
      

  35.   


      哈哈,這次真搞笑了。  不過立華 兄, C++ 有個   this.  DELPHI  有個 SElf.    對吧???  我還沒到那麼水,哈哈。開個玩笑