C# インデクサと配列について への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るしぇ  (社会人) 投稿日時 2010/3/17 18:35:13
> エラーがスローされた場合に最大値を大きくする事をよく考えてから
> 実装させたいと思います。
いや、考え方が逆。

コレクションの場合、Count プロパティを合わせて実装します。
つまり、事前にキー情報の数を取得し、登録されているキー情報の数だけ
処理します。しかし、
> public Keys this[int index]
だけを抜き出して考えると、index を自由に指定できますよね。だから、
想定外の index が指定されたらエラーとする。それで処理終了です。
エラーを出したくないなら、事前に Count プロパティを確認してから
その数だけ処理するよう、プログラミングする側で対処します。クラスに
実装しません。できません。

> エラーがスローされた場合に最大値を大きくする事をよく考えてから
最大値を大きくしたところで、その index に対応するキー情報は、
「存在しない」わけですから、対応できるはずが無いのです。

このあたりは、既存の ListView などを参考に、既存のコントロールが
どのように設計されているかを観察してみてください。
投稿者 tecc  (社会人) 投稿日時 2010/3/17 17:53:24
ありがとうございます。

コレクションを使用する事にしました。
エラーがスローされた場合に最大値を大きくする事をよく考えてから
実装させたいと思います。
投稿者 るしぇ  (社会人) 投稿日時 2010/3/17 04:09:07
まぁ、別にこちらは迷惑な内容でもないですし、VB以外の話題も書き込まれる掲示板ですから
そこまで気にする必要は無いでしょう。

複数のキー情報を覚えるのに配列である必要はあるんですか?
サイズが可変ならコレクションを利用すればいいのでは?
[Visual Basic 中学校 > 初級講座 > 第28回 コレクション]
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard28.htm

ListView の ListItem みたいに ItemAdd していって、使う時は最大 Index より大きい数
が指定されたら ArgumentOutOfRangeException を発生させるのが基本形かな。
投稿者 tecc  (社会人) 投稿日時 2010/3/17 02:37:42
遅くなりました。

>一応、ここは[Visual Basic 中学校 掲示板]なので板違い
この件につきましてはHP管理者さんとるしぇさんにご迷惑をお掛けしました。
申し訳なかったです・・。
今後は適切な場所に投稿するよう心がけます。
すみませんでした。

このまま、C#メインの掲示板に移動してもすっきりしないのですが
ご迷惑になりそうなのでるしぇさんの助言を踏まえ考えてから移動します。

ただ、C#のコードで書かなければクラス設計の話になるのだと下の発言にて
考えたので、助言を頂けるのであればよろしくお願いします。

>それ以前にクラス設計の考え方が良くないような気がします。
>もう少し具体的な目的や結果を説明して欲しいです。

はい、この実装したい機能では次のコントロールをタブオーダーで判断します。
元々TextBoxはEnterキーで移動したり矢印で移動したりするものではないと言う事を
理解した上で、TextBoxに入力が完了した場合、Enterキーや矢印キーで次のコントロールに
移動させたく思っています。

ですが、ここからは自分の考えになります。
Enterキーのみ使いたい 矢印キーのみ使いたい 様々な状況に対応させるには
テキストボックスに指定したキーが押された場合は次のコントロールに移動する機能を実装するべき
という結論に至りました。

ここで指定されたキーとは、プロパティウィンドゥから登録する形でも使用する側から
プロパティにアクセスした時の指定したキーです。

次に考えたのは、指定されたキーが複数の場合はどのように処理したら良いのだろう。と思いました。

結果的に、僕はカスタムテキストボックスを作成しどうせ作成するなら今後も利用できるように
プロパティウィンドゥから Enterキー等の様々なキーを登録して使えるようにしたら楽だろうと
考えこの際にでてきた問題が、質問の内容になります。

もし助言を頂けるのであれば宜しく御願いします。
適切ではないと判断された場合はこのまま削除しますのでその旨をご返答下さい。
投稿者 るしぇ  (社会人) 投稿日時 2010/3/16 19:22:40
> C# インデクサと配列について
一応、ここは[Visual Basic 中学校 掲示板]なので板違い。質問しても
回答が付くレベルの板違いだけど、C# メインでプログラムしている人が
集まるサイトに移動した方が、より良い回答を得られます。

>.NET暦は入門者~初心者レベルです。宜しく御願いします。
> まず、テキストボックスを継承したクラス。
>//デリゲート
>//インデクサ
初心者が使う言葉じゃないねwレベルの高いところに既に踏み込んでます。
回答者側から見ると、初心者として扱っては失礼だと感じる内容なので、
ご自分でも、もう、初心者という意識は捨てた方が良いでしょう。
# たとえ本当に数日しか勉強してなくてこのレベルに辿り着いたとしても。
質問内容にも回答内容にも、中級者レベルの知識と経験が必要と思われます。
こちらからもそのレベルでの要求をします。

ネクストコントロールって何でしょう?
[Tab]キーで移動する隣りのコントロール?
フォーム上のコントロールは兄弟みたいなものですが、
お互いに干渉(依存)しないように設計します。

兄が隣りの家(違うフォーム)に移動したら、弟も
一緒に付いていかないとエラーが出るとか面倒なので。

で、「次のコントロール」とかはもっと上位の親の立場が管理します。
例えば「フォーム」とか「アプリケーション」です。
同じ種類のコントロールを配列に入れて管理するにしても、
基本、フォームが管理すべきだと思います。
>コンストラクタで配列の添え字でNew
それ以前にクラス設計の考え方が良くないような気がします。
もう少し具体的な目的や結果を説明して欲しいです。
まず、以下ではクリアできない内容ですか?

[Visual Basic 中学校 > VB.NET サンプル > 次のコントロールを取得する]
http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample071GetNextControl.htm
[Control.GetNextControl メソッド]
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.getnextcontrol.aspx
投稿者 tecc  (社会人) 投稿日時 2010/3/16 18:50:10
C# インデクサと配列について
.NET暦は入門者~初心者レベルです。宜しく御願いします。

まず、テキストボックスを継承したクラス。カスタムテキストボックスクラスを
作成しました。

このクラスにネクストコントロールを実装したく思っていますがどうにもインデクサの
部分の理解が足りないので教えて下さい。

dobon.net/vb/dotnet/beginner/defaultproperty.html
//デリゲート
KeyPress +=new KeyPressEventHandler(CustmTextBox_NextControl_KeyPress);

#region Enterキーや矢印によるコントロールの移動

        [Category("コントロールの移動用キー"),
        Description("keycodeを[]で囲い入力して下さい。),
        DefaultValue("")]
        private Keys [] nextcontrolkeys;
        public static int KeysCapacity; //テスト用static
//インデクサ
        public Keys this[int index]
        {
            get { return nextcontrolkeys[index]; }
            set
            { 
                nextcontrolkeys[index] = value; 
            }
        }
        private void  CustmTextBox_NextControl_KeyPress(object sender, KeyPressEventArgs e)
        {
          throw new NotImplementedException();
        }
#endregion


まず最初に、nextcontrolkeysをどこでインスタンスを生成すれば良いのでしょうか?
URLを参考にした場合は、クラスのコンストラクタで行っていますが・・。
実際にはこのような機能を実装する場合にはコンストラクタで配列の添え字でNewは行わないのでわ?
と思った為にこのような疑問が生じました。

それとも汎用性を無くし事前に添え字の最大値を決めておくのが最適なのでしょうか?