.NET & Win Note

主にVisual Basic .NETについてのメモ書きです。
関連するWindows関係のメモも残していきます。

2002年7月2日 19:28:02

[C#]「IMAP通信するぞ」の為の第2歩

いろいろ英語をおそれずに世界のサイトを検索してみたところ、WebRequest使わないでメールサーバーと通信するサンプルソースを見つけました。
http://www.c-sharpcorner.com/internet/Pop3Access.asp
http://www.c-sharpcorner.com/Internet/emailnotifierlc.asp

tcpclientクラスを使えばいいわけですね。
こいつはソケットをもっと簡単にしたやつなので、WindowsでAPI使って通信させたりしているのと同じ感覚で使えます。
こんな簡単な方法があるなら、これでいいじゃん(笑)
WebRequestってなんかややこしいぞ。

[ネットワーク]IMAPのRFC日本語訳

http://kame.zit.to/~obata/imap/rfc/rfc2060ja.txt
さあ、これ読みながら実装しなくては(^_^)

2002年6月17日 21:58:07

[C#]「WebRequestでIMAPと通信するぞ」の為の第一歩

IMAPサーバーに接続しようと思い、WebRequestをどうにかするんじゃないかなーと予想立ててだいぶ経ちますが、MSDNの説明見てもいまいちどう使えば良いかピンと来ず途方に暮れてたのですが、サンプル見つけました。英語でFTPを実装するサンプルですが、これでWebRequestクラスをどのように継承して使えばいいかわかりそうです。
http://www.aspalliance.com/shark/articles/FtpView/FtpViewDoc.aspx
ここからサンプルダウンロードできました。ただし、C#のソースです。
まあ、C#と言ってもVB.NETもほとんど変わらないので、分からないところはMSDN引きながら眺めれば分かると思います。
ちなみに英語です。直感でソースのダウンロードリンクは見つけてください(笑)

また、以下のページにASP.NETのサンプルがいっぱいありそうですが、上のサイトもここから見つけているので.NET自体のサンプルも見つかるんじゃないかと思います。
http://www.411asp.net/

2002年6月9日 0:18:13

[VB]ボタンとメニューで同じ機能を実行させる & 動的にイベントの動作を変える

だいたい、GUIを作った場合、画面上のボタンと同じ機能がメニューにも用意されていることは多い。
今までは機能部分を関数化し、それぞれのイベントメソッドでその関数をCall命令などで呼び出すコーディングをしていた(はずだよね?)

VB.NETの場合、それぞれのボタンやメニューのイベントをどの関数に結びつけるかをプログラマがコーディングで指定できる。
メソッド名の後ろの方にhandlesとあるので、その後ろに「コントロール名.イベント名」を入れると良い。
たとえばこんな感じ。
Private Sub QuitApp(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuit.Click, mnuEditQuit.Click

btnQuitがフォーム上の終了ボタンで、mnuEditQuitがメニューの終了の名前。イベントはClickなので、ボタンかメニューをマウスで押したときにQuitAppメソッドが実行される。
(Delphiでは、GUI上で簡単に設定できましたね ^ ^)

また、AddHandlerを使うともっと柔軟にイベントとメソッドの関連づけを行うことも出来る。
AddHandler Load, AddressOf Me.LoadEvent
とすれば、このクラスでLoadイベントが起きたときは、このクラスのLoadEventメソッドが実行されることになる。
RemoveHandlerを使うと、今度はイベントとメソッドの関連づけを消去することが出来る。
これで、イベントが起きたときの動作を動的に切り替えることが簡単に出来る。
Cで言うところの(と言ってもCは全然知らないが(笑))関数のポインタにあたる事がVBでも実現できたから、このような事が出来るのでしょう。
AddressOfというのが、まさにそれです・・・たぶんね。

2002年5月9日 2:13:52

Terrarium

.NETの技術を使ったサンプルアプリケーションで「Terrarium」というゲームがある。
ネットで「テラリウム」と検索すると、山ほど箱庭が出てくるので気をつけよう(笑)
50000番ポートをサーバーポートとして開いておく必要がある。

2002年4月22日 22:59:29

[Tool]仮想CD-ROMドライブ

一応、Windows用のツールということでここにメモ。
ISOイメージというCD-ROMの中身をそのままの状態で一つのファイルにした物がある。MSDNの会員向けのページにもこのファイル形式の物がある。
本当はこのファイルはダウンロード後にCD-Rに焼かなくてはいけないが、CDに焼くことなくハードディスクにあるISOイメージをCD-ROMに見せかけて使うことが出来るツールがある。
Deamon Toolsがフリーで良い。日本語化キットもある。
DaemonUIという上記のツールを使いやすくするツールもある。これも日本語化キットがある。

2002年4月22日 22:59:29

[VB]名前空間を変えてしまうと、以前にシリアライズしたデータは読み込めない

.NETではオブジェクトをそのままSOAP(XML形式)やバイナリ形式でファイルにして、保存するシリアライズという機能があるが、いったんこの機能でデータを保存した後、VBのプロジェクト設定でルートの名前空間を変えるとキャストエラーが出て、データが読めなくなります。
保存したデータはオブジェクトの情報ですから、途中で名前空間が変われば、読み出して元のオブジェクトに入れようと思っても型変換のエラーになるのでしょう。当然といえば当然です。

2002年4月22日 22:59:29

[VB]Visual Studio .NETはWebアプリケーションを作るのに適しているのかどうかちょっと触ってみた

よくVS.NETについての説明で一番出てくるのが「Webアプリケーションを簡単に作れる」というものだが、使ったことがなかったので試しに使ってみたが、これはかなり楽かもしれない。

Javaでは、画面はJSPを作成して、FORMタグにいろんな情報を入れてPOSTして、サーブレットはPOSTが来たときにあれやこれや・・という感じだけど、VB.NETで作る場合は、Webフォームという部品をペタっと貼り付けて、その上にテキストボックスをべたべた貼っていって、ボタンも貼り付けて、ボタンをダブルクリックして、その中にイベント処理を書いていくという、VBでローカルアプリを作っている感覚で、とりあえず簡単なことは出来てしまう。
「こんなんで動くのかよ」と思ったが、コンパイルするとブラウザが立ち上がって、作ったとおりにまるでイベントドリブンで動いてるかのような動きをする。正直驚きです。
おそらくC#でも同じような形でWebアプリケーションが作られるのではないかなと思う。
ちなみに、ASP.NETでは、aspxというファイルがその実態で、VBの文法で作られたWebアプリもコンパイルするとaspxのファイルになります。

[.NET].NET Frameworkのクラスライブラリドキュメントの見方

慣れてないからかもしれませんが(Java Docも最初はさっぱり読めなかったし)、.NET Frameworkeのクラスライブラリのドキュメントは見ても、実際の使い方、実装方法が結構分かりづらい。今までのヘルプのようにサンプルコードもない(言語依存しないからだろうが)ので、このドキュメントを見ただけではさっぱりです。
でも、最近やっと見方が分かってきました。
ポイントは、継承元がある場合はそのドキュメントも読むことかと思います。
目的の機能を持ってそうなクラスを見つけても、「値はどこにセットすればいいのか?」とか「どのメソッドを呼び出せばいいか?」という疑問が生まれる場合は、だいたい親のクラスのドキュメントにそれにあたるメソッドやプロパティーの説明が記述されています(よく考えれば、基本の機能は親が持ってるはずですから、当たり前ですが)。

[VB]DLLの作り方

他にも方法はあるかもしれませんが、プロジェクト作成の時に「クラスライブラリ」を選ぶと、コンパイルするとプロジェクトのフォルダのbinの中にDLLができあがります。プロジェクトのプロパティーの中に「名前空間」を設定する場所があるので、そこも気をつけておきましょう。

[VB]クラスライブラリで作成したDLLの呼び出し方

まず、参照設定します。プロジェクトのタブを選んで、作成したDLLのプロジェクトを選んで[選択]を押して、OKを押します。
呼び出すときは、普通にクラスを呼び出す時と同じですが、DLLのプロジェクトのプロパティーに設定した名前空間が関係します。名前空間を「test」、クラス名を「abc」していて、その中に「hello」というメソッドがあるならば、
Dim a as New test.abc()
abc.hello()
という感じで呼び出せます。
いまいち、名前空間の設定とか理解できていないので、無駄はあるかもしれませんが、これで一応呼び出せます。

[VB]インターフェイスの実装

VB6とはインターフェイスの実装方法が変わっています。
クラスの宣言の所に
Public Class ImapWebRequestCreator
Implements IWebRequestCreate
といった感じで書くのは前と似ていますが、実装しないといけないメソッドにも特別な記述が必要です。

Function Create(ByVal uri As Uri) As WebRequest Implements IWebRequestCreate.Create

このようにメソッド名の後にもImplementsとして、どのメソッドを実装しているのかを明示しないといけません。
ヘルプにも説明は書いてあります。(VS.NET入れている人だけリンク可)

・・・ちゅーかわざわざ入力しなくても、左上のコンボから選択すれば勝手に正しいメソッド出来ちゃうみたい。

2002年4月17日 23:50:39

[VB]暗黙的型変換

たとえば、
Dim Code As String
Dim OldCode As Long

Code = "123"
OldCode = 123

If Code = OldCode Then
   Msgbox("あってるよ")
end if
このようなソース。
これはコンパイルして実行すると、「あってるよ」というメッセージが表示されます。
一般的にプログラムの世界で考えると文字列型のCodeと数値型のOldCodeを比較してしまうのは間違いです。
ただ、これが通ってしまうのは、裏で勝手にVBが型を変換しているからです(どっちに合わせられるかは知らないけど)
これを暗黙的型変換と言うようです。

「こりゃ便利だ」とは思えません。
Codeに数字だけ入っているときはいいですが、「A110」などのように数値以外の物が入ってしまった場合は、実行すると
「型が一致しません」というエラーと共にプログラムは終了です。
こういうコードを書いてしまって、デバッグの時にはコードだということで、数値を入力してテストして、問題ないのでリリースしてみたら客先でエラーが発生・・・なんて事故の元になりかねないです
(というか、実際この現象が起き、原因を探るのが大変でした。結局、現地まで飛行機で出張して現地のデータを使ってデバッガー上でプログラムを動かして初めて気づきました。マスターのコードを保持する変数で、片方の変数が数値型で、もう片方が文字列型で、数値型の方に「たまたま」英文字が入っていたのでエラーになっていました。まあ、前任者が作ったソースで自分の責ではなかったんですけどね(^_^))

だいたい、こんな危険なコードがコンパイルを通ってしまうんだ、とVBの型の曖昧な扱いに頭に来たのですが、.NETでは型チェックでビルドというのがメニューに増えてますね(VB6であるかどうか不明。あるなら使いたいが)。
あと、プロジェクトの設定で「Option Strict」をOnにすると、暗黙的な型変換を禁止してコンパイル時にエラーを出してくれます。
こういうバグを含んだプログラムを作る危険を冒すよりは、面倒でも自分で明示的に変換をかけてあげた方が良いでしょう。

2002年4月10日 1:20:56

[VB]WebRequestの説明

..NET Frameworkの説明を見てもサンプルがないので、さっぱり。
まだ、ドキュメントが整備されていないみたいで、ネットや英語ページをあさるのが良いみたい。
Javaで作ってたメールチェッカーが.NETで作れないかなと思ってWebRequestというクラスが近いみたいなので、ネットで探してみた。
http://www.microsoft.com/japan/developer/net/framework/pdc_websvc.asp
たぶん、IMAPは自分でRFC見ながら実装するしかないんだろうな・・・(SMTPは標準である)

2002年3月27日 23:21:10

[VB]名前付け規則

関数とか変数の名前の付け方は結構迷うところだけど、だいたい決まりをベンダーが決めてます。
Javaなんかではメソッド名はdoNext()といった感じで最初は小文字ではじめます。変数はvalueという感じで全部小文字ですね。
クラス名はMailDataのように単語の最初は大文字です。

VBだとどうなるのか?
関数は最初に動詞が来ますね。クラスとプロパティー名は名詞からです。
他にもいろいろMSが推奨している名前の付け方があるので、ヘルプで探してみると良いでしょう。

こんなプロジェクトもあります。

2002年3月26日 23:35:13

[VB]継承しようとすると、「ステートメントの終わりを指定してください」

やっぱ、VBでも継承が使えるようになったと言うことで、さっそく使ってみたところ、表題のエラーが発生してコンパイルすら出来ない。

Public Class Class1
    クラスの中身
End Class

Public Class
Class2 Inherits Class1
   クラスの中身
End Class

これでは、表題のエラーでコンパイルできません。なぜ?

Public Class Class1
    クラスの中身
End Class

Public Class
Class2←ここで絶対改行
   
Inherits Class1
   クラスの中身
End Class

どうやら、このようにクラス名の後は必ず改行してから、継承を表す「Inherits」をつけないといけないようです。
Inheritsが青文字で表示されたのでOKだと思ったんですけどね。

[VB]継承を使ったポリモーフィズムの実現

修正版
最近、検索サイトから飛んでこられる方が多いので見直していたところ未完成の物をアップしていたのに気づきましたm(__)m。

[VB]フォームもコードから生成されている

今までも裏でコードらしきものは生成されてたみたいだけど、今回はもろにコードとして表示されてます。
JBuilderでフォームを作ったらコードが自動的に生成されているのと同じような感覚です。
元々、フォームはオブジェクトでしたが、今回の.NETでは他のクラスと同じような形でフォームが表現されてます。
Public Class Form1
        Inherits System.Windows.Forms.Form
こんな感じで、フォームのコードを見ると他のクラスの記述と同じです。
System.Windows.Forms.Formというクラスを継承してVBのフォームは出来ているみたいです。
C++のウィンドウの作り方と似てますね(あんまC++は知りませんが)。
たぶん、この親クラスが.NET FrameWorkで用意されているクラスライブラリだと思います(言葉の使い方合ってるかな?)
なんか、Javaのクラスライブラリと同じような感じですね。