- PR -

Windowsフォームのデザイン時に非実行のコードを書くには

1
投稿者投稿内容
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2004-10-02 16:50
ちょっと困ったことがあり、過去ログも調べたのですが
見つけることができなかったので質問させてください。

現在Windowsフォームのアプリケーションを開発しているのですが、
フォームのいくつかコントロールのプロパティを実行時に動的に
取得したいと考えています。
ところがフォームのコンストラクタやいくつかのイベントは
デザイナで画面を編集しているときにも発行するようで
画面のデザイナを開くとエラーが発生し画面の編集ができません。

無論、値を動的取得している部分を固定したり、イベント
プロシージャの一部をコメントアウトすれば問題なく編集できる
ようになります。
しかし、それでは開発の効率が落ちてしまいます。
条件付コンパイルに関しても調べたのですが、手動でコンパイル
条件を操作する方法しか見つけることができませんでした。

希望としては、デザイナから開いている時には前述の箇所を
自動的に実行しないように設定できればと思っています。

もしどなたかご存知の方がおられましたら、情報を教えていただけると
助かります。よろしくお願いします。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-10-02 18:47
引用:

希望としては、デザイナから開いている時には前述の箇所を
自動的に実行しないように設定できればと思っています。



DesignMode プロパティを見て処理を振り分けるとか。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-02 19:22
引用:

渋木宏明(ひどり)さんの書き込み (2004-10-02 18:47) より:

DesignMode プロパティを見て処理を振り分けるとか。


 えーっと、過去ログがこの辺にあって、、、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2525&forum=7
なんか、違うみたいです。いや、使い方が間違っているのかもしれませんけど。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-10-02 22:14
引用:

 えーっと、過去ログがこの辺にあって、、、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2525&forum=7
なんか、違うみたいです。いや、使い方が間違っているのかもしれませんけど。



使い方が間違っているかどうかはよく分かりませんが、コンストラクタ内では正しく判定できなかったような記憶があります>DesignMode プロパティ

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2004-10-03 01:56
渋木宏明(ひどり)さん、Jittaさんありがとうございます。
ですが結果から述べるとうまくいきませんでした。

渋木さんが言われているように

> 使い方が間違っているかどうかはよく分かりませんが、コンストラクタ内では
> 正しく判定できなかったような記憶があります>DesignMode プロパティ

確かにコンストラクタ内では機能しませんでした。
でもとりあえず、ロードイベントで勝手に実行されて困っていた部分は
とりあえずはずすことができました。
ありがとうございます。

ただ、贅沢なのかもしれませんが条件付コンパイルのような場合と比べると
今一つすっきりしない気分でもあります。また、コンストラクタで
機能しなかったことも今一つすっきりしないことの原因ではあります。

すっきりしないというのは、マイクロソフトの製品なら、大体予想される
その辺は抑えてあるはずだという期待があるためかもしれません。
うーん、なんとかならないのかな。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-10-03 13:15
引用:

ただ、贅沢なのかもしれませんが条件付コンパイルのような場合と比べると
今一つすっきりしない気分でもあります。また、コンストラクタで
機能しなかったことも今一つすっきりしないことの原因ではあります。



コンストラクタで DesignMode プロパティが正しい値を返さないのは仕方の無いことです。

コンポーネントやコントロールのインスタンス構築は(様々な理由があって)標準コンストラクタが呼び出されるわけで、引数を渡すことが出来ません。

つまり、インスタンス生成の時点では、今まさに構築されようとしているインスタンスに対して「現在デザインモードであるかどうか」を伝える方法が無いのです。

また、コントロールについては、インスタンスが作成された時点では「Windows GUI のウィンドウとしての実体」が与えられていないわけですから、コントロールとして所定の動作をすることも期待できません。

てな具合ですから、コンポーネントまたはコントロールのコンストラクタで、「デザインモードであるかどうか」を意識する必要のある処理を行うのは適切でないことが分かると思います。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2004-10-03 15:15
こんにちは渋木宏明(ひどり)さん、情報感謝します。

> コンストラクタで DesignMode プロパティが正しい値を返さないのは仕方の無いことです。
> コンポーネントやコントロールのインスタンス構築は(様々な理由があって)
> 標準コンストラクタが呼び出されるわけで、引数を渡すことが出来ません。
> つまり、インスタンス生成の時点では、今まさに構築されようとしているインスタンスに
> 対して「現在デザインモードであるかどうか」を伝える方法が無いのです。

いやー理論的にはわかります。ですが、正直いってデザインモードでデザイナは
全てのコンストラクタのコードを実行しなければならないのでしょうか。
条件付コンパイルの要領でコードの実行の有無を選択できるようにならないのか、
というのが私の「すっきりしない」といっている理由です。
また、コンストラクタだけでなく、Loadイベントや、Loadイベントで設定した
Paintイベントなども(元々はコンストラクタで設定していましたがLoadイベントに
移動させました)発行されています。
Windowsフォームの継承を行った際、継承先フォームをデザイナで開いた際
継承元フォームのLoadイベントで設定したコントロールのEnabledの状態や
イベントが有効になっているようです。
つまり、あるコントロールを継承元のデザイナでEnableで設定し、Loadイベントで
Disableに設定していると、継承先のフォームをデザイナで開くと、そのコントロールは
プロパティではEnableに設定されているにも関わらず、デザイナではDisableで
編集ができないことを確認しています(英語版.NET Framework 1.1)。
コードアクセスセキュリティや、デバッグモードでの実行コードの選択の有無が
可能なのですから、デザインモード時での実行コードの選択の有無が可能では
ないかと思ったのです。

> てな具合ですから、コンポーネントまたはコントロールのコンストラクタで、
> 「デザインモードであるかどうか」を意識する必要のある処理を行うのは適切でない
> ことが分かると思います。

うーん、分かりますが、一部のコンポーネントのプロパティは実行時にリモート
オブジェクトから取得するクラスを利用するので、実行時でないと取得できない
ですし、通常のイベントやプロパティの設定はコンストラクタ内にある
InitializeComponentで行っているのですから、できればイベントの定義なんかは、
Loadイベントなどでなく同じコンストラクタで行いたいと思うのです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-10-03 20:10
引用:

べーちゃんさんの書き込み (2004-10-03 15:15) より:

いやー理論的にはわかります。ですが、正直いってデザインモードでデザイナは
全てのコンストラクタのコードを実行しなければならないのでしょうか。
条件付コンパイルの要領でコードの実行の有無を選択できるようにならないのか、
というのが私の「すっきりしない」といっている理由です。


 まぁ、確かに。引用したスレッドでも書いていますが、Borland C++ Builderでは、コンストラクタでも判別可能だったと記憶していますから、方法がないことはないように思います。

 で、あちらのスレッド、または上の「検索」から、「DesignMode」をキーに検索するともう1つスレッドがありますが、どちらかで「アセンブリの取得元で判別する」という方法が載っています。
_________________
1

スキルアップ/キャリアアップ(JOB@IT)