有关使用TTabControl制作新控件的问题

Ascn 2003-11-12 11:22:23
我需要制作一个控件,从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;

//----------------------------------------------
请各位高手不吝赐教,谢谢先!
...全文
51 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ascn 2003-11-22
  • 打赏
  • 举报
回复
唉,算了。干脆结贴啦。
不过还是要谢谢大家:)
Ascn 2003-11-19
  • 打赏
  • 举报
回复
设计时的确实不好做,我已放弃。就用运行期的吧。非常感谢tonylk(=www.tonixsoft.com=)

To maozefa(之源):原因呢?能不能告诉我啊?然后我想结贴了:)
Ascn 2003-11-13
  • 打赏
  • 举报
回复
哦,对了。Loaded is called automatically when the form containing the page control is first loaded into memory.呵呵。只有运行Form时才能看到。

不过,如果我想在设计期就能看到那些TabSheet的话,该如何办呢?
tonylk 2003-11-13
  • 打赏
  • 举报
回复
to lx130(阿生)

你的问题到底解决了没有?
wind8bell 2003-11-13
  • 打赏
  • 举报
回复
大家顺便看看这个相似的问题好吗?
http://expert.csdn.net/Expert/topicview1.asp?id=2452671
Ascn 2003-11-13
  • 打赏
  • 举报
回复
试过了,错误倒不再有了。可是我插入的TabSheet没有出现。估计Loaded中没有作用。
请看:(Help)
TPageControl.Loaded

Initializes the page control after all its parts have been loaded from a stream.

procedure Loaded; override;

Description

Loaded 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都显示好了后,再被调用的,是这样吗?我英文不太好:(
tonylk 2003-11-13
  • 打赏
  • 举报
回复
设计时的话,你的控件怎么知道设计时某个控件是否存在呢?
Ascn 2003-11-13
  • 打赏
  • 举报
回复
To maozefa(之源):
那你认为该怎么办才好?
阿发伯 2003-11-13
  • 打赏
  • 举报
回复
你的问题与Loaded完全无关。
Ascn 2003-11-12
  • 打赏
  • 举报
回复
很不错啊,很佩服呢。:)
tonylk 2003-11-12
  • 打赏
  • 举报
回复
呵呵,是和朋友合作的小公司。。。至少能做点自己想做的事。。。
Ascn 2003-11-12
  • 打赏
  • 举报
回复
To maozefa(之源):
应该可以动态增删的吧,帮助中的代码我试过,在应用程序环境下完全可以啊。

To tonylk(=www.tonixsoft.com=):
先谢了,我也只有明天才能在公司中试。
(我看过网站tonixsoft了,呵呵,你们公司的?)
阿发伯 2003-11-12
  • 打赏
  • 举报
回复
TTabSheet好像是不能动态增删的,只能事先设计好,在程序代码中隐藏和显示
tonylk 2003-11-12
  • 打赏
  • 举报
回复
我觉得关键是你程序中的Parent := ...蛰居代码的问题,因为有可能你的组件被创建的时候,制定用来作为它的parent的组件还没有被创建,就是说它的指针是无效的,所以会出现访问错误。。。
以上是我猜想的,你先试试将代码写在Loaded()方法里,如果还是不行明天我到单位再试试。。。
tonylk 2003-11-12
  • 打赏
  • 举报
回复
试试把动态生成的代码写在你的控件的Loaded()方法里,它是tcomponent的虚方法。
Ascn 2003-11-12
  • 打赏
  • 举报
回复
将TabControl建立到Panel上,是在应用程序中还是在写控件时啊?
在应用程序中时很正常的,我试过。甚至连Panel都可以用代码动态创建的。
但是在写控件时,这样就不行了。

对于TTabControl是这样,类似的,对于TPageControl中动态创建TTabSheet也是出现同样错误
//-----------------------------------------------------完整例子:
unit MyPageControl;

interface

uses
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;

implementation

procedure 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;

//============================================================
我实在看不出我写的代码究竟错在哪里,各位大侠帮帮忙啊,我这个周必须搞定啊:(
tonylk 2003-11-12
  • 打赏
  • 举报
回复
我用你的代码将一个TabControl建到Panel上,很正常啊,难道是你写的控件有问题?
tonylk 2003-11-12
  • 打赏
  • 举报
回复
好像看不出有什么错嘛。。。
FSU 2003-11-12
  • 打赏
  • 举报
回复
up:)
Ascn 2003-11-12
  • 打赏
  • 举报
回复
为什么没有人回啊?顶上去

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