C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: デザインモードで形状変更


(過去ログ 132 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■78206 / inTopicNo.1)  デザインモードで形状変更
  
□投稿者/ デザイン編集者 (1回)-(2015/12/22(Tue) 00:08:41)

分類:[C#] 

C#でメソッドを実行すると大きさが変わるコントロールを作りました。
ファイルの設定値によってフォーム上のコントロールを配置と形状を変化させます。
現在は配置を変えるごとに実行して確認しなければいけないのですごく時間がかかっております。
なのでデザインモード時にデザインを変更する方法を探しているのですがわからず困っています。

各コントロールには共通のインターフェースが実装されており、
そこで定義されたメソッドを実行することによりコントロールが設定値に沿った
形状に変化する仕組みになっています。

デザインモードでメソッドが実行可能になれば、ユーザーコントロールを定義して
フォームと同じコントロールを配置すれば
デザインを目視化できるようになるので、ぜひ教えてください。

引用返信 編集キー/
■78207 / inTopicNo.2)  Re[1]: デザインモードで形状変更
□投稿者/ 魔界の仮面弁士 (614回)-(2015/12/22(Tue) 00:29:22)
No78206 (デザイン編集者 さん) に返信
> C#でメソッドを実行すると大きさが変わるコントロールを作りました。
それをプロパティに変更するわけにはいかないのでしょうか?
デザイン時に変更できるのは、プロパティの値なわけで。

Text プロパティ然り、Location プロパティ然り、Size プロパティ然り。


> 現在は配置を変えるごとに実行して確認しなければいけないのですごく時間がかかっております。
実施している処理にもよりますが、ISupportInitialize インターフェイスを
実装するとか、SuspendLayout & ResumeLayout で配置調整をまとめるなどで
効率化できないでしょうか。


> 各コントロールには共通のインターフェースが実装されており、
> そこで定義されたメソッドを実行することによりコントロールが設定値に沿った
> 形状に変化する仕組みになっています。
インターフェイスもプロパティを実装できます。
https://msdn.microsoft.com/ja-jp/library/64syzecx.aspx

あるいは、基底クラスに共通のプロパティを持たせるという手も。


> デザインモードでメソッドが実行可能になれば、
できますが、呼び出しの起点となるのは PropertyGrid から UI 型エディターを
経由して呼び出すパターンだったり、デザイナーコマンドを用いるなどの作法になります。
https://msdn.microsoft.com/ja-jp/library/ms171567.aspx

それなりに制限もあるので、プロパティとして再実装した方が手っ取り早いのではないかと。
引用返信 編集キー/
■78220 / inTopicNo.3)  Re[2]: デザインモードで形状変更
□投稿者/ デザイン編集者 (2回)-(2015/12/24(Thu) 06:05:00)
>デザイン時に変更できるのは、プロパティの値なわけで
>それなりに制限もあるので、プロパティとして再実装した方が手っ取り早いのではないかと。

そうですね。プロパティを付けないといけないことはわかりました。
ただ、インターフェースを実装しているクラスが多くて、今後もこのインターフェースを実装するコントロールが増える予定なので
インターフェースを共通メソッドを付けた基底クラスにしたいと思ったのですが、
Controlのため、多重継承になってしまうため基底クラスに変更することができません。

一つ一つのクラスに同じ共通処理を行うプロパティを記述していくのは
なんとなく不格好な気がして気が進まないのですが、やはり一つ一つのクラスにプロパティをつけるしかないのでしょうか。
引用返信 編集キー/
■78221 / inTopicNo.4)  Re[3]: デザインモードで形状変更
□投稿者/ 魔界の仮面弁士 (617回)-(2015/12/24(Thu) 08:29:23)
2015/12/24(Thu) 09:58:16 編集(投稿者)

No78220 (デザイン編集者 さん) に返信
> インターフェースを共通メソッドを付けた基底クラスにしたいと思ったのですが、
> Controlのため、多重継承になってしまうため基底クラスに変更することができません。

「Control を継承した共通クラス」を継承すれば良いのでは?
RichTextBox や TextBox が、共通の TextBoxBase を継承しているように。

VB の場合、シェイプ系のコンポーネントが、
 Component クラス
 └Shape クラス
  ├SimpleShape クラス
  │├RectangleShape クラス
  │└OvalShape クラス
  └LineShape クラス
という階層を辿っていますね。

あるいは、基底クラスの変更が難しいようであれば、
拡張プロバイダなコンポーネントで対応してみるとか。
(…って、編集している間に、Hongliang さんからも提案されていますね)
 

これを用いた具体例としては、TableLayoutPanel があります。
TableLayoutPanel の上に TextBox を配置した場合、
TextBox に対するデザイン時プロパティとして
  Cells
  Column
  ColumnSpan
  Row
  RowSpan
が追加されます。

同様に、ErrorProvider や ToolTip のコンポーネントを使うと、
"errorProcider1 の何某" や "toolTip1 の何某" といった
デザイン時プロパティが動的に生成されます。
  
いずれにせよ、命名規約などに一定のルールが必要になりますので、
プロパティとして再実装するのとどちらが良いのかは
ケースバイケースになりますね。
引用返信 編集キー/
■78222 / inTopicNo.5)  Re[4]: デザインモードで形状変更
□投稿者/ Hongliang (387回)-(2015/12/24(Thu) 08:45:11)
https://msdn.microsoft.com/ja-jp/library/ms171835.aspx
拡張プロバイダという機能を使えば、メソッド呼び出しのデザイン時プロパティ化をできるかもしれません。
引用返信 編集キー/
■78303 / inTopicNo.6)  Re[5]: デザインモードで形状変更
□投稿者/ デザイン編集者 (3回)-(2016/01/07(Thu) 00:18:27)
皆様回答ありがとうございます。

調べている中でこちらのページに到達しておおよその機能を作成しました。

http://d.hatena.ne.jp/coma2n/20071029/1193669727

後は各コントロールに表示されるプロパティ引数をstring型からbool型へ、(trueを指定された際にメソッドを実行)

プロパティ名を任意のものへ変更できればよいのですが、どうすればよろしいでしょうか。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -