我试图创建一个控件,它在设计时和运行时创建3个标准TPanel。一切都很好:控制可以完美地创建面板。但是我遇到了一个问题:在设计阶段,我希望能够选择其中一个面板。
我希望重现TPageControl的标准行为:当用户单击屏幕上的TabSheet时,TabSheet可通过对象检查器编辑。如何在设计时在我的自定义控件中选择子控件
下面附上了我的控制代码:
unit MyContainer;
interface
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
StdCtrls,
ExtCtrls,
StrUtils,
Dialogs;
type
TMyContainer = class(TCustomControl)
private
FPanelA: TPanel;
FPanelB: TPanel;
FPanelC: TPanel;
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
procedure register;
implementation
{ TMyContainer }
procedure Register;
begin
RegisterComponents('MyComps', [TMyContainer]);
end;
constructor TMyContainer.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
Width := 200;
Height := 200;
ControlStyle := ControlStyle + [csAcceptsControls];
FPanelA := TPanel.Create(Self);
FPanelA.Parent := Self;
FPanelA.Width := 100;
FPanelA.Height := 60;
FPanelA.Left := 10;
FPanelA.Top := 10;
FPanelB := TPanel.Create(Self);
FPanelB.Parent := Self;
FPanelB.Width := 100;
FPanelB.Height := 60;
FPanelB.Left := 10;
FPanelB.Top := 80;
FPanelC := TPanel.Create(Self);
FPanelC.Parent := Self;
FPanelC.Width := 100;
FPanelC.Height := 60;
FPanelC.Left := 10;
FPanelC.Top := 160;
end;
destructor TMyContainer.Destroy;
begin
FreeAndNil(FPanelA);
FreeAndNil(FPanelB);
FreeAndNil(FPanelC);
Inherited Destroy;
end;
procedure TMyContainer.Paint;
begin
Canvas.Brush.Color := clBlue;
Canvas.FillRect(Canvas.ClipRect);
end;
end.
有没有谁可以告诉我一个办法让我的任务的解决方案?
在此先感谢。
NGLN,谢谢你介绍一些事情。这非常有用,因为我不是Delphi的专业人员。为了达到我指定的目标,我决定创建一个按钮,该按钮在设计时会显示,并且在运行时不可见,并会通过单击按钮创建一个TPanel。我做了它,现在我可以点击这个按钮,因为CM_DESIGNHITTEST消息处理,作为雷米Lebeau通知。当点击被传递时,TPanel控件被创建,但我仍然无法在设计时选择它。我也尝试为TPanel的后裔处理CM_DESIGNHITTEST,但它没有给我任何东西。 – Dima
NGLN,虽然我写了我的预览评论到您的文章,我记得,标准TPageControl有一个PopupMenu项目'新页面'。我想这个菜单项的代码可以解释我的问题。昨天我研究了所有的TPageControl代码,但在设计时没有与PopupMenu相关的内容。你知道吗,我在哪里可以找到菜单项“新页面”的源代码? – Dima
对于这样的上下文菜单命令,您必须创建一个组件编辑器,在答案中查看我的编辑。但是这涉及到大量关于组件写作的知识,对于这里的评论太多了。 ;-)(如果不存在,这可能是一个很好的单独问题)。 – NGLN