2013年7月24日水曜日

今日のC#の備忘録を書きますー。

今日はC#のテキストボックスを使っていて学んだことです。

一つ目が、入力した文字が16進数かどうかをチェックする方法があるかどうかを調べたところ、
余裕でありました。C#良い!
http://msdn.microsoft.com/ja-jp/library/vstudio/zf50za27.aspx

bool result = Int32.TryParse(textBox_addressReadWrite.Text, System.Globalization.NumberStyles.HexNumber, null, out data);
でチェック可能です。返り値がfalseの時は16進数ではありません。

文字列を変更時に、上記のチェックを入れています。
唯、この場合、文字列が空の場合もエラーを出すので、入力文字列が空の場合のスルー処理も必要です。


2つ目が、テキストボックスの桁数制限です。これはC++にもあったと思います。
プロパディから簡単に設定可能です。
http://program571.blog91.fc2.com/blog-entry-52.html


3つ目に、スレッド処理についてです。
シングルスレッドの限界に直面し、スレッドを利用することで、U_Iを自由に動かせるようにしたい!
でやってみましたが、めっちゃ複雑です。全然理解は足りていないですが、ある程度動くようになりました。
まず、デリゲートとイベントの機能を作る必要が合ったのですが、
public delegate void WindowUpdateHandler(List byteData, string readString, string epcString, bool endResponse);
public event WindowUpdateHandler WindowUpdate;
上記のようなものを作るだけで、OKです。
後は、関数の登録して、使用出来ます。正直、想像していた以上に簡単に使えるので、(理解は未だ完全にできていない。。。)使ってみて、覚えるのが良いです!使えるようになると、関数ポインタをすごい簡単に作れることに気づいて、楽しくなります 笑

4つ目に、スレッド化した後のU_Iの操作についてです。理由はわかっていないですが、新規スレッドから、メインスレッドU_Iのユーザーインターフェースコントロールにアクセスすると、以下のようなエラーがでます。
 
 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール ‘textBox1′ がアクセスされました。

で、Invokeという関数を使うとうまくいくようになりました。
Invokeを使うと、メインスレッドから、呼び出したことになります。
ここで、注意点としては(僕だけかもしれませんが、)メインスレッドが無限ループに入っているとkInvokeは反応しなくなります。でおろおろすることになります。メインスレッドの無限ループは解除してから、Invokeを実装するようにすると、すごい幸せに実装できます。
参考URLは以下です。
http://blog.ume108.mobi/?p=1654
http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html
http://www.ecoop.net/memo/archives/2007-04-10-2.html

以上です。

何か、間違った点などあれば、ご指摘頂ければ、可能な限り対応します。
ではでは

0 件のコメント:

コメントを投稿