TActionManagerを張り付けたFormは継承不可?

解決


渡辺  2011-05-06 14:47:35  No: 40502

Delphi2010を利用しています。
アクションの管理にはTActionListよりもTActionManagerが便利です。
しかし、TActionManagerを張り付けたフォームを継承しようとすると、「フォーム作成中にエラーが発生しました。コンポーネント'ActionManager1'が継承できないため、'Form1'から継承できません。」と叱られます。
回避策はないのでしょうか。皆さんはどのように、TActionListとTActionManagerをつかい分けていらっしゃるのでしょうか。


Yuki  2011-05-09 17:21:06  No: 40503

確かに、ActionListを使えば済むことですが、ActionManagerの使い勝手他のよさは捨てがたい。
私は、ActionManagerをデータモジュールにおくか、または、ActionManagerをおいて、アクションを集中管理するFormを作る場合などの悪あがきをしています。当然、Usesに気を使ったり、with ○○form do begin などとなり、複雑になります。それでも、ActionListに比較してのActionManagerの使い勝手のよさは捨てきれません。


Hal  2011-05-09 22:09:50  No: 40504

捨てがたくても、できないものはできない。
無いものねだりはしないであるもので工夫をするしかない。のがプログラマー。


KHE00221  2011-05-10 19:09:57  No: 40505

Form2 に ActionManager を貼り付けて

TForm1 = class(TForm2)

で普通にできるけど?


Yuki  2011-05-10 23:31:44  No: 40506

>Form2 に ActionManager を貼り付けて
>TForm1 = class(TForm2)
>で普通にできるけど?

コンパイルもできますか。


tor  2011-05-11 01:36:54  No: 40507

> Form2 に ActionManager を貼り付けて
> TForm1 = class(TForm2)
> で普通にできるけど?

そのやり方だとちゃんとした継承フォームにはなりませんね。
デザイン時にTForm1にはTForm2から継承したコンポーネントが表示されないので
IDE上で継承先のプロパティを変更したり、イベントハンドラを定義することができません。
実行時にコード上でプロパティを変更したりすることは可能ですが、これを「普通」と呼べるかどうか……

ちなみに、ActionManagerを貼り付けたFormが継承できないのは
TActionManager.ComponentStyleからcsInheritableが抜いてあるからです。
何らかの技術的理由で意図的にこうしてあると推測されますが(複雑すぎて面倒くさいとか)、まあ「仕方ない」ということですね。


KHE00221  2011-05-11 02:07:02  No: 40508

>コンパイルもできますか。

できるし、実行もできる

>そのやり方だとちゃんとした継承フォームにはなりませんね。
>デザイン時にTForm1にはTForm2から継承したコンポーネントが表示されないので
>IDE上で継承先のプロパティを変更したり、イベントハンドラを定義することができません。
>実行時にコード上でプロパティを変更したりすることは可能ですが、これを「普通」と呼べるかどうか……

ActionManagerだけではないだろ?
これは Formを設計時に継承できない問題だろ?


tor  2011-05-11 02:43:44  No: 40509

> これは Formを設計時に継承できない問題だろ?
はい。だから「ちゃんとした継承フォーム」にはならないと書きました。
質問者は特に明記していませんが、普通にというなら設計時に継承できることを期待するのではないでしょうか?


渡辺  2011-05-11 07:07:33  No: 40510

最初の質問で書いたのは、Form1にActionManageを張り付け、
ファイル⇒新規作成⇒継承可能項目の手順でForm1を継承したForm2を作成しようとするとできないことを指しています。
KHE00221さんの方法であれば、エラーは出ませんが、通常は Formを設計時に継承できなければ価値半減というよりもあまり用途がないように思われます。
Yukiさんの例のように、ActionManageを別のFormに逃がしておく工夫するは、これまで私も行ってきましたが、今後もそれで進めることとします。
パーションアップのたびに「今度こそは継承できるか」と期待していますが、Embarcaderoさん頑張ってください。


KHE00221  2011-05-11 17:11:22  No: 40511

>TActionManager.ComponentStyleからcsInheritableが抜いてあるからです。

constructor TActionManagerEx.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Include(FComponentStyle, csInheritable);
end;

追加してやれば継承できるようにはなるが?

何故削除してあるか知らないので
どのような弊害があるかはわからない
それなにの理由はあるだろうから


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

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






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