Delphi2010を利用しています。
アクションの管理にはTActionListよりもTActionManagerが便利です。
しかし、TActionManagerを張り付けたフォームを継承しようとすると、「フォーム作成中にエラーが発生しました。コンポーネント'ActionManager1'が継承できないため、'Form1'から継承できません。」と叱られます。
回避策はないのでしょうか。皆さんはどのように、TActionListとTActionManagerをつかい分けていらっしゃるのでしょうか。
確かに、ActionListを使えば済むことですが、ActionManagerの使い勝手他のよさは捨てがたい。
私は、ActionManagerをデータモジュールにおくか、または、ActionManagerをおいて、アクションを集中管理するFormを作る場合などの悪あがきをしています。当然、Usesに気を使ったり、with ○○form do begin などとなり、複雑になります。それでも、ActionListに比較してのActionManagerの使い勝手のよさは捨てきれません。
捨てがたくても、できないものはできない。
無いものねだりはしないであるもので工夫をするしかない。のがプログラマー。
Form2 に ActionManager を貼り付けて
TForm1 = class(TForm2)
で普通にできるけど?
>Form2 に ActionManager を貼り付けて
>TForm1 = class(TForm2)
>で普通にできるけど?
コンパイルもできますか。
> Form2 に ActionManager を貼り付けて
> TForm1 = class(TForm2)
> で普通にできるけど?
そのやり方だとちゃんとした継承フォームにはなりませんね。
デザイン時にTForm1にはTForm2から継承したコンポーネントが表示されないので
IDE上で継承先のプロパティを変更したり、イベントハンドラを定義することができません。
実行時にコード上でプロパティを変更したりすることは可能ですが、これを「普通」と呼べるかどうか……
ちなみに、ActionManagerを貼り付けたFormが継承できないのは
TActionManager.ComponentStyleからcsInheritableが抜いてあるからです。
何らかの技術的理由で意図的にこうしてあると推測されますが(複雑すぎて面倒くさいとか)、まあ「仕方ない」ということですね。
>コンパイルもできますか。
できるし、実行もできる
>そのやり方だとちゃんとした継承フォームにはなりませんね。
>デザイン時にTForm1にはTForm2から継承したコンポーネントが表示されないので
>IDE上で継承先のプロパティを変更したり、イベントハンドラを定義することができません。
>実行時にコード上でプロパティを変更したりすることは可能ですが、これを「普通」と呼べるかどうか……
ActionManagerだけではないだろ?
これは Formを設計時に継承できない問題だろ?
> これは Formを設計時に継承できない問題だろ?
はい。だから「ちゃんとした継承フォーム」にはならないと書きました。
質問者は特に明記していませんが、普通にというなら設計時に継承できることを期待するのではないでしょうか?
最初の質問で書いたのは、Form1にActionManageを張り付け、
ファイル⇒新規作成⇒継承可能項目の手順でForm1を継承したForm2を作成しようとするとできないことを指しています。
KHE00221さんの方法であれば、エラーは出ませんが、通常は Formを設計時に継承できなければ価値半減というよりもあまり用途がないように思われます。
Yukiさんの例のように、ActionManageを別のFormに逃がしておく工夫するは、これまで私も行ってきましたが、今後もそれで進めることとします。
パーションアップのたびに「今度こそは継承できるか」と期待していますが、Embarcaderoさん頑張ってください。
>TActionManager.ComponentStyleからcsInheritableが抜いてあるからです。
constructor TActionManagerEx.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Include(FComponentStyle, csInheritable);
end;
追加してやれば継承できるようにはなるが?
何故削除してあるか知らないので
どのような弊害があるかはわからない
それなにの理由はあるだろうから
ツイート | ![]() |