忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

■フォルダー監視とかって、フリーソフトを探したものだ

FileSystemWatcherってコンポーネントがアル

これってめちゃくちゃ簡単にファイルやフォルダーの監視を行なってくれる
作成、削除、リネーム等々

恐ろしく簡単に監視ができる

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FileSystemWatcher1.Path = TextBox1.Text
        FileSystemWatcher1.EnableRaisingEvents = True


    End Sub

    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed
        MsgBox("Changed:" & e.Name)
    End Sub

    Private Sub FileSystemWatcher1_Created(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Created
        MsgBox("Created:" & e.Name)
    End Sub

    Private Sub FileSystemWatcher1_Deleted(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Deleted
        MsgBox("Deleted:" & e.Name)
    End Sub

    Private Sub FileSystemWatcher1_Renamed(ByVal sender As System.Object, ByVal e As System.IO.RenamedEventArgs) Handles FileSystemWatcher1.Renamed
        MsgBox("Renamed:" & e.Name)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        FileSystemWatcher1.EnableRaisingEvents = False
    End Sub
End Class


PR
デバッグモードとリリース

プログラムを開発しているときは何かとデータ確認のために変数の中身を表示したり、ファイルに書き出すなどしてどのような値が入っているのか見ることが多々ある

debug.print というコマンドは簡単にこれを実現してくれるが、大量のデータの場合見るのが厄介だ

そこでファイル出力となるわけだが
しかし、このプログラムをリリースする時にはファイル出力のコードは削除しなければならない

各所にあればこれを削除するだけでも大変な労力を有する


そこで、条件コンパイルを行なう


条件コンパイルは、例えばDebugモードの時にはコンパイルするが、Releaseモードではそのコード自体がコンパイルされない
その為出来上がったプログラムの大きさに影響はない

次のコードは、フォームのロード中にその判定を行なっているものだ

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
#If DEBUG Then
        Label1.ForeColor = Color.Red
        Label1.Text = "現在はDebugモードで実行しています!"
#Else
        Label1.ForeColor = Color.Blue
        Label1.Text = "現在はReleaseモードで実行しています!"
#End If

    End Sub

この「#」で始まっているIF文が条件コンパイルの一つ

では、この条件はどこで設定するか?
それは「ビルド」ニューの「構成マネージャ」から設定する
ここで構成を変えればいいわけだ

My.Settingでデータ保存 はどこに保存されるか?

まず、My.Settingの設定から見てみよう
これを設定するには、ソリューションからMyProjectを開き、「設定」項目にて指定する
名前欄に設定したい項目名を、型、スコープ、値を指定する
が、これらはアプリケーションレベルでの設定となる

ユーザー設定を利用する場合の設定値は次の場所に保存される
C:\Documents and Settings\ログインユーザー名\Local Settings\Application Data\会社名\アプリ名_Url_dwrkyg2yrbwddo43qxdwco2zxv5g4jqf\1.0.0.0
(青文字部分は予想というか修正)

ファイル名はuser.config
場所の最終フォルダが1.0.0.0ということで、これはビルド名(AssemblyVersion)と考えられるので、ビルド(発行)を重ねるごとに、場所も変わるであろうことが予想つく

そして、このファイルを消せば、設定内容は初期値が利用できるのだ

それにしても C:\Documents and Settings が使われるということは、システムドライブ固定なのであろうか、レジストリよりはマシなのか・・・

プログラムのインストール、実行ではインストールフォルダを消せば綺麗にアンインストールできるのが一番シンプルで分かりやすいと思うので、これら設定ファイルもプログラムと同一フォルダのプログラム名.iniという形式が一番よかったのに、、と思う今日この頃なのだ

■アプリケーション固有の値を保存、利用する

画面の位置や背景の色など、アプリケーションを取り巻く環境は様々です
個々のアプリはそれぞれにこの値を保持して利用することができます

これは従来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が出来ないではないか?
どこに 保 存 してるんですか?いったい・・・

■スレッドから処理を依頼する安全な処理方法

    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の「デバッグ」項目に開始オプションがあり、そこにコマンドライン引数をセットできるのでテストも簡単に行なう事ができる




忍者ブログ [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:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索