Solved

My Owner.......

Posted on 2001-07-19
8
341 Views
Last Modified: 2013-11-23
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.

0
Comment
Question by:Yunoshev
  • 5
  • 3
8 Comments
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6298522
are you sure you mean the owner and not the parent?
0
 
LVL 17

Expert Comment

by:geobul
ID: 6298952
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
 
LVL 17

Accepted Solution

by:
geobul earned 50 total points
ID: 6299226
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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 17

Expert Comment

by:geobul
ID: 6299279
Correction:
TMyButton accepts TPanel *AND ITS DESCENDANTS* only ...
0
 
LVL 17

Expert Comment

by:geobul
ID: 6299309
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
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6301848
good work, geo ;-)
0
 
LVL 17

Expert Comment

by:geobul
ID: 6301858
Thanks Meikl. But Yunoshev wasn't very generous. He made my profile look ugly (ha-ha) ;-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6301889
oh, i see, only a c-grade :-(
0

Featured Post

ScreenConnect 6.0 Free Trial

At ScreenConnect, partner feedback doesn't fall on deaf ears. We collected partner suggestions off of their virtual wish list and transformed them into one game-changing release: ScreenConnect 6.0. Explore all of the extras and enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question