暇人おやじの暇なつぶやき
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
■アプリケーション固有の値を保存、利用する
画面の位置や背景の色など、アプリケーションを取り巻く環境は様々です 個々のアプリはそれぞれにこの値を保持して利用することができます これは従来iniファイルなどに保存していた機能です .NETではsetting情報として、configファイルに保存されるようです(らしいです) 使い方はいたって簡単! 次の例はフォームの位置を保存、利用する方法 例 保存時 My.Settings.top = Me.Top My.Settings.left = Me.Left My.Settings.Save() 利用時 Top = My.Settings.top Left = My.Settings.left これらは、プログラム(インスタンス)毎に保存されるため、プログラム名を変更しても別の値として利用可能なのでR 出来上がったプログラムSettingSample1.exeをコピーして起動してみる SettingSample2.exeを起動すると、位置が初期値になる 保存ファイルSettingSample1.exe.configができているので、SettingSample2.exe.configもできる筈なのだが、これが見当たらない・・・ちょっと謎なのでR configファイルを消せば初期値になるはずだが、コピーしたプログラムはどうやって初期化ずるべぇか・・・ と思いつつ、SettingSample1.exe.configを消してみた、見事初期化成功 し か し 次に保存してもSettingSample1.exe.configが出来ないではないか? どこに 保 存 してるんですか?いったい・・・ PR
■スレッドから処理を依頼する安全な処理方法
Delegate Sub SetTextCallback(ByVal [text] As String) これは、SetTextCallbackを実行する実体であり、このSetTextCallbackは各スレッドから呼び出す際、安全に実行される この実体はSetTextプロシジャに設定してあり、このSetTextCallbackを指定することで、複数のスレッドがフォームのコンポーネントにアクセスしても、問題なく処理されるものである これはDelphiで言うところの「Synchronize」に値する Private Sub SetText(ByVal [text] As String) If Me.TextBox1.InvokeRequired Then Dim d As New SetTextCallback(AddressOf SetText) Me.Invoke(d, New Object() {[text]}) Else Me.TextBox1.Text += [text] & vbCrLf End If End Sub 実はこの例は「方法 : Windows フォーム コントロールのスレッド セーフな呼び出しを行う」に記載されているのだが、これがまた複雑なうえ、様々なコード例があり、非常に分かり易いのだが、あえてこの部分を抜き出してみた スッキリしたかったのでR
■リストを扱う場合
Dim Fields As String() = System.IO.File.ReadAllLines(FileName) これはFileNameで示されるファイルを全て読み込んでFieldsに格納する便利なコードです 格納は行(改行)毎にされるので、データがどの位置にあるかで扱うことができます またキーを配置することで、その次のデータと連携もできます 例えば、次の様なファイルがあったとします /CMD TEST.bat これを読みこむとFields(0)には「/CMD」がFields(1)には「TEST.bat」が格納されます 格納数はFields.countで取得できるので、ForNextで回すと簡単にリストのデータが扱えるのでR
■プログラム起動時のコマンドラインを知るには?
次のコードがもっとも簡単にコマンドライン引数を得る方法であろう、TextBoxはMultiLineをTrueに設定で Dim arguments As [String]() = Environment.GetCommandLineArgs() TextBox1.Text = arguments.Count TextBox1.Text += vbCrLf For cnt = 1 To arguments.Count TextBox1.Text += arguments(cnt - 1) TextBox1.Text += vbCrLf Next このコードをボタンClickにセットして実行してみれば、いとも簡単にコマンドラインの引数を得ることが出来る デバッグ環境でコマンドラインをセットするには MyProjectの「デバッグ」項目に開始オプションがあり、そこにコマンドライン引数をセットできるのでテストも簡単に行なう事ができる
■Threadプログラムを作る
.NETによるスレッドプログラムは意外と簡単だ MSのサンプル http://msdn.microsoft.com/ja-jp/library/system.threading.thread.aspx Imports System Imports System.Threading Module Thread1 'Class ThreadExample Sub ThreadProc() Dim i As Integer For i = 0 To 9 Console.WriteLine("ThreadProc: {0}", i) Thread.Sleep(0) Next End Sub 'End Class Sub Main() Dim t As New Thread(AddressOf ThreadProc) t.Start() 'Thread.Sleep(0) Dim i As Integer For i = 1 To 4 Console.WriteLine("Main thread: Do some work.") Thread.Sleep(0) Next Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.") t.Join() Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.") Console.ReadLine() End Sub End Module Start命令でスレッドが起動する Join命令は呼び出し元をブロックする 結果は次の通り、Joinの呼び出しでブロックされるため、スレッド部分のみ動く ThreadProc: 0 Main thread: Do some work. ThreadProc: 1 Main thread: Do some work. ThreadProc: 2 Main thread: Do some work. ThreadProc: 3 Main thread: Do some work. ThreadProc: 4 Main thread: Call Join(), to wait until ThreadProc ends. ThreadProc: 5 ThreadProc: 6 ThreadProc: 7 ThreadProc: 8 ThreadProc: 9 Main thread: ThreadProc.Join has returned. Press Enter to end program.
■値の保持...その2
昨日のStringDictionaryは保持する値がStringに限定されるため普段使う際には重宝しそうだ 色々と探ってみると、これら値保持について扱うSystem.Collectionsにはオブジェクトを保持する事ができる そこで簡単な例としてHashtableを扱ってみる 次のようなオブジェクトを作成しそれを保存してみる Class MyObj Public MyName As String Public MyAge As Int16 End Class 名前と年齢という2つのデータを持つオブジェクトMyObj、これをボタン押下でHashtableに追加してみる フォームにボタン2つとテキストボックス2つを配置してコードを記載して実行だ Public Class Form1 Class MyObj Public MyName As String Public MyAge As Int16 End Class Dim openWith As New Hashtable() Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Human1 As MyObj = New MyObj Human1.MyName = TextBox1.Text Human1.MyAge = Convert.ToInt16(TextBox2.Text) openWith.Add(TextBox1.Text, Human1) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim wHuman As MyObj = openWith(TextBox1.Text) Dim wAge As Int16 = wHuman.MyAge MsgBox(wAge) End Sub End Class テキストボックス1に名前 テキストボックス2に年齢 何件か入力し、名前だけ入力してボタン2を押すと、その名前の年齢をMSGBOXされる 例によってスペースの入力時のエラーは考慮していない
■値の保持に・・・
DelphiのIndexOfNameメソッドはとても使いやすい しかも簡単でR そこで、色々と探したところ、どうも「キー=値」のリストを保持するのは.NETでは出来ないようだ これは考え方の違いなのか、VB.NETで値の保持を探すと「キー」=「値」という割付で保持するらしいことが分かる ではこの形式で保持する方法で一番簡単そうなものが、タイトルのStringDictionaryっぽい これはSystem.Collections.Specializedに有る 次がもっとも簡単であろうコードでフォームにボタン二つとテキストボックス2つを配置する Dim SD As System.Collections.Specialized.StringDictionary Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SD(TextBox1.Text) = TextBox2.Text End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SD = New System.Collections.Specialized.StringDictionary End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click MsgBox(SD(TextBox1.Text)) End Sub 空白は考慮していないのであしからず |
カレンダー
カテゴリー
フリーエリア
最新CM
最新TB
ブログ内検索
|