サブコンポーネント

解決


D7  2009-11-19 06:14:46  No: 36189

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


HOta  2009-11-19 16:38:32  No: 36190

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

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


ぽむぽむ  2009-11-19 17:33:57  No: 36191

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

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


ttt  2009-11-19 20:45:35  No: 36192

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

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


D7  2009-11-20 08:10:42  No: 36193

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


Mr.XRAY  2009-11-20 10:54:21  No: 36194

こんにちは,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-21 08:49:02  No: 36195

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

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


Mr.XRAY  2009-11-21 09:48:09  No: 36196

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

親    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 09:54:05  No: 36197

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

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


Mr.XRAY  2009-11-21 09:57:15  No: 36198

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

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


D7  2009-11-21 16:36:20  No: 36199

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

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

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


KHE00221  2009-11-21 19:26:22  No: 36200

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

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


Mr.XRAY  2009-11-23 18:44:14  No: 36201

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

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

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

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


D7  2009-11-26 08:00:59  No: 36202

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加