我有一个具有TComponent变量的单元,我在单元初始化时创建这个组件,如下所示:
var
XComp: TComponent;
.
.
.
.
initialization
begin
XCom := TComponent.Create(Application);
end;
Run Code Online (Sandbox Code Playgroud)
我关闭Delphi后安装单元后,它给我一个访问冲突错误消息(EAccessViolation)
但是当我改变我的创造者时如下
initialization
begin
XCom := TComponent.Create(nil);
end;
Run Code Online (Sandbox Code Playgroud)
一切都很顺利...我想知道区别吗?什么更好?
注意:只有在关闭delphi时才会出现错误(在设计时意味着).
谢谢.
我非常喜欢使用C++ RAD Studio和Builder 6,并且经常在编写非可视代码时动态创建表单或动态创建非可视组件.在设计表单时,自动设置放在该表单上的组件的Owner属性,所以我从不担心它.但是,当创建TComponent
动态派生的任何东西时,我总是NULL
作为Owner
参数传递,因为我总是负责以后释放内存.
Borland/Embarcadero文档并没有真正涵盖动态创建事物所需的内容(或者我可能没有在正确的位置查找),而且似乎只涉及基于设计时间表的场景.
我想知道为动态创建的组件传递NULL所有者是否正确,或者它是否会导致内部问题,这些问题将在以后显现出来.代码编译并正常工作,但我想知道它是否是原因或可能导致任何幕后问题.
在IDE中设计表单时,可以自由放置和定位非可视组件(例如TMainMenus,TDatamodules).该位置是持久的,因此在重新加载表单时,这些组件会出现在正确的位置.
但是,TComponent没有Top或Left属性!
那么,我的代码如何访问非可视组件的"设计位置"?
我对如何从具有TPersistent字段的TComponent写出属性感到非常困惑.例如,我有:
TChildObj = class( TPersistent )
PRIVATE
FVisible: boolean;
FColor: TColor;
PUBLIC
PUBLISHED
property Visible : boolean
read FVisible
write FVisible;
property Color : TColor
read FColor
write FColor;
end;
TTest = class( TComponent )
constructor Create( AOwner : TComponent ); override;
destructor Destroy; override;
private
FChildObj : TChildObj;
FOne: integer;
published
property One : integer
read FOne
write FOne;
property ChildObj : TChildObj
read FChildObj;
end;
Run Code Online (Sandbox Code Playgroud)
当我使用以下编写器代码时:
procedure TForm1.Button5Click(Sender: TObject);
var
MS : TMemoryStream;
SS : TStringStream;
Test : …
Run Code Online (Sandbox Code Playgroud)