暇人おやじの暇なつぶやき
× [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 これらは、プログラム(インスタンス)毎に保存されるため、プログラム名を変更しても別の値として利用可能なのでR 出来上がったプログラムSettingSample1.exeをコピーして起動してみる SettingSample2.exeを起動すると、位置が初期値になる 保存ファイルSettingSample1.exe.configができているので、SettingSample2.exe.configもできる筈なのだが、これが見当たらない・・・ちょっと謎なのでR 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の「デバッグ」項目に開始オプションがあり、そこにコマンドライン引数をセットできるのでテストも簡単に行なう事ができる |
カレンダー
カテゴリー
フリーエリア
最新CM
最新TB
ブログ内検索
|