Visual Basic 中学校 投稿プログラム
VB2005対応 VB2008対応

 

Visual Basic 中学校 > 投稿プログラム >

DeskTopMemoVB 

投稿者:あにすさん (ブログ 貧脚レーサーのサボり日記)

「DeskTopMemoVB」は非常駐の付箋ソフトです。アプリケーションを起動していないときでも作成した付箋がデスクトップに写るという面白い発想が組み込まれています。プログラムもコンパクトながらいろいろなテクニックが凝縮されており勉強する立場としては格好の教材になります。

※アクティブデスクトップ等一部環境には対応していません。その他要件等について添付のReadme.txtを参照してください。

※壁紙の設定の方法がわからないとプログラム実行後壁紙を元に戻せません。(デスクトップのプロパティから設定する普通の方法が分かって入ればOK)

ダウンロード   DeskTopMemoVB.lzh(22.7KB)         

VB2005で作成されたソースコード。プログラマ向けです。

ソースコードを編集するためにはVB2005またはVB2008が必要です。Express Editionでも大丈夫です。

VB2008で作業すると、最初だけ変換ウィザードが実行されます。

ソースコードの改変・公開・配布は自由です。

 

V太:博士!新作プログラムが到着しました!

B子:今度のプログラムはちょっと面白いわね。そのままで実際に活用できそうだわ。

■画像1

博士:ふむふむ。デスクトップに付箋(ふせん)を貼るソフトか。確かにメモとかを貼り付けておくのに便利じゃな。

面白いのは貼った付箋がそのまま壁紙の一部になるところなんです。だから、アプリケーションを終了してもメモはデスクトップに残るんです。

■画像2

そして、一番素敵なのはVBで書かれたソースコードごと公開されているという点ね。こういうプログラムはどうやって作られているのか、上のリンクからダウンロードするだけで誰でも見ることができるなんて。

ふぉふぉふぉ。確かにそれは素晴らしいことじゃな。それじゃあそのプログラムを見てV太君とB子ちゃんはどういう感想を持ったかな?

思ったよりソースコードの量が少ないですね。

なるほど。そうかもしれんの。もちろん投稿者のあにすさんがしっかりとプログラムを書いたからこそこの量にまとまっているとも言えるぞ。

私は機能別にまとめられているのが参考になったわ。

ソリューションに含まれているファイルは次のような役割になっているみたいね。

Form1.vb タスクトレイにアイコンを表示する。アイコン経由のユーザーの指示を実行する。
FusenForm.vb 付箋1枚の機能
Settings.vb 設定の読み書き
WallpaperChanger.vb 壁紙変更機能

ほほー。なかなかよく見ておるのぉ。

これだけじゃないんです。一番素敵なのは、それぞれの機能が独立しているという点なんです。たとえば、私のプログラムの中で設定を読み書きする機能を付けようと思ったらSettings.vbがそのまま使えるんです。

その通りじゃ!プログラムはこうでなくてはのぉ。このように作っておけば、プログラムを作れば作るほど貯金がたまってどんどん効率があがっていくのじゃ。

とは言え、設定の項目はアプリケーションによって異なるから私のプログラムの中で使う場合はプロパティとして実装されている設定の項目は書き換えなければいけないんですけど…。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応
Private autoSize_ As Boolean
Public Property AutoSize() As Boolean
    Get
        Return autoSize_
    End Get
    Set(ByVal value As Boolean)
        autoSize_ = value
    End Set
End Property

■リスト1:Settings.vbから抜粋。個々の設定項目はこのようにプロパティとして実装されています。

プロパティとして設定項目を実装して読み書きしようという発想は良しとしよう。それでは、プログラムを終了したときにこの設定をどうやって保存しておくか、再びプログラムを実行したときにどうやって前回の設定を再現しているかわかるかな?

うーん。それがよくわらないです。SettingsクラスにSaveという名前のメソッドがあるから多分そこで設定を保存しているんだとは思うんですが、これどういう処理なんですか?これだけで保存できるんですか?

VB2005対応 VB2008対応
Public Shared Sub Save()
    Dim xs As New XmlSerializer(GetType(Settings))
    Using sw As New StreamWriter(settingFile)
        xs.Serialize(sw, instance_)
        sw.Close()
    End Using
End Sub

■リスト2:Settings.vbから抜粋。

なるほどのぉ。初めて見る人には不思議に見えるかも知れんのぉ。これはシリアル化やシリアライズと呼ばれる考え方を使用しておるのじゃ。具体的に言うと、現在のSettingsクラスの状態をまるごとごそっとファイルに書き込んでおるのじゃ。書き込み先のファイルはsettingFileという変数で表現されておるが、この場合はexeファイルと同じフォルダにあるSettings.xmlというファイルじゃな。

