下面的东西也许很无聊,不过你理解透彻了吗?参与者皆有分。<现象一>
procedure TForm1.Button1Click(Sender: TObject);
var
  TestForm:TForm2;
begin
  TestForm.Show;//这一步可以执行,只是不显示而已??
  ShowMessage(TestForm.Caption );//这一步更加奇怪,ShowMessage显示"Button1"
end;接下来,偶改一下
<现象二>
procedure TForm1.Button1Click(Sender: TObject);
var
  TestForm,TestForm2:TForm2;
begin
  TestForm.Show;//同上
  ShowMessage(TestForm.Caption );//同上  TestForm2.Show;//出错了,有点晕
  ShowMessage(TestForm2.Caption );
end;再接下来
<现象三>
procedure TForm1.Button1Click(Sender: TObject);
var
  TestForm,TestForm2:TForm2;
begin
  TestForm2.Show;//从这里出错了,hoho
  ShowMessage(TestForm2.Caption );  TestForm.Show;
  ShowMessage(TestForm.Caption );
end;看来,TestForm,TestForm2在声明的时候都指向同一个地方,指向Button1实例。
但究竟如何会这样??接下来,偶又加了一个Button2,在Button2的事件里这样写:
<现象四>
procedure TForm1.Button2Click(Sender: TObject);
var
  TestForm,TestForm2:TForm2;
begin
  TestForm2.Show;//通过
  ShowMessage(TestForm2.Caption );//这回显示Button2.caption
end;于是,偶又改成:
<现象五>
procedure TForm1.Button2Click(Sender: TObject);
var
  TestForm,TestForm2:TForm2;
begin
  TestForm2.Show;//在这里出错了
  ShowMessage(TestForm2.Caption );
  TestForm.Show;
  ShowMessage(TestForm.Caption );
end;
程序在第一步就出错了。看来,作为局部对象变量的TestForm,TestForm2在构造以前并不是偶想象中的“空指针”而是指向了离它最近的内存区。
下面的代码正好验证了这点:
procedure TForm1.Button2Click(Sender: TObject);
var
  TestForm,TestForm2:TForm2;
begin
  TestForm.Show;
  if Assigned(TestForm) then
  begin
    ShowMessage(TestForm.Caption );
  end;
end;那么,在TForm1的private段定义一个FForm:TForm2又会怎样呢?
procedure TForm1.Button3Click(Sender: TObject);
begin
  if Assigned(FForm2) then //=false
    FForm2.Show;
end;
Assigned结果是false。下面偶写了这样的代码:
<现象七>
procedure TForm1.Button6Click(Sender: TObject);
  procedure CreateAndShowForm2(AForm: TForm2);
  begin
    if not Assigned(AForm) then
      AForm := TForm2.Create(Self);
    AForm.Show;
  end;
begin
  CreateAndShowForm2(FForm2);
end;
FForm2是在private段定义的私有对象,
偶指望点击Button6的时候创建和显示FForm2,如果已经创建过了,只要显示就可以了。
可结果却是每次点击Button6都会创建一个Form2!!偶继续改:
procedure TForm1.Button7Click(Sender: TObject);
begin
  if not Assigned(FForm2) then
    FForm2:=TForm2.Create(Self);
  FForm2.Show;
end;
这回问题解决了,FForm2只创建一次。看来,在<现象七>中是竟然是传参出了问题。
请大家帮忙为什么通过CreateAndShowForm2(AForm: TForm2)传递FForm2每次都是空呢?

解决方案 »

  1.   

    procedure TForm1.Button6Click(Sender: TObject);
      procedure CreateAndShowForm2(var AForm: TForm2);//加个var看看
      begin
        if not Assigned(AForm) then
          AForm := TForm2.Create(Self);
        AForm.Show;
      end;
    begin
      CreateAndShowForm2(FForm2);
    end;
      

  2.   

    你很奇怪哦,为什么不Create呢?故意测试么?!~~怪~~~
      

  3.   

    这样写:
    procedure CreateAndShowForm2(var AForm: TForm2);
    begin
      a:=a+1;
      if not Assigned(AForm) then
      begin
        AForm := TForm2.Create(Self);
        AForm.Show;
      end;
    end;
    原来的是传值,用VAR表示引用
      

  4.   

    呵呵,谢谢大家讨论。
    nyf1220(我是党员) ,代表党员说几句话吧,好好想想你看高手突破的时候都说了点什么?偶在刚才发呆的时候改过了CreateAndShowForm2(var AForm: TForm2);的问题,不过还是非常谢谢capoatguitar(达达) 和 nyf1220(我是党员),加分加分!呵呵。
      

  5.   

    希望大家理解偶不Create的苦衷。。
      

  6.   

    极少不CREATE的,不知道你为什么!
      

  7.   

    我真的忘了呀,老早看的,
    那书在 FrameSniper 那里,你去给他要,哈哈讲讲你为什么不crate,难道不是为了测试?
      

  8.   

    回楼上:
    我在用Factory模式,构造交给他去做,至于在何时何地构造是我无法控制的,也许因为某些原因没构造也说不准。所以我想测试一下。
      

  9.   

    看来,作为局部对象变量的TestForm,TestForm2在构造以前并不是偶想象中的“空指针”而是指向了离它最近的内存区.
    ---這點不一定這樣
    正如野指針出現時程序不一定會出錯
    因為野指針所指地址跟內存使用有關
      

  10.   

    呵呵,我发现以前讨论过这个问题的好好研究下
    http://search.csdn.net/Expert/topic/2144/2144169.xml?temp=.4561579
    吧,能让你看一个礼拜,哈哈