动态创建问题? (100分)

  • 主题发起人 主题发起人 小树流
  • 开始时间 开始时间

小树流

Unregistered / Unconfirmed
GUEST, unregistred user!
请各位帮忙,为什么这样动态创建不行呢?
procedure TForm1.Button1Click(Sender: TObject);
begin
// Application.CreateForm(TMapForm, MapForm);
MapForm := TMapForm.Create(nil);
MapForm.ShowModal;
end;
.........
procedure TMapForm.FormCreate(Sender: TObject);
begin
FHall := THall.Create(scbMap);
FHall.Parent := scbMap;
end;
...........
constructor THall.Create(AOwner: TComponent);
begin
inherited;
FSize := 200;
Center.x := MapForm.scbMap.Width div 2; 出错了
Center.y := MapForm.scbMap.Height div 2;
。。。
在创建的时候MapForm=nil,为什么会这样呢?
 
nil应该为Self或Application
 
Owner属性指定不正确。MapForm=nil表示与映射的内存断开。
 
MapForm := TMapForm.Create('拥有者');
一般可以是Application 或 Self

 
Application 和 Self都试过了,不行啊,还是nil的
 
用nil创建也是可以的,但你需要手工释放
MapForm := TMapForm.Create(nil);
try
MapForm.ShowModal
finally
MapForm.Free;
end;
而Application,是由应用程序管理的,他在应用程序关闭的时候,应用程序会给你释放掉
但Self 是危险的 比如有一个form创建者为空,他又动态创建了另外的form2(拥有着是Self,
即form1),那么在程序退出时会出现什么?
有一个方法,什么时候都不会出错,即动态创建,用完手工释放!
 
问题没有解决。请各位多多帮忙。是不是FHall在创建的时候,MapFrom还没有创建好呢?
 
是不是FHall在创建的时候,MapFrom还没有创建好!
是的!
MapFrom创建的时候,需要创建FHall,而FHall创建的时候又要MapFrom,重复了!
Center.x := MapForm.scbMap.Width div 2;
改成: Center.x := aowner.Width div 2;
 
是空的!没办法进行赋值
 
对不起,上次没看清楚;
肯定是,你不也发现问题了

Center.x := MapForm.scbMap.Width div 2;
Center.y := MapForm.scbMap.Height div 2;
写在scbMap是什么东西?
不能要在 构造函数中访问 MapForm
放在 Load 中试一下
 
AOwner好像不行,我试了parent.Width,发现Parent也是nil,说明scbMap也是没有的。
我如何才能解决这个问题呢,55555555555~~~~~~~~~~
 
>> dxymzj
scbMap是TScrollBox

load是哪里呢?
 
MapForm只是一个实例变量而已,当它的类创建时,已经执行了你的那个非法代码,
但还没来的及把创建成功的实例指针赋给MAPFORM变量,当然MapForm为nil

建议你不要在类的方法中使用实例指针,如MapForm变量。
试试用TMapForm(owner.owner)来代替MapForm.scbMap吧,但要求你的scbMap的owner属性是
TmapForm类的实例。类似的,它的parent也可以,改为TMapForm(owner.parent)就可以了。
 
不好意思,TMapForm(owner.parent) 不完善。
应该是TMapForm(Twincontrol(owner).parent)
 
如果你的类设计不能适合上面的用法的话,建议你,重新设计。呵呵
 
to shangshang
对不起,我的水平太差,看不懂你写的。
我这样写行不行,TScrollBox(scbMap).width,或是TScrollBox(AOwner).width
好像可以啊,是不是这样呢?
 
to shangshang
TMapForm(Twincontrol(owner).parent),
为什么要加TWincontrol?
 
不会真的要我重新设计吧,我晕~~~~
 
TScrollBox(AOwner).width
 
不好意思,好几天上不来了.

那个语句就是强制类型转换而已, 这样写仅适于修补你的写法,
如果设计的好的话,不应该出现这样的语句的.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
334
import
I
后退
顶部