有两个窗体form1、form2,form1中代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.myshowform();
end;-----------------------------
form2中代码为:
  public
    procedure myshowform();
  end;var
  Form2: TForm2;implementationprocedure TForm2.myshowform();
begin
  form2:=TForm2.create(nil);
  self.show;
end;并且将Application.CreateForm(TForm2, Form2);这一行从工程文件中删除(即不让其自动创建)当执行单击form1中的按钮执行 form2.myshowform();时就会出错! 不知原因何在?但如果将self.show改为 form2.show时,则一切正常!

解决方案 »

  1.   


    procedure myshowform(); 
    var 
      Form2: TForm2; 
    begin 
      try
      form2:=TForm2.create(nil); 
      form2.show; 
      Finally
        Form2.Free;
      End;
    end; 
      

  2.   

    self.show;  self表示的是form1发重了吧
      

  3.   

    form2中代码为: 
      public 
        Class Function myshowform() : boolean;
      end; var 
      Form2: TForm2; implementation Function TForm2.myshowform(): boolean;
     
    begin 
      form2:=TForm2.create(nil); 
      self.show; 
    end; 
      

  4.   


    我也知道将self改成form2就正常,但请你解释一下原因!
      

  5.   


    self表示的是form1吗 ? 类的方法中,self代表的是由该类所创建的对象。 ------------------------------------------------------------------
    我想了想,初步解释原因:当执行form2.myshowform(); 时,此时form2尚不存在,所以编译器并不知道myshowform()方法中的self代表的是哪个具体
    对象(可能只是个空指针 nil ), 所以如果写成 self.show就会出错。但如果改成:
      self:=TForm2.create(nil);
      self.show; 则一切都正常了。甚至改成:  TForm2.create(nil).Show; 都将是正常的。
    ----------------------------------------
    不知以上解释正确否?
      

  6.   

    做了个测试:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
    form2.myshowform();end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    form2:=TForm2.create(nil);
    end;end.unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm2 = class(TForm)
        Edit1: TEdit;
      private
        { Private declarations }
      public   // Class
       Function myshowform() : boolean;    { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}function TForm2.myshowform: boolean;
    begin
    form2:=TForm2.create(nil);
    if   self is tform then self.show;
    //不要  if   self is tform then 也可以
    end;end.
    上面的代码运行成功,哪就是说self 失败的原因是因为self 代表FORM2,但是这个时候,FORM2还是不存在的,所以调用出错!
      

  7.   


    与我看法一致。self 代表FORM2,而此时self还不存在。唉,惭愧,这种小问题,自己一时竟没想到其原因。
      

  8.   

    因为var Form2 :TForm2; 定义在interface部分,是对外的,所以并不等于TForm2类实例的Self!也就是说,变量Form2是用于TForm2类之外的模块来访问的。你创建10000个TForm2实例,变量Form2只有一份,且指向最后创建的实例,但每个TForm2实例,都有自己的Self!所以不是问题奇怪,而是基本东西还没弄清楚。
      

  9.   

    才发现好玩的代码:function TForm2.myshowform: boolean;
    begin
    TForm2.create(nil);
    TForm2.create(nil).show ;
    end;
    //窗口的名字为FORM2_1
      

  10.   


    能否再细些,好像不是太懂!
    不过楼主确实用上了class function ,不知用意也在此?
      

  11.   

    ==>[/Quote]定义在interface部分,是对外的,==>所以并不等于TForm2类实例的Self![/Quote]这并不存在因果关系吧? 那如果定义在Implementation下面呢?难道此时Form2就等于TForm2类实例的Self了?
    ==>[/Quote]也就是说,变量Form2是用于TForm2类之外的模块来访问的。[/Quote]我想,懂点Delphi的都知道。
    ==>[/Quote]你创建10000个TForm2实例,变量Form2只有一份,且指向最后创建的实例[/Quote]你创建10000个TForm2的实例:
    f1:=TForm2.create(nil);
    f2:=TForm2.create(nil);
    .......
    f10000:=TForm2.create(nil);(最后一个TForm2实例)请问:此时变量Form2会指向最后创建的实例? 
    ==>[/Quote]但每个TForm2实例,都有自己的Self![/Quote]这最后一句话倒是对的。
      

  12.   

    把Function myshowform() : boolean;
    定义成全局函数,结构会好一些
      

  13.   

    self表示该过程所在的类的实例指针
    而不是你新建的窗体