我需要制作一个控件,从TPanel继承而来
在代码中动态地在TPanel上加入一个TTabControl(假定名称为FTcDemo),
只要我不设置Tabs属性就没有问题,设置后,在测试单元中一旦放入新控件就出错。
错误信息:(如果注释对Tabs操作的相关代码,则不再有错)Control '' has no parent window.控件中的相关代码:
sl: TStrings; FTcDemo := TTabControl.Create(AOwner);
with FTcDemo do
begin
Parent := TWinControl(AOwner);
Left := 0;
Top := 218;
Width := 378;
Height := 18;
Align := alBottom;
HotTrack := True;
TabPosition := tpBottom;
sl := TStringList.Create;
try
begin
sl.Add('Main');
sl.Add('Sub1');
sl.Add('Sub2');
Tabs.Assign(sl);
end;
finally
sl.Free;
end;
end;//----------------------------------------------
请各位高手不吝赐教,谢谢先!
在代码中动态地在TPanel上加入一个TTabControl(假定名称为FTcDemo),
只要我不设置Tabs属性就没有问题,设置后,在测试单元中一旦放入新控件就出错。
错误信息:(如果注释对Tabs操作的相关代码,则不再有错)Control '' has no parent window.控件中的相关代码:
sl: TStrings; FTcDemo := TTabControl.Create(AOwner);
with FTcDemo do
begin
Parent := TWinControl(AOwner);
Left := 0;
Top := 218;
Width := 378;
Height := 18;
Align := alBottom;
HotTrack := True;
TabPosition := tpBottom;
sl := TStringList.Create;
try
begin
sl.Add('Main');
sl.Add('Sub1');
sl.Add('Sub2');
Tabs.Assign(sl);
end;
finally
sl.Free;
end;
end;//----------------------------------------------
请各位高手不吝赐教,谢谢先!
在应用程序中时很正常的,我试过。甚至连Panel都可以用代码动态创建的。
但是在写控件时,这样就不行了。对于TTabControl是这样,类似的,对于TPageControl中动态创建TTabSheet也是出现同样错误
//-----------------------------------------------------完整例子:
unit MyPageControl;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, ComCtrls, ExtCtrls;type TMyPageControl = class(TPageControl)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Win32', [TMyPageControl]);
end;{TMyPageControl}
constructor TMyPageControl.Create(AOwner: TComponent);
const
TabTitles: array[0..3] of ShortString = ('Customer', 'Orders', 'Items', 'Parts' );
var
i: Integer;
begin
inherited Create(AOwner);
// Align := alClient; for i := Low(TabTitles) to High(TabTitles) do
with TTabSheet.Create(AOwner) do
begin
Parent := ...{设置或不设置都一样有错}
PageControl := Self;
Name := 'ts' + TabTitles[i];
Caption := TabTitles[i];
end;
end;destructor TMyPageControl.Destroy;
begin
inherited Destroy;
end;end.
//----------------------------------------------------------------
以上代码创建的控件就无法使用。
上面的部分代码来源于帮助信息,即以下代码段。我使用它们以TPanel继承,在Panel上
动态创建TPageControl和TTabSheet,仍然失败。帮助中的原始代码为:
const
TabTitles: array[0..3] of ShortString = ('Customer', 'Orders', 'Items', 'Parts' );
var
i: Integer;
PageControl1: TPageControl;
begin
PageControl1 := TPageControl.Create(Self);
PageControl1.Parent := Self;
PageControl1.Align := alClient;
for i := Low(TabTitles) to High(TabTitles) do
with TTabSheet.Create(PageControl1) do
begin
PageControl := PageControl1; Name := 'ts' + TabTitles[i];
Caption := TabTitles[i];
end;//============================================================
我实在看不出我写的代码究竟错在哪里,各位大侠帮帮忙啊,我这个周必须搞定啊:(
以上是我猜想的,你先试试将代码写在Loaded()方法里,如果还是不行明天我到单位再试试
应该可以动态增删的吧,帮助中的代码我试过,在应用程序环境下完全可以啊。To tonylk(=www.tonixsoft.com=):
先谢了,我也只有明天才能在公司中试。
(我看过网站tonixsoft了,呵呵,你们公司的?)
请看:(Help)
TPageControl.LoadedInitializes the page control after all its parts have been loaded from a stream.procedure Loaded; override;DescriptionLoaded is called automatically when the form containing the page control is first loaded into memory. TPageControl overrides the Loaded method to ensure that all tab sheets with a Highlighted property of True appear highlighted.
//-----------------------------------------------------------------------
好象Loaded是在所有TabSheet都显示好了后,再被调用的,是这样吗?我英文不太好:(
http://expert.csdn.net/Expert/topicview1.asp?id=2452671
那你认为该怎么办才好?