VisualBasic.NET

FrontPage

  • XML Webサービスを作ってみる [#sb2f8267]

論よりソースということで、MSの10行シリーズ:http://www.microsoft.com/japan/msdn/thisweek/wednesday/default.aspが 一番わかりやすい。本当に10行で出来てしまうのだからおそろしい・・・

-Webサービスサーバー側 –http://www.microsoft.com/japan/msdn/thisweek/10lines/aspnet_webservicedev_vb.asp -クライアント側 –http://www.microsoft.com/japan/msdn/thisweek/10lines/winform_wscdev_vb.asp

こんなに簡単にできるとは・・・。 作成されたWebサービスの実体はIISで管理されているフォルダに作成されたDLLのようで、 IISがこれを読み込んでうまいことSOAPでおしゃべりしてくれるのだろう。 なんというか、XMLなんてどこにも一切でてこねえ。

  • 設定されたプリンタのプロパティーを取得する [#i4c0d5a8]

PrintDialogオブジェクトにセットしているPrintDocumentオブジェクトの DefaultPageSettingsから取得できる。例のごとくソースは検証用なので名前もデフォルトのまんまです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ‘まずプリンタ設定画面を表示 PrintDialog1.ShowDialog()

Dim sourceName As String Dim kind As String ‘設定された情報を取得(設定されている給紙トレイの情報取得) ‘PrintDocument1はPrintDialog1のDocumentプロパティーに設定してある sourceName = PrintDocument1.DefaultPageSettings.PaperSource.SourceName kind = PrintDocument1.DefaultPageSettings.PaperSource.Kind

MessageBox.Show(sourceName & Environment.NewLine & kind) & kind)

End Sub

  • 印刷してみる [#sbeeea33]

どんな風にしたら印刷できるか試してみた。ソースは適当なのでつっこまないで(笑)。 FormにPrintDocumentコントロールとテキストボックス二つ貼り付けて 以下のソースを入れてやれば動くはず。TextBox2のほうが一応見出しになります。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ‘今回はフォームに貼り付けたPrintDocumentコントロールを使用。 ‘いきなりソースからこのクラスをNewしても良い ‘(そしてAddressOfでイベントをメソッドに割り当てる) PrintDocument1.Print() End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage ‘一ページ毎にこのイベントが発生する

‘タイトル Dim titleFont As New Font("MSゴシック", 16, FontStyle.Bold) e.Graphics.DrawString(TextBox2.Text, titleFont, Brushes.Black, _ e.MarginBounds.Left, _ e.MarginBounds.Top, _ New StringFormat)

Dim printFont As New Font("MSゴシック", 10) Dim linesPerPage As Single = 0 ‘一ページに何行はいるかな? linesPerPage = _ (e.MarginBounds.Height – titleFont.GetHeight(e.Graphics)) / printFont.GetHeight(e.Graphics)

‘一ページに入るだけ印刷(としてるつもりだが、テストしてない^^;) Dim count As Integer = 0 Dim yPos As Single = 0 Do While count < linesPerPage If (TextBox1.Lines.Length – 1) < count Then ‘テキストボックスにそれ以上の行はない! Exit Do End If

yPos = (e.MarginBounds.Top + titleFont.GetHeight(e.Graphics)) + (count * printFont.GetHeight(e.Graphics)) e.Graphics.DrawString(TextBox1.Lines(count), _ printFont, Brushes.Black, _ e.MarginBounds.Left, _ yPos, _ New StringFormat) count += 1 Loop

‘一ページのみ e.HasMorePages = False

End Sub

  • EnumをシリアライズしたものはSerializationInfo.GetStringで読めてしまう [#j2f82dec]

Enum値を3つの引数をとるSerializationInfo.AddValueメソッドで シリアライズした場合、通常はGetValueで同じEnum型の変数に取り込むのだが、 SerializationInfo.GetStringでそのデータを文字列型の変数に 読み込めてしまう。 この場合読み込む文字列はEnumのメンバーの名前が入る。 本当はここで型エラーが出て欲しいのだが・・・

Private mHeader As String

Public Enum HeaderType FromHeader ToHeader SubjectHeader CCHeader End Enum

Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, _ ByVal context As System.Runtime.Serialization.StreamingContext) _ Implements System.Runtime.Serialization.ISerializable.GetObjectData ‘EnumのHeaderType型を指定してシリアライズ化 info.AddValue("Header", mHeader, GetType(HeaderType)) End Sub

Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext) Dim enu As HeaderType ‘通常は同じEnum型に取り込む enu = CType(info.GetValue("Header", GetType(HeaderType)), HeaderType)

‘String型として取り込み-そのまま取り込める mHeader = info.GetString("Header") End Sub

  • MSフリーのコントロール [#g4b74119]

-Visual Basic Power Pack – ダウンロード –http://www.gotdotnet.com/Community/Workspaces/workspace.aspx?id=167542e0-e435-4585-ae4f-c111fe60ed58 -紹介記事 –http://itpro.nikkeibp.co.jp/free/NT/NEWS/20040622/1/

NotificationWindowは使いたいなぁ・・・

  • System.Type型を取得する [#g37001a6]

引数でType型が必要なクラスは多いが、よく忘れるのでメモ。 GetType関数を使用する。C#だとtypeOfを使う。

GetType(ArgumentException)

とすると、ArgumentExceptionのSystem.Type型が取得できる

  • APIに使用する定数の値を調べる [#id45f64b]

なにかもっと他にいい方法があったら教えて欲しい。

自分はだいたい、

c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinUser.h

をエディタで開いて検索している。 他にもヘッダファイルはいっぱいあるので、これ以外の所にもいっぱい定義されているのかも。 C++は使ったことないのでよく分からないです。

  • alt + tabのタスク切り替えに表示させないようにする [#w63c475a]

フォームのFormBorderStyleをFixedToolWindowにする。ただそれだけ(笑)

  • ウィンドウをアクティブにせず開く [#uf0ca242]

一度前もって(例えばソフトの起動時とかに)フォームのShowを一回実行して Hideにしたフォームに対してWindows APIのSetWindowsPosで SWP_SHOWWINDOWを使うと一応アクティブにせずにフォームを開くことが出来ます。

Visual Basic Power Pack:http://www.gotdotnet.com/Community/Workspaces/workspace.aspx?id=167542e0-e435-4585-ae4f-c111fe60ed58の NotificationWindowでも同じようなことをしているのでそちらも参考にしてみるといいかもしれません。

なんでこうしたかというと、 -Showメソッドでは必ずアクティブな状態でフォームが表示されてしまう(=Showメソッドは使えない) -一回も表示させていないフォームに対して、SetWindowsPosのSWP_SHOWWINDOWを使ってもフォーム以外のコントロールが表示されない(のっぺらぼう状態)

C++とかやってる人はウィンドウ関連の動きはよく分かってるのかもしれませんが、 VBしかやってないとそのあたりはVBが勝手にやるのでよく分かりません。 ただ、こんな感じで細かいことをやろうとするとVB.NETでもまだ細かいウィンドウ操作はできないので APIに頼らないといけませんね。

一応APIの定義です。 http://www.bcap.co.jp/hanafusa/VBHLP/pri_form.htm を参考にさせて頂きました(ありがとうございます)

Private Declare Auto Function SetWindowPos Lib "user32" _ (ByVal hwnd As System.IntPtr, ByVal hWndInsertAfter As Integer, _ ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, _ ByVal cy As Integer, ByVal wFlags As Integer) As Integer ‘ウインドウをZオーダーの一番上に配置する Private Const HWND_TOP As Integer = 0 ‘ウインドウをウインドウリストの一番下に配置する Private Const HWND_BOTTOM As Integer = 1 ‘ウインドウをウインドウリストの一番上に配置する Private Const HWND_TOPMOST As Integer = (-1) ‘ウインドウをウインドウリストの一番上

‘Private Const HWND_NOTOPMOST = (-2) ‘ウインドウの現在のサイズを保持する Private Const SWP_NOSIZE As Integer = &H1 ‘ウインドウの現在位置を保持する Private Const SWP_NOMOVE As Integer = &H2 ‘ウインドウをアクティブにしない Private Const SWP_NOACTIVATE As Integer = &H10 ‘ウインドウを表示する Private Const SWP_SHOWWINDOW As Integer = &H40

これを

SetWindowPos(Me.Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)

みたいな感じで使います。 一度先にShowを実行してからというのが、ダサい感じがするのでもっとスマートな方法があったら教え欲しいなー(笑) 一応、Showする前にOpacityプロパティーの値を一時的に0にして、Hideして元に戻すようにすると、見た目はスマートに見えます(笑)

注意点は、SetWindowPosを使ってフォームを表示したり隠したりしても、 そのフォームのVisibleプロパティーがなんら変化しないという所です。 これは気をつけておかないと、たとえばフォームで右クリックしてポップアップメニューを出すようにしていた場合、 VBから見ると表示していないフォームで右クリックしたと見られてしまい、実行時例外になってしまいます。 どこかで表示とVisibleプロパティーを合わせておいた方が無難です (上の例だとフォームのMouseMoveイベントでVisible=Trueにするとか)

関連記事はCMの下をご覧ください