Delphi7を使ってサブコンポーネントを作成しているのですが、
親 TCustomPanel 子 TComponentから派生したComponennt
で、TComponentはParentプロパティがないので、
FAComp1 := TAComp1.Create(Self);
してCreateしてみたのですが、『自分自身は親になれません』
のエラーがでます。
Parentが指定できないTComponentから派生したComponenntでは
無理なのでしょうか?
よろしくお願いします。
Selfは自分自身ですから、別に派生元の親を決めないといけません。
ところで、「サブコンポーネント」って何ですか?
はじめて聞きます。
パネル上にコンポーネントを貼り付けしたものを作りたいのだと想像するけど、
> FAComp1 := TAComp1.Create(Self);
これをどこに記述しているの?
メッセージから考えると、子クラスのようだけど、子クラスのコンストラクタ内とか?
親クラスから子クラスをクリエイトする時には、そんなエラーはでないと思います。
パネル内にコンポーネントを表示したいのだとしたら、
ビジュアルコンポーネントということですから少なくともTControlから派生しないと無理ですね。
ただ、TComponent.Createの引数に指定するのはOwnerであって、Parentとは別物です。
実行時に画面に表示されない、単にPanelに所有されているというだけのコンポーネントなら
TComponentから派生して、Panel自身をOwnerにしてやれば問題ないと思いますが。
HOtaさん、ぽむぽむ、tttさんありがとうございます。
D7です。
tttさんの通り、パネル内にコンポーネントを表示させる
のが、目的です。
Owerに替えてやってみます。
HOtaさんへちなみにサブコンポーネントとは、Delphi6
から実装されたコンポーネントの中でコンポーネントを
作成する場合に便利な機能?らしいです。
便利そうなので今回試して見ようと思います。
こんにちは,Mr.XRAYです.
>TComponentから派生したComponenntでは無理なのでしょうか?
できますよ.方法は同じです.説明は省略します.
それとも,TComponent以外の派生クラスだと出来ているということでしょうか?
もし,そうだとしたら,そのDelphiは壊れているかも知れませんね.
以下を参考にしてみてください.
■ 12_サブコンポーネント
http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#112
>> FAComp1 := TAComp1.Create(Self);
>これをどこに記述しているの?
自分自身の中で,自分自身のインスタンスは作成できません.
MrXさんへ こんな感じでいいのでしょうか?
constructor TCPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// サブコンポーネント作成.
FAComp1 := TAComp1.Create(Self);
SetSubComponent(True);
end;
どれがサブコンポーネントで,どれが親(というのかな?)コンポーネントなんでしょうか?
親 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のことです)
では頑張ってください.
眠い.....
もし,サブコンポーネントが FAComp1 であったとしたら
(3)が間違っているということです.
SetSubComponent(True);
は(3)に書いてある通り,サブコンポーネントのconstructor,つまり
サブコンポーネントのCreate内に書きます.
>http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#112
この記事は役に立たなかったようですね.
申し訳ありません.誤字脱字かまたは文章が読みにくかったのでしょうね.
MrXさん眠いのにありがとうございます。
おっしゃるとおり(3)を勘違いして、
constructor TCPanel.Create(AOwner: TComponent);
//TCPanelが親
の中に書いていました。
もう少しがんばります。
『自分自身は親になれません』
このエラーは Parent := Self やらんと出てこないエラーだけど?
子コンポーネントのconstructorn内なんかでやってないか?
>>TComponentから派生したComponenntでは無理なのでしょうか?
>できますよ.方法は同じです.説明は省略します.
ちょっと文章がおかしいの誤解のないように訂正しておきます.
サブコンポーネントにできるのは,TComponentの派生クラスだけです.
というのは,SetSubComponentというメソッドがTComponentで実装されているからです.
クラス型のプロパティに使用するTPersistentにはありません.
Mr.XRAYさんありがとうございました。
正しく動作するようになりました。
>SetSubComponent(True);
>は(3)に書いてある通り,サブコンポーネントのconstructor,
>つまりサブコンポーネントのCreate内に書きます.
をPanelから派生した親の方にかいていました。
また、子(SubComponent)に既存のコンポーネントを使う場合は、
子のコンポーネントを1度作り、そこに『SetSubComponent(True);』
を作ればよかったわけですね?
7年ぶりにコンポーネントを作りましたがなんとかなりました。
ツイート | ![]() |