这个组件怎么设计,请给段源码,谢谢。(100分)

  • 主题发起人 主题发起人 whyme
  • 开始时间 开始时间
W

whyme

Unregistered / Unconfirmed
GUEST, unregistred user!
我想从 TCustomPanel 继承下来做个组件,实现如下功能:
1、继承的组件命名为 A
2、在 A 里面要放入类型为 TPanel 或 TCustomPanel 的 B,C,D,E等,即B,C,D,E等的 Parent 为 A
3、设计实现之后,在 A 里面可以放其它的组件,比如 Edit 等,且可对 Edit 等进行各项编辑控制,包括事件等等的。而在 B,C,D,E等上面则不能放其它组件了,即使可以放,则运行起来也不可见了,显示为 nil

问题:如何解决这个问题?

说明:我发现跟 Create 的方式有关,比如:
B := nil;
B := TPanel.Create(Self);
B.Parent := A;
这样创建出来,则放上其它组件上去之后,运行时不可见。
而如果这样做:
B := nil;
B := TPanel.Create(Owner);
B.Parent := A;
则创建出来,可以放,担常提示 TPanel 的类什么的不存在,要不然就是说组件名称已经存在什么的。

高手在哪,帮个忙,谢谢!!!!!
 
如果按这个思路应该没有问题:
1.建立一个TList来保存放在A上的TPanel控件。
2.对A进行分格,每一格放一个TPanel,不允许建在A上的TPanel进行叠加.
 
unit QA;

interface

uses
SysUtils, Classes, QControls, ExtCtrls;

type
TAix = class(TCustomPanel)
private
{ Private declarations }
fB,fC : TPanel ;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property Alignment ;
property Align ;
property Caption ; //股票名称
property TabOrder ;
property TabStop ;
property Hint ;
property ShowHint ;
property b:TPanel read fb ;
property c:TPanel read fc ;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Standard', [TAix]);
end;

{ TA }

constructor TAix.Create(AOwner: TComponent);
begin
inherited Create(AOwner) ;
width := 100 ;
height := 100 ;
fb := TPanel.Create(self);
b.Parent := Self ;
b.ControlStyle := [] ; //关键
b.Name := 'bix' ; //关键
b.Caption := 'qwe' ;
b.Left := 0 ;
b.Top := 0 ;
b.Width:= 80;
b.Height:= 50 ;

fc := TPanel.Create(AOwner);
c.ControlStyle := [] ;
c.Name := 'cix' ;
c.Parent := Self ;
c.Left := 81 ;
c.Top := 0 ;
c.Width:= 80;
c.Height:= 50 ;
end;

destructor TAix.Destroy;
begin
b.Free ;
c.Free ;
// d.Free ;
// e.Free ;
inherited;
end;

end.
 
不行啊。
首先要在 b 或 C 上可以放组件,所以 b.ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents, csSetCaption, csOpaque, csDoubleClicks, csReplicatable] ; //关键

这一句应该要进去的吧。

其次,创建出来可以放组件,但运行时会提示: a component named cix already exists

然后再点就退出了。我之前也碰到这个问题。
 
你上面说 B,C,D,E等上面则不能放其它组件了,即使可以放,则运行起来也不可见了
所以 b.ControlStyle := [];否则不要这句。
但运行时会提示: a component named cix already exists,改 b.Name := '其他的名称' ;就可以了,注意这里不要重名啊
 
你上面说 B,C,D,E等上面则不能放其它组件了,即使可以放,则运行起来也不可见了
所以 b.ControlStyle := [];否则不要这句。

我的目的是要可在B、C、D等上再放其它组件,所以 b.ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents, csSetCaption, csOpaque, csDoubleClicks, csReplicatable]
这个值是肯定要的。

另外:

但运行时会提示: a component named cix already exists,改 b.Name := '其他的名称' ;就可以了,注意这里不要重名啊

这个你理解错了。组件设计编译完之后,放到一个工程中的一个窗体中,会调用 Create 方法对不,则用:fc := TPanel.Create(AOwner);
c.ControlStyle := [] ;
c.Name := 'cix' ;
c.Parent := Self ;
c.Left := 81 ;
c.Top := 0 ;
c.Width:= 80;
c.Height:= 50 ;
这一段来创建的话,会创建出一个名为 cix 的组件,则此时如果直接运行,不在C上放其它组件,则不会提示出错。但如果在C上放上其它组件,比如一个LABEL,则运行时会有一个同名组件已经存在的提示。

你算个试一下就明白了。
 
高手啊,在哪里啊!!!!!!!!!!!!!!
 
不会吧,没人吗???????????????????????????
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部