ちょっとフォルダに移動して直接Settings.xmlの中をのぞいてみようかの。

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ShowInTaskBar>true</ShowInTaskBar>
    <TopMost>true</TopMost>
    <AutoSize>true</AutoSize>
</Settings>

あら、こんなファイルが…。プロパティの値もちゃんと書きこまれているわ。

ふぉふぉふぉ。そして、次回プログラム起動時にこのxmlファイルを読んで前回の状態を復元するコードも実に簡単なのじゃ。

VB2005対応 VB2008対応
Dim xs As New XmlSerializer(GetType(Settings))
Using sr As New StreamReader(settingFile)
    instance_ = xs.Deserialize(sr)
    sr.Close()
End Using

■リスト3:Settings.vbから抜粋。変数instance_はSettingsクラス(のインスタンス)を表しています。

はぁ。こんなことできるんですね。しかも、これってどんなクラスにも使えそうじゃないですか。

このくらいのクラスならの、ただし、全部の…。

博士!同じように作ったのにだめです!!

速い!ひとの話を聞かんか!

なんでもシリアル化できるわけではないのじゃ。既定のコンストラクタを持たないクラスやArrayListの配列やインターフェースを型とするプロパティがあるとInvalidOperationExceptionが発生するし、そもそもPublicではないプロパティやフィールドも保存されないんじゃ。

博士の言っていることが難しくてよくわかりませんが、とにかく何でもシリアル化できるわけではないということを了解しました。

 

ところで、博士。Settings.vbの中に妙なコードがあるんですが・・・?

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応
Private Sub New()

End Sub

■リスト4:Settings.vbから抜粋。V太指摘の「妙な」コード

確かに妙ね。中身がないメソッドなんて。しかもこれコンストラクタよね。中身がないコンストラクタなんて何の役に立つのかしら?

消し忘れかな?

よくぞここに目をつけた!これはシングルトンという考え方を利用しているコードなのじゃ。

今度は「シングルトン」ですか。何のことでしょうか?

いや、簡単なことじゃよ。コンストラクタをPrivateにすることで、クラスをNewできないようにしているのじゃ。

それだとクラスのインスタンスが作れないんじゃないの?すべてのメンバをSharedにするのならわかるけど、そうなっていないし…。

今回の例だとクラスをインスタンス化するためには別に用意したInstanceプロパティを使うのじゃ。こうすることによってクラスのインスタンスを1つしか作れないように制御しておる。このようにクラスのインスタンスを1つしか作れないようにすること(および、そのように設計されたクラスのこと)をシングルトンと呼ぶのじゃ。

う〜ん。なんでインスタンスを1個しか作れないようにするんですか?まぁ同じ設定項目がインスタンスによって内容が違うわけもないから1個で十分とは思いますけど。

最大の理由はプログラムミスや仕様の勘違いの防止じゃ。今回だとV太が言うように、設定を複数のインスタンスで個別に管理したらおかしなことになってしまうからのぉ。これを防ぐには@インスタンスを1つしか作らないように気をつけてプログラムする か、Aインスタンスを1つしか作れないようにする のどちらかじゃ。自分で気をつける@よりはAの方が楽じゃろ。

それに、このようにシングルトンになっているのを見ただけで熟練のプログラマはだいたいの事情がわかるのじゃ。

ふーーん。Settingsクラスだけでずいぶん奥が深いですね。

 

そうじゃの。肝心の壁紙関連の機能や付箋関連の制御の話をまだしておらんの。

そうね。壁紙の制御にはWindows APIを使っているのよね。興味深いわ。

しかし、ここで一から十まで説明しても面白くないじゃろ。Settingsクラスだけでもいろいろなことが考慮されていることは分かってもらえたと思う。今回の投稿はプログラムはコンパクトじゃがいろいろな要素が凝縮されており見て理解する時間をかける価値が十分にある。ぜひ自分でその労をとってみて欲しい。

わからなかったら博士に聞いてもいいですか?

もちろんじゃ。Visual Basic 中学校の掲示板に書き込んでもよいぞ。

わからないことだけじゃなく、感想や意見などもどんどん掲示板に書いてほしい。

掲示板で質問したら博士が答えてくれるんですか?

ふーむ。それはどうかのぉ。

 

 

投稿していただいた あにすさん、ありがとうございます!

今後もみなさんからのプログラムの投稿をお待ちしています。

投稿プログラムの募集の説明はこちらです。