トップ回答者
Formの派生について

質問
-
Formにいくつかのコントロールを配置し、このFormを基底Form(基底クラス)に、
Formを派生させようかと考えています。
Formを派生させると、いい具合に、基底Formに配置してあるコントロールは
デザイン時に移動できなくなっています。
その代わり、プロパティやイベントにもアクセス(変更)できなくなってしまっています。
そこで、基底Form側で、各コントロールの Modifiers プロパティを変更すると、
プロパティ値やイベントにアクセスできる様になる代わりに、Form上で
コントロールが移動できてしまいます。
そこで、派生Form側で、基底Form上のコントロールのプロパティやイベントに
アクセスでき、且つ、派生Form側ではコントロールの位置を変更できなくさせる
うまい方法というのはないものでしょうか?
(とりあず、Positionプロパティで位置を変更されたらどうするの、というのは
置いておいて)
コントロールのプロパティや、イベントにアクセスできる様に基底Form側で、
メンバをコーディングしていくというのは、ちょっと面倒かと思って。
実際に使用するプロパティや、イベントの数は数える程しかないですが、
個別にメンバをコーディングしていく、というのは最終手段で、という事で。
ご教授の程、宜しくお願い致します。
回答
-
ぶるーの さんからの引用
コントロールのプロパティや、イベントにアクセスできる様に基底Form側で、メンバをコーディングしていくというのは、ちょっと面倒かと思って。非常に面倒だと思いますが、それがベターな解決策であると思います。まず、modifier を private にした場合ですが、.NET のアクセス制御的に、派生クラスからプロパティを変更することができなくなりますので、コーディングを追加しないでプロパティの編集やイベントの追加を可能とすることはできません。
このため、既定クラスのコントロールに設定する modifier は protected 以上の公開レベルを必要とします。ぶるーの さんからの引用 (とりあず、Positionプロパティで位置を変更されたらどうするの、というのは置いておいて)
フォームデザイナでコントロールをドラッグ&ドロップするのは、Position プロパティを変更するのとまったく同じです。実際にコントロールを移動した際に生成されるデザインコードも、 Position プロパティを変更するものになります。このため、Position プロパティによる位置変更を不可能とすることは、結果的に目的を達成できる可能性があります。しかし、やはり十分なコーディングが必須となってしまうでしょう。残る手段として、デザイナの変更という手があります。各コントロールが利用しているデザイナをロック状態にすることで、すべてのプロパティを変更できるが、デザイン画面でのドラッグ&ドロップによって位置やサイズを変更できない状態を実現することができるでしょう。また、デザイナを1度作成してしまえば、基底クラスとなったフォームにデザイナ属性を1行足すだけで終わりであるのも手軽なところです。しかし、デザイナの作成そのものは、プロパティやイベントを公開するコーディングに比べると、数千倍から数万倍のコーディング量になることは確実でしょう。素直にやるとすれば、すべてのコントロールのデザイナを入れ替えるのは現実的ではない(それこそ数百万倍のコーディングが必要となる)ため、RootDesigner を1つ入れ替えることになると思います。RootDesigner の開発は、個人的感想ですが……おそらくデザイナの中で最も複雑で難易度が高いと思います。トリッキーにやるなら、「基底フォームのコントロールを派生フォーム上で Lock するデザイナ」を作成して、それをコンポーネントに付与してしまえば、意外と手軽に利用できるコンポーネントが作成できる……かも……しれません。
すべての返信
-
三輪の牛さん、回答、ありがとうございます。
>基底クラスでロックすると
基底Form(クラス)側で「コントロールのロック」(メニュー「書式」-「コントロールのロック」)や、
各コントロールのLockプロパティにTrueを設定している訳ではなく、
基底Formから派生したForm側では、基底Fomr上のコントロールは触れない仕組みのようなのです。
(仕組みというより Modifiers プロパティの設定値しだいなのですが)
それで、この仕組みを利用しつつ、基底Form上のコントロールのプロパティやイベントを
簡単に公開できるやり方があればいいなと思いまして質問させて頂きました。
-
ぶるーの さんからの引用
コントロールのプロパティや、イベントにアクセスできる様に基底Form側で、メンバをコーディングしていくというのは、ちょっと面倒かと思って。非常に面倒だと思いますが、それがベターな解決策であると思います。まず、modifier を private にした場合ですが、.NET のアクセス制御的に、派生クラスからプロパティを変更することができなくなりますので、コーディングを追加しないでプロパティの編集やイベントの追加を可能とすることはできません。
このため、既定クラスのコントロールに設定する modifier は protected 以上の公開レベルを必要とします。ぶるーの さんからの引用 (とりあず、Positionプロパティで位置を変更されたらどうするの、というのは置いておいて)
フォームデザイナでコントロールをドラッグ&ドロップするのは、Position プロパティを変更するのとまったく同じです。実際にコントロールを移動した際に生成されるデザインコードも、 Position プロパティを変更するものになります。このため、Position プロパティによる位置変更を不可能とすることは、結果的に目的を達成できる可能性があります。しかし、やはり十分なコーディングが必須となってしまうでしょう。残る手段として、デザイナの変更という手があります。各コントロールが利用しているデザイナをロック状態にすることで、すべてのプロパティを変更できるが、デザイン画面でのドラッグ&ドロップによって位置やサイズを変更できない状態を実現することができるでしょう。また、デザイナを1度作成してしまえば、基底クラスとなったフォームにデザイナ属性を1行足すだけで終わりであるのも手軽なところです。しかし、デザイナの作成そのものは、プロパティやイベントを公開するコーディングに比べると、数千倍から数万倍のコーディング量になることは確実でしょう。素直にやるとすれば、すべてのコントロールのデザイナを入れ替えるのは現実的ではない(それこそ数百万倍のコーディングが必要となる)ため、RootDesigner を1つ入れ替えることになると思います。RootDesigner の開発は、個人的感想ですが……おそらくデザイナの中で最も複雑で難易度が高いと思います。トリッキーにやるなら、「基底フォームのコントロールを派生フォーム上で Lock するデザイナ」を作成して、それをコンポーネントに付与してしまえば、意外と手軽に利用できるコンポーネントが作成できる……かも……しれません。