下面的东西也许很无聊,不过你理解透彻了吗?参与者皆有分。<现象一>
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每次都是空呢?
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每次都是空呢?
procedure CreateAndShowForm2(var AForm: TForm2);//加个var看看
begin
if not Assigned(AForm) then
AForm := TForm2.Create(Self);
AForm.Show;
end;
begin
CreateAndShowForm2(FForm2);
end;
procedure CreateAndShowForm2(var AForm: TForm2);
begin
a:=a+1;
if not Assigned(AForm) then
begin
AForm := TForm2.Create(Self);
AForm.Show;
end;
end;
原来的是传值,用VAR表示引用
nyf1220(我是党员) ,代表党员说几句话吧,好好想想你看高手突破的时候都说了点什么?偶在刚才发呆的时候改过了CreateAndShowForm2(var AForm: TForm2);的问题,不过还是非常谢谢capoatguitar(达达) 和 nyf1220(我是党员),加分加分!呵呵。
那书在 FrameSniper 那里,你去给他要,哈哈讲讲你为什么不crate,难道不是为了测试?
我在用Factory模式,构造交给他去做,至于在何时何地构造是我无法控制的,也许因为某些原因没构造也说不准。所以我想测试一下。
---這點不一定這樣
正如野指針出現時程序不一定會出錯
因為野指針所指地址跟內存使用有關
http://search.csdn.net/Expert/topic/2144/2144169.xml?temp=.4561579
吧,能让你看一个礼拜,哈哈