忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
×

[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

これらは、プログラム(インスタンス)毎に保存されるため、プログラム名を変更しても別の値として利用可能なので

出来上がったプログラムSettingSample1.exeをコピーして起動してみる
SettingSample2.exeを起動すると、位置が初期値になる
保存ファイルSettingSample1.exe.configができているので、SettingSample2.exe.configもできる筈なのだが、これが見当たらない・・・ちょっと謎なので
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

空白は考慮していないのであしからず



忍者ブログ [PR]
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索