My Owner.......

I'm writing a visual component (see below) and I want it to be created only on another my component....
Can I do the such thing: if I'm placing my component on the another my component - the second component will became an owner of the first component?

unit ChessPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TChessPanel = class(TCustomPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
        Constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
        Property Align;
  end;

  TBaseChessPanel = class(TCustomPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
        Constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
        Property Align;
  end;


procedure Register;

implementation
Constructor TChessPanel.Create(AOwner: TComponent);
begin
  If  not (AOwner is TBaseChessPanel) Then
   Begin
     MessageDlg('Incorrect Owner',mtError,[mbOk],0);
     raise EInvalidOperation.CreateFmt('Incorrect Owner %s',[AOwner.Name]);
   End;
  inherited Create(AOwner);
  ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
    csSetCaption, csOpaque, csDoubleClicks, csReplicatable];
  Width := 185;
  Height := 41;
  BevelOuter := bvNone;
  BevelWidth := 1;
  Color := clBtnFace;
  UseDockManager := True;
end;

Constructor TBaseChessPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
    csSetCaption, csOpaque, csDoubleClicks, csReplicatable];
  Width := 185;
  Height := 41;
  BevelOuter := bvNone;
  BevelWidth := 1;
  Color := clBtnFace;
  UseDockManager := True;
end;

procedure Register;
begin
  RegisterComponents('Chess', [TChessPanel,TBaseChessPanel]);
end;

end.

YunoshevAsked:
Who is Participating?
 
geobulConnect With a Mentor Commented:
Well, here is the example: TMyButton accepts TPanel only as a Parent, e.g. cannot be placed on a form.

TMyButton = class(TButton)
  protected
    procedure MySetParent(AParent: TWinControl);
  public
    Constructor Create(AOwner: TComponent); override;
    property Parent write MySetParent;
end;

Constructor TMyButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
end;

procedure TMyButton.MySetParent(AParent: TWinControl);
begin
  If  not (AParent is TPanel) Then
  Begin
    MessageDlg('Incorrect Parent',mtError,[mbOk],0);
    Free;
    raise EInvalidOperation.CreateFmt('Incorrect Owner %s',[AParent.Name]);
  End else SetParent(AParent);
end;

Regards, Geo
0
 
kretzschmarCommented:
are you sure you mean the owner and not the parent?
0
 
geobulCommented:
Hi,
I think that when you place a component somewhere on a form in design mode, the form always becomes the owner of that component. This is necessary for destroying the form and all its components correctly and I don't know a way to avoid this.
On the other hand, when creating components in run-time, you can use TPanel for example.

procedure TForm1.Button1Click(Sender: TObject);
var
  btn: TButton;
begin
  btn := TButton.Create(Panel1);
  btn.Parent := Panel1;
  btn.Caption := 'Hello';
  ShowMessage(btn.Owner.ClassName);
  btn.Free;
end;

Regards, Geo
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
geobulCommented:
Correction:
TMyButton accepts TPanel *AND ITS DESCENDANTS* only ...
0
 
geobulCommented:
One last thing: if you want to prevent the parent's descendants to accept TMyButton then replace

If not (AParent is TPanel) Then
 
with

If not AParent.ClassNameIs('TPanel') Then

Regards, Geo
0
 
kretzschmarCommented:
good work, geo ;-)
0
 
geobulCommented:
Thanks Meikl. But Yunoshev wasn't very generous. He made my profile look ugly (ha-ha) ;-)
0
 
kretzschmarCommented:
oh, i see, only a c-grade :-(
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.