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

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

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

Re[4]: 元々用意されたクラス(TextBox)に機能を追加したい


(過去ログ 29 を表示中)

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

■13636 / inTopicNo.1)  元々用意されたクラス(TextBox)に機能を追加したい
  
□投稿者/ aobozu (1回)-(2008/02/01(Fri) 02:17:26)

分類:[C#] 

C#(多分1.1)で開発をしているのですが、作業後半になってからTextBoxのEnterかMouseDownイベントが起こった場合にBox内のテキストを全選択したいという要望が出ました。
SellectAll()を用いれば個々のTextBoxにその機能を実装することはできるのですが、かなりの数のTextBoxがあるので冗長などを考え元々のTextBoxクラスに機能を追加したいと思いました。
 妥協点としてネームスペース内でのみ通用するTextBoxを宣言してみたりしましたが、ネームスペース内でTextBoxという名前のクラスを宣言して、System.Windows.Forms.TextBoxを継承させているだけで、デザイナコードの変更は多くなってしまいます。
できればVisualStudioが生成したデザイナコードをいじらずに、System.Windows.Forms.TextBoxにプロパティを追加して、機能の有効無効を選択できるようにして、さも、もともとTextBoxにそういう機能がついていたかのように扱いたいのです。

いろいろ探しては見たのですが、System.Windows.Forms.TextBox自体に機能を追加する方法が分かりません。何か良い方法はないモノでしょうか?
引用返信 編集キー/
■13637 / inTopicNo.2)  Re[1]: 元々用意されたクラス(TextBox)に機能を追加したい
□投稿者/ 倉田 有大 (120回)-(2008/02/01(Fri) 02:42:14)
No13636 (aobozu さん) に返信
> C#(多分1.1)で開発をしているのですが、作業後半になってからTextBoxのEnterかMouseDownイベントが起こった場合にBox内のテキストを全選択したいという要望が出ました。
> SellectAll()を用いれば個々のTextBoxにその機能を実装することはできるのですが、かなりの数のTextBoxがあるので冗長などを考え元々のTextBoxクラスに機能を追加したいと思いました。
>  妥協点としてネームスペース内でのみ通用するTextBoxを宣言してみたりしましたが、ネームスペース内でTextBoxという名前のクラスを宣言して、System.Windows.Forms.TextBoxを継承させているだけで、デザイナコードの変更は多くなってしまいます。
> できればVisualStudioが生成したデザイナコードをいじらずに、System.Windows.Forms.TextBoxにプロパティを追加して、機能の有効無効を選択できるようにして、さも、もともとTextBoxにそういう機能がついていたかのように扱いたいのです。
>
> いろいろ探しては見たのですが、System.Windows.Forms.TextBox自体に機能を追加する方法が分かりません。何か良い方法はないモノでしょうか?

うーん。普通は継承して、コンストラクタにイベントの追加の記入?
またはプロパティーの追加?
すいません、自信ありません^^;
他に方法あるのかな?
引用返信 編集キー/
■13638 / inTopicNo.3)  Re[2]: 元々用意されたクラス(TextBox)に機能を
□投稿者/ Hirotow (172回)-(2008/02/01(Fri) 03:29:29)
2008/02/01(Fri) 03:29:39 編集(投稿者)
ここらへん参考にしてください。

msdn Online = 10 行シリーズ(番外編)
〜 10 行でズバリ!! - 番外編 〜 自分流のコントールを作っちゃおう 〜
http://www.microsoft.com/japan/msdn/thisweek/10lines/extra_bottoncontrol.aspx

やるべきことは、
1、プロパティ追加
private bool bSelectOnMouseDown

public bool SelectOnMouseDown
{
    get { return bSelectOnMouseDown; }
    set { bSelectOnMouseDown = value; }
}

2、イベントハンドラ追加
//コンストラクタで
this.MouseDown += new MouseEventHandler(this_MouseDown);

private void this_MouseDown(object sender, MouseEventArgs e)
{
    this.SelectAll();
}
となります。
#答え言い過ぎ

