''' <summary>
''' カスタム構成セクションハンドラ
''' ※.NET1.1以前で使用可能。
''' .NET2.0以降ではSystem.Configuration.ConfigurationSectionクラスを推奨
''' </summary>
''' <remarks></remarks>
Public Class MyCustomConfigHandler1_1
Implements System.Configuration.IConfigurationSectionHandler
''' <summary>
''' 構成セクションハンドラを作成する。
''' </summary>
''' <param name="parent">親オブジェクト</param>
''' <param name="configContext">構成コンテキストオブジェクト</param>
''' <param name="section">セクションXMLノード</param>
''' <returns>作成されたセクションハンドラオブジェクト</returns>
''' <remarks></remarks>
Public Function Create( _
ByVal parent As Object, _
ByVal configContext As Object, _
ByVal section As System.Xml.XmlNode) As Object _
Implements _
System.Configuration.IConfigurationSectionHandler.Create
Dim configTable As New Hashtable()
For Each areaNode As XmlNode In section.ChildNodes
For Each prefNode As XmlNode In areaNode.ChildNodes
configTable.Add( _
prefNode.Attributes("Name").Value, _
prefNode.Attributes("MajorCity").Value)
Next
Next
'取得した構成情報をメッセージボックスに表示
Dim sb As New StringBuilder()
For Each k As String In configTable.Keys
sb.Append(k & ":" & configTable(k).ToString() & vbCrLf)
Next
MessageBox.Show(sb.ToString())
・CDO(Microsoft Collaboration Data Objects)
Windowsでは、メールの送信機能として『CDO』を用意しています。
CDOは、VB6やEXCEL VBA等からも利用することができますが、
インタフェースがわかりにくいものでした。
.NETでは、CDOの呼び出しをカプセル化することで、
よりわかりやすいインタフェースを提供しています。
・参考文献
『MSDN Library for VisualStudio2008日本語版』
以下にサンプルソースを示します
''' <summary>
''' メールを送信する
''' </summary>
''' <param name="argSmtpServer">SMTPサーバ名</param>
''' <param name="argPortNo">ポート番号</param>
''' <param name="argSmtpAuth">SMTP認証の有無</param>
''' <param name="argUserName">認証ユーザ</param>
''' <param name="argPassword">認証パスワード</param>
''' <param name="argEnableSsl">SSLの使用有無</param>
''' <param name="argTimeout">タイムアウト(ミリ秒)(Nothingで100000)</param>
''' <param name="argFrom">メールアドレス(From)</param>
''' <param name="argTo">メールアドレス(To)</param>
''' <param name="argCc">メールアドレス(Cc)</param>
''' <param name="argBcc">メールアドレス(Bcc)</param>
''' <param name="argPriority">優先度</param>
''' <param name="argSubject">件名</param>
''' <param name="argBody">本文</param>
''' <param name="argIsHtml">HTMLかどうか</param>
''' <param name="argFile">添付ファイル</param>
''' <param name="argSubEnc">エンコード(件名)</param>
''' <param name="argBodyEnc">エンコード(本文)</param>
''' <remarks></remarks>
Private Sub SendMail( _
ByVal argSmtpServer As String, _
ByVal argPortNo As Integer, _
ByVal argSmtpAuth As Boolean, _
ByVal argUserName As String, _
ByVal argPassword As String, _
ByVal argEnableSsl As Boolean, _
ByVal argTimeout As Integer?, _
ByVal argFrom As String, _
ByVal argTo() As String, _
ByVal argCc() As String, _
ByVal argBcc() As String, _
ByVal argPriority As System.Net.Mail.MailPriority, _
ByVal argSubject As String, _
ByVal argBody As String, _
ByVal argIsHtml As Boolean, _
ByVal argFile() As System.IO.FileInfo, _
ByVal argSubEnc As String, _
ByVal argBodyEnc As String _
)
'SMTPサーバを設定
'※サーバ名、ポート番号を設定
Dim sClient As New System.Net.Mail.SmtpClient( _
argSmtpServer, argPortNo _
)
'SMTP認証の設定
If argSmtpAuth Then
'認証が必要な場合は、ユーザ名とパスワードを設定
sClient.Credentials = New System.Net.NetworkCredential( _
argUserName, argPassword _
)
End If
'SSLの使用有無を設定
sClient.EnableSsl = argEnableSsl
'タイムアウトを設定
If argTimeout.HasValue Then
sClient.Timeout = argTimeout
End If
'メールの設定
Dim mail As New System.Net.Mail.MailMessage
Try
'メールアドレス(From)
mail.From = New System.Net.Mail.MailAddress(argFrom)
'※メールアドレス(To)を設定
If Not (argTo Is Nothing) Then
For Each addr As String In argTo
mail.To.Add(addr)
Next
End If
'メールアドレス(Cc)
If Not (argCc Is Nothing) Then
For Each addr As String In argCc
mail.CC.Add(addr)
Next
End If
'メールアドレス(Bcc)
If Not (argBcc Is Nothing) Then
For Each addr As String In argBcc
mail.Bcc.Add(addr)
Next
End If
'優先度
' 高い:System.Net.Mail.MailPriority.High
' 普通:System.Net.Mail.MailPriority.Normal
' 低い:System.Net.Mail.MailPriority.Low
mail.Priority = argPriority
'件名を設定
mail.Subject = argSubject
'本文を設定
mail.Body = argBody
'本文をHTML形式にするかどうか
mail.IsBodyHtml = argIsHtml
'添付ファイル
If Not (argFile Is Nothing) Then
For Each f As FileInfo In argFile
mail.Attachments.Add( _
New System.Net.Mail.Attachment(f.FullName))
Next
End If
'エンコード(件名)
'例:shift_jis、iso-2022-jp
mail.SubjectEncoding = Encoding.GetEncoding(argSubEnc)
'エンコード(本文)
mail.BodyEncoding = Encoding.GetEncoding(argBodyEnc)
'メールを送信
sClient.Send(mail)
Finally
mail.Dispose()
End Try
End Sub
''' <summary>
''' 関数(y=f(x))のデリゲート
''' </summary>
''' <param name="x">入力</param>
''' <returns>出力</returns>
''' <remarks></remarks>
Public Delegate Function FuncHandler(ByVal x As Integer) As Integer
''' <summary>
''' 関数(y=f(x))のグラフをイメージに描画する。
''' </summary>
''' <param name="targetImage">描画対象のイメージ</param>
''' <param name="fnc">関数(y=f(x))</param>
''' <param name="xFrom">X座標の最小値</param>
''' <param name="xTo">X座標の最大値</param>
''' <remarks></remarks>
Public Shared Sub DrawFunction( _
ByVal targetImage As Image, ByVal fnc As FuncHandler, _
ByVal xFrom As Integer, ByVal xTo As Integer)
'描画領域の原点を中央に移動
Dim xMax As Integer = targetImage.Width * 0.5
Dim xMin As Integer = -1 * xMax
Dim yMax As Integer = targetImage.Height * 0.5
Dim yMin As Integer = -1 * yMax
g.TranslateTransform(xMax, yMax)
'描画領域のY座標の向きを逆にする(Y座標の上方向をプラスにする)
g.ScaleTransform(1, -1)
'格子を描画する(水平線)
For y As Single = 0 To yMax Step 10
g.DrawLine(Pens.Cyan, xMin, y, xMax, y)
Next
For y As Single = 0 To yMin Step -10
g.DrawLine(Pens.Cyan, xMin, y, xMax, y)
Next
'格子を描画する(垂直線)
For x As Single = 0 To xMax Step 10
g.DrawLine(Pens.Cyan, x, yMin, x, yMax)
Next
For x As Single = 0 To xMin Step -10
g.DrawLine(Pens.Cyan, x, yMin, x, yMax)
Next
'関数のグラフを描画
For x As Integer = xFrom To xTo
Try
g.DrawLine( _
Pens.Black, x - 1, _
fnc.Invoke(x - 1), x, fnc.Invoke(x))
Catch ex As ArithmeticException
'ゼロ除算、数値演算のオーバーフロー、
'定義されていない演算エラーは無視する
End Try
Next
Finally
If Not (g Is Nothing) Then
g.Dispose()
End If
End Try
End Sub
''' <summary>
''' 関数(一次関数)
''' </summary>
''' <param name="x">入力</param>
''' <returns>出力</returns>
''' <remarks></remarks>
Public Function fnc1(ByVal x As Integer) As Integer
Return x * 2
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim img As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
'関数の参照をデリゲート変数に格納する
'※関数を変更する場合は、デリゲート変数の中身を変更する。
Dim f As New FuncHandler(AddressOf Me.fnc1)
'関数のグラフを描画する。
DrawFunction(img, f, img.Width * -0.5, img.Width * 0.5)
''' <summary>
''' 関数(二次関数)
''' </summary>
''' <param name="x">入力</param>
''' <returns>出力</returns>
''' <remarks></remarks>
Public Function fnc1(ByVal x As Integer) As Integer
Return 0.05 * (x - 10) * (x + 50)
End Function
''' <summary>
''' 関数(三角関数)
''' </summary>
''' <param name="x">入力</param>
''' <returns>出力</returns>
''' <remarks></remarks>
Public Function fnc1(ByVal x As Integer) As Integer
Return 50 * Math.Sin(x / 15)
End Function
[VB.NET]関数を三角関数で定義した場合
実行結果(4)PictureBoxに、平方根の関数のグラフを描画する例
・平方根の関数も同様です。
''' <summary>
''' 関数(平方根)
''' </summary>
''' <param name="x">入力</param>
''' <returns>出力</returns>
''' <remarks></remarks>
Public Function fnc1(ByVal x As Integer) As Integer
Return 10 * Math.Sqrt(x)
End Function