从TComboBox继承一个控件,析构的时候不能访问Items成员(50分)

  • 主题发起人 主题发起人 Beast
  • 开始时间 开始时间
B

Beast

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TstComboBox = class(TComboBox)
published
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TestCompontent', [TstComboBox]);
end;
constructor TstComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TstComboBox.Destroy;
var
i :integer;
begin
for i:=0 to Self.Items.Count-1 do begin
Self.Items.Objects:=nil;
end;
inherited;
end;
 
destructor TstComboBox.Destroy;
var
i :integer;
begin
for i:=0 to Self.Items.Count-1 do begin
if Self.Items.Objects <> nil then
Self.Items.Objects.free ;
end;
inherited;
end;
 
destructor TstComboBox.Destroy;
var
i :integer;
begin
for i:=Self.Items.Count-1 downto 0 do begin
Self.Items.Objects:=nil;
end;
inherited;
end;
 
faint!
楼上两位的代码一定是没有测试,我的帖子说访问Item成员的时候就会出错!
 
哈哈,确实没测试,我测试看看。
 
多谢~~
 
就是,连访问SelLength属性也要出错,说没有父窗。关注中
 
faint,这样一个问题居然没有人能搞定????[:(]
 
你Create的时候没有设置parent。
这样就可以了:
procedure TForm1.btn1Click(Sender: TObject);
var
dd:TstComboBox;
begin
dd:=TstComboBox.Create(self);
dd.Parent:=form1;
dd.Items.add('adfasdfafd');
dd.Free;
end;

跟你的控件没有关系。如果你改成Tcombobox也是一样。
 
看来楼上兄弟是没有仔细看我的发问。

我是做了一个控件,拖到Form上的,不是动态创建的。

你理解错了。
 
是的,你不要在析构函数里访问。
你可以在DestroyWnd中释放掉了。
 
如果你要在析构函数里访问的Items属性,你应该重写CreateParams
可以看看TWinControl的CreateWnd
procedure TTestComboBox.CreateParams(var Params: TCreateParams);
begin
inherited;
if (Parent = nil) and (csDestroying in ComponentState) then
Params.Style := Params.Style and (not WS_CHILD);
end;
这样就可以在析构函数里面访问了
destructor TTestComboBox.Destroy;
begin
ShowMessage(Items[0]);
inherited;
end;

另外的解决的方法就是coldew说的了,(注释掉了析构函数)
TTestComboBox= class(TComboBox)
protected
//procedure CreateParams(var Params: TCreateParams); override;
procedure wmdestroy(var message : TMessage); message WM_DESTROY;
public
//destructor Destroy; override;
end;
procedure TTestComboBox.wmdestroy(var message: TMessage);
begin
ShowMessage(Items[0]);
inherited;
end;
 
哦,原来如此。看错了
 
搬板凳,怎么今天我不能收藏了?
 
接受答案了.
 

Similar threads

后退
顶部