引用返信 編集キー/
■13648 / inTopicNo.4)  Re[3]: 元々用意されたクラス(TextBox)に機能を
□投稿者/ Hongliang (233回)-(2008/02/01(Fri) 09:51:57)
拡張プロバイダ……かな。
引用返信 編集キー/
■13660 / inTopicNo.5)  Re[1]: 元々用意されたクラス(TextBox)に機能を追加したい
□投稿者/ 渋木宏明(ひどり) (645回)-(2008/02/01(Fri) 11:00:47)
渋木宏明(ひどり) さんの Web サイト
デザイナコードを手動でいじりたくないなら、拡張プロバイダが適当そうですね。

ただ

・各フォームに拡張プロバイダを貼りこむ
・拡張機能を有効化するためのプロパティを操作する
・フォームを保存し直す

て操作は必要になりますが。

引用返信 編集キー/
■13662 / inTopicNo.6)  Re[3]: 元々用意されたクラス(TextBox)に機能を
□投稿者/ aobozu (2回)-(2008/02/01(Fri) 11:09:51)
No13638 (Hirotow さん) に返信
> 2008/02/01(Fri) 03:29:39 編集(投稿者)
>
> ここらへん参考にしてください。
>
> msdn Online = 10 行シリーズ(番外編)
> 〜 10 行でズバリ!! - 番外編 〜 自分流のコントールを作っちゃおう 〜
> http://www.microsoft.com/japan/msdn/thisweek/10lines/extra_bottoncontrol.aspx
>
> やるべきことは、
> 1、プロパティ追加
> private bool bSelectOnMouseDown
>
> public bool SelectOnMouseDown
> {
> get { return bSelectOnMouseDown; }
> set { bSelectOnMouseDown = value; }
> }
>
> 2、イベントハンドラ追加
> //コンストラクタで
> this.MouseDown += new MouseEventHandler(this_MouseDown);
>
> private void this_MouseDown(object sender, MouseEventArgs e)
> {
> this.SelectAll();
> }
> となります。
> #答え言い過ぎ

返信ありがとうございます、ここで述べられていることは派生クラスにプロパティを追加する方法と、イベント時にメソッドを呼び出すようにする方法ですか?参考になります。

どうも、既存のコントロールに機能を追加したコントロールではなく、もともとのコントロールの動作自体を変える方法はないのですかね?調べてみてそのようなことができない明言されている場所は見つかりませんでしたが、仕様として仕方がないのですかね?
引用返信 編集キー/
■13668 / inTopicNo.7)  Re[4]: 元々用意されたクラス(TextBox)に機能を
□投稿者/ aobozu (4回)-(2008/02/01(Fri) 11:33:39)
Hongliang さん
渋木宏明(ひどり)さん

拡張プロバイダ、
使ったことがないですが「既存のコンポーネントに擬似プロパティを追加する」みたいな感じですか、ほぅほぅ
なんだかいけそうな気がしてきます。
とりあえず拡張プロバイダ使うコードを考えてみたいと思います。

ありがとうございます。
引用返信 編集キー/
■13669 / inTopicNo.8)  Re[4]: 元々用意されたクラス(TextBox)に機能を
□投稿者/ 魔界の仮面弁士 (594回)-(2008/02/01(Fri) 11:36:29)
No13662 (aobozu さん) に返信
> もともとのコントロールの動作自体を変える方法はないのですかね?

それが、No13638 、Hirotow さんの 案 2 だと思うのですが、それでは駄目なのでしょうか?

void Form1_Load(object sender, EventArgs e)
{
    SetAutoSelect(this);
}

void SetAutoSelect(Control owner)
{
    if (owner == null) return;
    TextBoxBase txt = owner as TextBox;
    if (txt != null)
    {
        owner.MouseClick += delegate { txt.SelectAll(); };
        owner.Enter += delegate { txt.SelectAll(); };
    }
    foreach (Control c in owner.Controls) SetAutoSelect(c);
}

引用返信 編集キー/
■13671 / inTopicNo.9)  Re[5]: 元々用意されたクラス(TextBox)に機能を
□投稿者/ 渋木宏明(ひどり) (646回)-(2008/02/01(Fri) 11:39:51)
渋木宏明(ひどり) さんの Web サイト
> とりあえず拡張プロバイダ使うコードを考えてみたいと思います。

