补充一下:
    procedure ShowModalSelf();只有定义在Public才可以,这又是为什么呢?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
       form2:=Tform2.Create(application);
       Form2.ShowModal;
       Form2.free; //释放Form2所占资源 
    end;原因:
    你将Form2从project的左边移到了右边
    Form2不会在程序运行时自动创立,
    在调用Form2.ShowModal必需先建立它,它加入内存
      

  2.   

    是啊。shuixin13没理解我的意思哦。
      

  3.   

    我在CPU窗口里发现在Form2.ShowModalSelf;这句上面调用的汇编语句是:
    CALL TForm2.ShowModalSelf;
    不是我想象的Form2.ShowModalSelf;
    另外,ShowModalSelf过程实现的代码在Form2.ShowModalSelf的前面;
      

  4.   

    我想应该是这样
    既然在form1中user unit2.
    所以delphi编译器就把他当个单元,所以你在其中写任何函数当然可以调用了“Form2已经从project的坐边移到了右边了”
    这个只表明form2在工程文件中不自动创建而已
    窗体不创建但不表示单元不可以引用,
    如果用Form2.ShowModal因为窗体没有建立所出错,而Form2.ShowModalSelf方法中有窗体建立的代码,所以运行正常
    “按道理在实列没创建时,应该不能调用他的方法的啊”
    单元是不需要建立的吧,否者全局模块不是必须有个窗体了 呵呵
      

  5.   

    补充一下“procedure ShowModalSelf();只有定义在Public才可以,这又是为什么呢?

    如果定义为私有,form1就不能引用该函数了
      

  6.   


    我后来又想了想,我想可能是DELPHI程序运行时并不检查对象是否已经创建。
    当调用showmodal时,它直接就去访问它认为的这个类的地址,
    结果window认为程序访问了不该访问的地方,然后windows就报错了。(并不是delphi程序产生的异常)说程序访问了无效地址。当调用showmodalself时,程序一路走来,恰好一直执行顺利,自然就没什么错误了。我还试过不创建实例就访问它的属性,也可以,并且得到一个随机值。我想
    就是这个原因了。关于效率,我根本不认为这样高明,还容易误导大家,^_^ 
    我通常都是写一个全局的单元引出函数,作用和这个一样。
    主要用来控制创建前的一些东西,并且利于单元的模块化,
    通过一个函数来访问整个单元,是我比较欣赏的做法。上面是我的个人意见,不足之处还请方家斧正!
      

  7.   

    有道理。是不是可以说,在对象实例没有被创建以前,
    也可以访问对象实例的一些方法了??
    感觉好象违反了OOP的原则哦。
      

  8.   

    呵呵,违反了哪个原则呢?
    oop并没有告诫我们不要去访问一个未创建的实例的方法啊?
    只是在开发指南上经常告诫我们不要去访问未创建的实例的方法,免的异常。不过,对于这个问题我还是很模糊,我想应该有不对的地方的。
      

  9.   

    我认为在form2中所有在public中声明的在form1中都可以调用,但是调用的过程或函数中不能有在form2创建前不能执行的代码,因为这样虽然执行代码,但是他却没有实例的,会出现访问错误。
      

  10.   

    对了,你过你调用form2的某个public中的过程和函数,失败了,哪在这个过程或函数中肯定访问了未创建的实例。方法吗应该无法调用,只有过程和函数才能在创建前调用
      

  11.   

    调试时MOV EAX, [$0044eee4]
    MOV EAX, [EAX]
     //此时EAX=0即为Form2的值,被传进ShowModalSelf也就是Self值
    CALL TForm2.ShowModalSelf
    可在TForm2.ShowModalSelf加上句
     ShowMessage(IntToStr(Integer(Self)));
    显示零
    因为这里没有对Form2的成员作操作,可加一Button
    procedure TForm2.ShowModalSelf();
    begin
       ShowMessage(IntToStr(Integer(Self)));
        Application.CreateForm(TForm2, Form2);
         Button1.Caption := 'gyb';
       Form2.ShowModal ;
    end;
    则肯定会出错,正是没有对Form2的成员操作,才会正常运行其实这也就相当于
    procedure TForm2_ShowModalSelf(Self: TForm2);
    begin
       Application.CreateForm(TForm2, Form2);
       Form2.ShowModal ;
    end;
    Form2.ShowModalSelf 
    也就是
    TForm2_ShowModalSelf(Form2);我也觉得这种写法很是误导人
      

  12.   

    Form2是一个全局变量(Unit2中)Application.CreateForm(TForm2, Form2);
    Form2.ShowModal;
    //如上代码执行多次,就会相当于
    Form2 := TForm2.Create(Application);
    Form2 := TForm2.Create(Application);
    Form2 := TForm2.Create(Application);
    //.........//一种参考写法
    with TForm2.Create(Application) do try
      ShowModal;
    finally
      Free;
    end;
      

  13.   

    showmodalsel是静态方法,静态方法可以,不创建对象,直接调用
    即,Classname.showmodalsel;用对象调用也可以ClassObject.showmodalsel
    同样静态成员也可这么调用,
    而非静态的方法是不可以得,必须先创建对象然后调用
      

  14.   

    zswang(伴水)(需要充充电) 你讲的跟这个帖子不相关啊
      

  15.   

    snowmiao2002(苗苗)启发了我,有道理。我这样想不知道对不。我以c++的规则去看,静态函数是编译时(也可以看作未有实例时)就确定了它的地址的,但这个类静态函数代码在内存中只有一份,在编译是便确定了他的内存地址。所以delphi 才可以直接去访问。
      

  16.   

    静态方法
    Classname.showmodalsel
    这样调用能通过码
    TForm2.ShowModalSelf;类方法才能这样调用