[急!100分请教]自定义组件,对像初始化时ToolButton1.Parent:=self;为什么出错? (100分)

  • 主题发起人 主题发起人 tadpoleplus
  • 开始时间 开始时间
T

tadpoleplus

Unregistered / Unconfirmed
GUEST, unregistred user!
我自定义一个组件,对组件内的一个对像初始化时ToolButton1.Parent:=self;为什么出错?小弟刚开始学习组件,请各位老大指点。谢谢。
程序:
============自定义组件 (其实就是自定义一个工具条,在画工具条里的按钮时出错。)
unit UToolBar;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ToolWin,ComCtrls;

type
TToolBar1 = class(TToolBar)
private
ToolButton1: TToolButton;
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;

implementation

procedure Register;
begin
RegisterComponents('PKTool', [TToolBar1]);
end;

{ TToolBar1 }

constructor TToolBar1.Create(AOwner: TComponent);
begin
inherited;
ToolButton1:=TToolButton.Create(Self);
ToolButton1.Height:=220;
ToolButton1.Left:=0;
ToolButton1.Top:=2;
ToolButton1.Width:=230;
ToolButton1.Parent:=self; <-----------这儿出错,好像说传入的self不 是TWinControl对像?
end;

destructor TToolBar1.Destroy;
begin

inherited;
end;

end.

========测试用FORM。
. . . . . .
. . . . . .
. . . . . .
uses UToolBar;
var
TestTToolBar:TToolBar1;
{$R *.dfm}

{ TForm1 }

constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
TestTToolBar:=TToolBar1.Create(Self);
TestTToolBar.Height:=29;
TestTToolBar.Width:=536;
TestTToolBar.Top:=0;
TestTToolBar.Left:=0;
TestTToolBar.Parent:=self;
TestTToolBar.Visible:=true;

end;
 
在VCL中类的继承关系,应该是从TWinControl继承的:
TToolBar = class(TToolWindow)
TToolWindow = class(TWinControl)

运行时显示的错误信息。
Project Project1.exe raised exception class EInvalidOperation with message 'Control' has no parent window'.Process stopped .Use Step or Run to continue.

跟踪到VCL中:
procedure TControl.SetParent(AParent: TWinControl);
begin
if FParent <> AParent then
begin
if AParent = Self then
raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);
if FParent <> nil then
FParent.RemoveControl(Self);
if AParent <> nil then
begin
AParent.InsertControl(Self); <--------------从此处进入
UpdateAnchorRules;
end;
end;
end;



procedure TWinControl.InsertControl(AControl: TControl);
begin
AControl.ValidateContainer(Self);
Perform(CM_CONTROLLISTCHANGE, Integer(AControl), Integer(True));
Insert(AControl);
if not (csReading in AControl.ComponentState) then
begin
AControl.Perform(CM_PARENTCOLORCHANGED, 0, 0);
AControl.Perform(CM_PARENTFONTCHANGED, 0, 0);
AControl.Perform(CM_PARENTSHOWHINTCHANGED, 0, 0);
AControl.Perform(CM_PARENTBIDIMODECHANGED, 0, 0);
if AControl is TWinControl then <----此处为FALSE,估计问题在这儿的可能性很高,我用另一个正确的组件跟踪发现这儿好像应该为TRUE才能正常创建子对像。
begin
AControl.Perform(CM_PARENTCTL3DCHANGED, 0, 0);
UpdateControlState;
end else
if HandleAllocated then AControl.Invalidate;
AlignControl(AControl);<------进入此函数后出错,进入后的程序我已经看不太懂了,若大家需要我再贴吧。

end;
Perform(CM_CONTROLCHANGE, Integer(AControl), Integer(True));
end;
 
//ToolButton1.Parent:=self;
你的子控件产生时没有父
 
请问怎样才能让子控件产生时有父呢?
 
ToolButton1.Parent:=AOwner;
 
上面说的不对。把inherited;改为:
inherited Create(AOwner);
就行了
 
还是比较同意楼上的,
-----------------------------
但什么时候需要写 inherited Create(AOwner)呢?
看帮助好像写当参数不同的时候,E文太烂
疑惑中...
 
多人接受答案了。
 

Similar threads

后退
顶部