ヘルプにサンプルが収録されているので、参考にしてみてください。

方法 : 拡張プロバイダを実装する
http://msdn2.microsoft.com/ja-jp/library/d6c1xa43(VS.80).aspx

引用返信 編集キー/
■13679 / inTopicNo.10)  Re[1]: 元々用意されたクラス(TextBox)に機能を追加したい
□投稿者/ やじゅ (81回)-(2008/02/01(Fri) 12:39:35)
No13636 (aobozu さん) に返信
>
> できればVisualStudioが生成したデザイナコードをいじらずに、System.Windows.Forms.TextBoxにプロパティを追加して、
> 機能の有効無効を選択できるようにして、さも、もともとTextBoxにそういう機能がついていたかのように扱いたいのです。

各フォームのLoadイベントにて
1.各TextBoxコントロールに対して、Enterイベントのデリゲート(VBのAddHandler)処理を入れる
2.各TextBoxコントロールに対して、継承したTextBoxコントロールに書換える
このどちらかの処理を行えばいいと思われます。

引用返信 編集キー/
■13735 / inTopicNo.11)  Re[2]: 元々用意されたクラス(TextBox)に機能を追加したい
□投稿者/ aobozu (5回)-(2008/02/03(Sun) 22:35:14)
ん〜いまいちうまくできないです
デリゲートについても詳しく調べないと
魔界の仮面弁士 さんのサンプルコード流用すればいい気もしますがC#1.1で無名デリゲートできないから、別でデリゲート宣言して上げなければいけないのかな??
それとイベントにデリゲートでイベントハンドラを追加(文章の用法あってるのかな?)した場合に呼び出し元のイベントをもつテキストボックスを特定して呼び出す方法がわからない。

イベントハンドラに関連づける関数(object sender ,EventArgs e)
{
   拡張プロバイダで追加したプロパティの真偽は?
   関数を呼び出したイベントのコントロールの種類がTextBoxか?
   呼び出したイベントのコントロール(TextBox)のSelectAll()関数を呼び出して上げる
}


拡張プロバイダの定義に上の関数内での処理みたいなコードを追加する。

みたいなかんじなんですかね?

引用返信 編集キー/
■13737 / inTopicNo.12)  Re[3]: 元々用意されたクラス(TextBox)に機能を追加したい
□投稿者/ れい (413回)-(2008/02/04(Mon) 00:08:07)
No13735 (aobozu さん) に返信
> 魔界の仮面弁士 さんのサンプルコード流用すればいい気もしますがC#1.1で無名デリゲートできないから、別でデリゲート宣言して上げなければいけないのかな??

System.EventHandlerや
System.Windows.Forms.MouseEventHandlerというのが定義されています。
普通はこれらを使います。

> それとイベントにデリゲートでイベントハンドラを追加(文章の用法あってるのかな?)した場合に呼び出し元のイベントをもつテキストボックスを特定して呼び出す方法がわからない。

senderに送信元オブジェクトが入っています。
それをキャストして使えばOK。

私なら継承したコントロールを作ります。
デザイナが作ったコードも含めて、全部置換します。
引用返信 編集キー/
■13793 / inTopicNo.13)  Re[4]: 元々用意されたクラス(TextBox)に機能を追加したい
□投稿者/ aobozu (7回)-(2008/02/05(Tue) 00:23:35)
当初の目的とは違いましたが、イベントハンドラに、senderobjectを利用して呼び出し元のコントロールをいじる関数を渡すコードで実現させました。
テキストボックスを複数選択してプロパティを変更するという操作が必要で、TextBoxの個数/行のコードがデザイナによって追加されたので、及第点ではあるかと思います。
実現できなかったコードも、利点として
1.他者が自分のコードを利用するとき、TextBoxを継承したコントロールを使っていたり、イベント動作を追加していた場合にあえて説明する手間と、プログラムの統一性が崩れる心配が減る

2.プロパティだけで機能のOnOffができて、便利

ということがあり、いろいろ応用できそうなので、デリゲートや拡張プロバイダの勉強がてら、そのうち実現できるようにしたいと思います。

名前は個々に書きませんが、アドバイスや解答を考え、教えてくださった皆様ありがとうございました。

大変に助かりました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -