サブコンポーネント

解決


D7  2009-11-18 21:14:46  No: 36189  IP: 192.*.*.*

Delphi7を使ってサブコンポーネントを作成しているのですが、
親  TCustomPanel  子  TComponentから派生したComponennt
で、TComponentはParentプロパティがないので、
  FAComp1 := TAComp1.Create(Self);
してCreateしてみたのですが、『自分自身は親になれません』
のエラーがでます。
Parentが指定できないTComponentから派生したComponenntでは
無理なのでしょうか?
よろしくお願いします。

編集 削除
HOta  2009-11-19 07:38:32  No: 36190  IP: 192.*.*.*

Selfは自分自身ですから、別に派生元の親を決めないといけません。

ところで、「サブコンポーネント」って何ですか?
はじめて聞きます。

編集 削除
ぽむぽむ  2009-11-19 08:33:57  No: 36191  IP: 192.*.*.*

パネル上にコンポーネントを貼り付けしたものを作りたいのだと想像するけど、

>   FAComp1 := TAComp1.Create(Self);
これをどこに記述しているの?
メッセージから考えると、子クラスのようだけど、子クラスのコンストラクタ内とか?
親クラスから子クラスをクリエイトする時には、そんなエラーはでないと思います。

編集 削除
ttt  2009-11-19 11:45:35  No: 36192  IP: 192.*.*.*

パネル内にコンポーネントを表示したいのだとしたら、
ビジュアルコンポーネントということですから少なくともTControlから派生しないと無理ですね。

ただ、TComponent.Createの引数に指定するのはOwnerであって、Parentとは別物です。
実行時に画面に表示されない、単にPanelに所有されているというだけのコンポーネントなら
TComponentから派生して、Panel自身をOwnerにしてやれば問題ないと思いますが。

編集 削除
D7  2009-11-19 23:10:42  No: 36193  IP: 192.*.*.*

HOtaさん、ぽむぽむ、tttさんありがとうございます。
D7です。
tttさんの通り、パネル内にコンポーネントを表示させる
のが、目的です。
Owerに替えてやってみます。
HOtaさんへちなみにサブコンポーネントとは、Delphi6
から実装されたコンポーネントの中でコンポーネントを
作成する場合に便利な機能?らしいです。
便利そうなので今回試して見ようと思います。

編集 削除
Mr.XRAY  2009-11-20 01:54:21  No: 36194  IP: 192.*.*.*

こんにちは,Mr.XRAYです.

>TComponentから派生したComponenntでは無理なのでしょうか?

できますよ.方法は同じです.説明は省略します.
それとも,TComponent以外の派生クラスだと出来ているということでしょうか?
もし,そうだとしたら,そのDelphiは壊れているかも知れませんね.
以下を参考にしてみてください.

■  12_サブコンポーネント
http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#112


>>   FAComp1 := TAComp1.Create(Self);
>これをどこに記述しているの?

自分自身の中で,自分自身のインスタンスは作成できません.

編集 削除
D7  2009-11-20 23:49:02  No: 36195  IP: 192.*.*.*

MrXさんへ  こんな感じでいいのでしょうか?

constructor TCPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  // サブコンポーネント作成.
  FAComp1 := TAComp1.Create(Self);
  SetSubComponent(True);
end;

編集 削除
Mr.XRAY  2009-11-21 00:48:09  No: 36196  IP: 192.*.*.*

どれがサブコンポーネントで,どれが親(というのかな?)コンポーネントなんでしょうか?

親    TCPanel
サブ  FAComp1 := TAComp1.Create(Self);

ですか? 
でしたら違いますね.

http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#112

のページにあるように,

 (1) コンストラクタ(Create)またはSetParentメソッドでサブコンポーネントを作成し,
       デストラクタ(Destroy)でサブコンポーネントを破棄する.
 (2) サブコンポーネントのプロパティはリードオンリーとし,Assignメソッドの実装は不要.
 (3) サブコンポーネント自身のコンストラクタ(Create)で,SetSubComponentメソッドを実行する.
 
 この(1)のコンストラクタ(つまりCreate)は親のことです.
 ただし,この(1)では,サブコンポーネントがTComponent(非ビジュアル)の時は
 親のコンストラクタで生成しても構いません.
 
constructor TCPanel.Create(AOwner: TComponent);    //TCPanelが親と仮定して

で作成しても構いません
(コンストラクタというのはconttructorのことです.つまりCreateのことです)

では頑張ってください.

眠い.....

編集 削除
Mr.XRAY  2009-11-21 00:54:05  No: 36197  IP: 192.*.*.*

もし,サブコンポーネントが FAComp1 であったとしたら 
(3)が間違っているということです.

 SetSubComponent(True);
は(3)に書いてある通り,サブコンポーネントのconstructor,つまり
サブコンポーネントのCreate内に書きます.

編集 削除
Mr.XRAY  2009-11-21 00:57:15  No: 36198  IP: 192.*.*.*

>http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#112

この記事は役に立たなかったようですね.
申し訳ありません.誤字脱字かまたは文章が読みにくかったのでしょうね.

編集 削除
D7  2009-11-21 07:36:20  No: 36199  IP: 192.*.*.*

MrXさん眠いのにありがとうございます。

おっしゃるとおり(3)を勘違いして、

constructor TCPanel.Create(AOwner: TComponent);
//TCPanelが親
の中に書いていました。
もう少しがんばります。

編集 削除
KHE00221  2009-11-21 10:26:22  No: 36200  IP: 192.*.*.*

『自分自身は親になれません』

このエラーは Parent := Self やらんと出てこないエラーだけど?
子コンポーネントのconstructorn内なんかでやってないか?

編集 削除
Mr.XRAY  2009-11-23 09:44:14  No: 36201  IP: 192.*.*.*

>>TComponentから派生したComponenntでは無理なのでしょうか?

>できますよ.方法は同じです.説明は省略します.

ちょっと文章がおかしいの誤解のないように訂正しておきます.
サブコンポーネントにできるのは,TComponentの派生クラスだけです.
というのは,SetSubComponentというメソッドがTComponentで実装されているからです.

クラス型のプロパティに使用するTPersistentにはありません.

編集 削除
D7  2009-11-25 23:00:59  No: 36202  IP: 192.*.*.*

Mr.XRAYさんありがとうございました。
正しく動作するようになりました。
>SetSubComponent(True);
>は(3)に書いてある通り,サブコンポーネントのconstructor,
>つまりサブコンポーネントのCreate内に書きます.
をPanelから派生した親の方にかいていました。
また、子(SubComponent)に既存のコンポーネントを使う場合は、
子のコンポーネントを1度作り、そこに『SetSubComponent(True);』
を作ればよかったわけですね?
7年ぶりにコンポーネントを作りましたがなんとかなりました。

編集 削除