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

解決


渡辺  2011-05-06 05:47:35  No: 40502  IP: [192.*.*.*]

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

編集 削除
Yuki  2011-05-09 08:21:06  No: 40503  IP: [192.*.*.*]

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

編集 削除
Hal  2011-05-09 13:09:50  No: 40504  IP: [192.*.*.*]

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

編集 削除
KHE00221  2011-05-10 10:09:57  No: 40505  IP: [192.*.*.*]

Form2 に ActionManager を貼り付けて

TForm1 = class(TForm2)

で普通にできるけど?

編集 削除
Yuki  2011-05-10 14:31:44  No: 40506  IP: [192.*.*.*]

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

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

編集 削除
tor  2011-05-10 16:36:54  No: 40507  IP: [192.*.*.*]

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

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

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

編集 削除
KHE00221  2011-05-10 17:07:02  No: 40508  IP: [192.*.*.*]

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

できるし、実行もできる

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

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

編集 削除
tor  2011-05-10 17:43:44  No: 40509  IP: [192.*.*.*]

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

編集 削除
渡辺  2011-05-10 22:07:33  No: 40510  IP: [192.*.*.*]

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

編集 削除
KHE00221  2011-05-11 08:11:22  No: 40511  IP: [192.*.*.*]

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

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

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

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

編集 削除