我在form1中定义了一个全局的函数,与几个全局的变量,在这个全局函数中
调用了这个全局变量。都是在pubulic下写的。
     具体问题如下:
        在form1中定义了一个名为main的全局函数 和 名为ok的全局变量,string型, 先调用的是form2,在form2中让ok:='1',然后form2就释放了。
当我在form3中调用main的时候,ok却为空了,这是为什么?
      
  还有个问题,我在form1,form2和form3中都有一个按钮,名都为button1,
在main函数中我把button1.enabled:=false;
我的目的是,
当form1调用main的时候把form1的button1.enabled:=false;
当form2调用main的时候把form2的button1.enabled:=false;
当form3调用main的时候把form3的button1.enabled:=false;
单每次都是把form1的button1.enabled:=false;以为函数是在form1中写的
如果要实现上面的功能,这个函数该怎么写。
先谢谢各位大家了。

解决方案 »

  1.   

    什么情况下释放的?
    form.button1.enabled:=false;
    这样就不会错了
      

  2.   

    在写main这个函数得时候加一个参数aButton:TButton
    在各个form调用main的时候用main(self.button1)
      

  3.   

    release释放的,但是变量已经有值了呀。
    为什么在函数内调用的时候就变空了呢?
      

  4.   

    楼上说的“在写main这个函数得时候加一个参数aButton:TButton
    在各个form调用main的时候用main(self.button1)”
    不好使。main(self.button1)调试都同不过。
      

  5.   

    1.
      你的说明看不出问题,请贴出代码
    2.
    //Form1中的main函数
    function TForm1.main(sButton: TButton): Boolean;
    begin
    .....
      sButton.Enabled:= False;
    .....
    end;//Form2中调用main
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    Form1.main(Self.Button1);
    end;
      

  6.   

    还有个问题,比如说我有个变量,和多个按钮,变量的值是按钮的名。
    怎么来通过这个变量来改变按钮的状态?
       比如
    var 
       buttonname:string;
    begin
      buttonname:='button1';
      //怎么来通过buttonname来把button1.enabled:=false;
       //不是直接写button1.enabled:=false;end;
      

  7.   

    对了你确定form1,form2,form3先后运行的关系了吗?如果form3的运行是在form2之前那么ok='',只要确定三者运行的关系我想应该是没问题的
      

  8.   

    还有个问题,比如说我有个变量,和多个按钮,变量的值是按钮的名。
    怎么来通过这个变量来改变按钮的状态?
       比如
    var 
       buttonname:string;
    begin
      buttonname:='button1';
      //怎么来通过buttonname来把button1.enabled:=false;
       //不是直接写button1.enabled:=false;end;
      

  9.   

    还有个问题,比如说我有个变量,和多个按钮,变量的值是按钮的名。
    怎么来通过这个变量来改变按钮的状态?
       比如
    var 
       buttonname:string;
    begin
      buttonname:='button1';
      //怎么来通过buttonname来把button1.enabled:=false;
       //不是直接写button1.enabled:=false;end;
      

  10.   

    都是Delphi的OOP不够完善(只是在TForm的使用上,其他的部分OOP思想可以称为典范)造成的问题。
    ----------------
    在form1中定义了一个名为main的全局函数 和 名为ok的全局变量,string型, 先调用的是form2,在form2中让ok:='1',然后form2就释放了。
    当我在form3中调用main的时候,ok却为空了,这是为什么?
    --你将代码这样写:
    在Form2中:Form1.ok:='1';然后在Form3中可以同样调用:value:=Form1.ok
    -----------------
    单每次都是把form1的button1.enabled:=false;以为函数是在form1中写的
    如果要实现上面的功能,这个函数该怎么写。
    --那是因为函数成为Form1的成员函数,当然只是调用其中的成员数据(button1.enabled,因为button1是form1的一个域嘛)了,你可以在你的任何单元或是项目文件中写上这个函数,如果牵涉到调用你前面提到的ok的值,那么OK这个值也要放在任何form之外。这样就做到了真正的全局数据,因为它们现在都是Application级的全局数据了,所有的单元都可以调用,并确全局函数将根据参数返回不同的东东了。
    如:procedure Main(var a:tcompnent);
        begin
          if a is tbutton then
           tbutton(a).enable:=false;
        end;
    调用时可以这样用:Main(form1.button1);
                      Main(form2.button1);
                      Main(form3.button1);以上只是一家之言,还没有在Delphi环境下试过,你试试,有问题可以Mail:
    [email protected]
      

  11.   

    还有个问题,比如说我有个变量,和多个按钮,变量的值是按钮的名。
    怎么来通过这个变量来改变按钮的状态?
       比如
    var 
       buttonname:string;
    begin
      buttonname:='button1';
      //怎么来通过buttonname来把button1.enabled:=false;
       //不是直接写button1.enabled:=false;end;
    -----------------------------
    你试试用FindComponent吧,如:
    Button:=findcomponent(buttonname) as TButton;
    Button.enabled:=false;
    也可以遍历组件,如:
    var i:integer;
    for i:=0 to componentcount-1 do
    begin
     if component[i].name=buttonname then
        TButton(component[i]).enabled:=false;
    end;