Simpleware Blog

シンプルウェア株式会社のブログです。
<< VisualStudio2012で作成するiTextSharpアプリケーション(1) | main |
VisualStudio2012で作成するiTextSharpアプリケーション(2)

 今回は2回目ということで、前回の続きです。
 前回を読んでいない方は「VisualStudio2012で作成するiTextSharpアプリケーション(1)」を参照ください。
LOG出力ツールlog4netを組み込み、メニューフォームのコーディングを整えて、さらに、メニューからのフォーム呼び出しともどりなど行う予定です。

2.業務アプリケーションの基本コーディング作成

(1)log4netの追加

 業務アプリケーションの作成過程では、時として、というより頻繁に思った通りの動きをしない、または思った通りの表示をしない、などと、プログラム中の値の確認や、ロジックの流れを確認する必要があるので、プログラム進行に合わせてポイントポイントで状況をファイル(ログファイル)に出しておくようにします。
 そのためのツールとして依頼元のプロジェクトでは、だいたい「log4net」を使っていますので、その組み込みを行います。
 まず、「App」と同じ階層にlog4netのDLLファイルなどの、外部ライブラリ保管用のフォルダ「Lib」と、各種設定ファイルなどを保管するためのフォルダ「Config」を作成します。

フォルダ作成←こんな感じ

log4netは、ここからDownLoadできます。ネット上に情報はあるので適当に検索してみてください。DownLoadするファイルは、oldkey.zipです。
 DownLoadしたファイルを適当なフォルダに解凍し、「bin」-「net」フォルダ内の「2.0」以下にある「log4net.dll」ファイルを使います。これがFramework2.0用ということです。違うバージョンを使っている場合はそれを使用ください。
 このDLLファイルを先ほど作った「Lib」フォルダに追加します。フォルダ名右クリックで「追加」-「既存の項目」で追加します。

log4net.dll追加←こうなります。

 Libフォルダに追加したのは、あくまでも、このプロジェクトで使用する外部ライブラリをこのフォルダで一元管理するためです。
 実際に使用できるようにするために、「参照設定」に追加します。
 その前に、log4net.dllを選択しプロパティの「出力ディレクトリにコピー」の項目を「常にコピーする」に変更するのを忘れずに。そうしないと、参照設定しても、実行時の「bin」ディレクトリにコピーされないので参照ファイルが無いエラーになります。
 プロジェクト名右クリックで「プロパティ」選択でプロパティを表示し、「参照」タグを選択し、「追加」ボタン押下でlog4net.dllを追加します。

log4net.dllの参照設定←こんな感じ

 ログの形式や保管場所などについて記述する構成ファイルが必要なので、作成するのですが、その辺は「オープンソースのロギング・サービス「log4net」を使う」に詳しく記載されていますので、参照ください。
 ただし、この解説では、設定を「アプリケーション構成ファイル」というXMLファイルに記載するようになっているのですが、私の委託先などは、Javaと同じく専用の構成ファイルを作成して記述していますので、そちらに合わせます。
 先に作成した「Config」フォルダを「右クリック-追加-新しい項目」で、「XMLファイル」を選択し、カラのXMLファイルを作成します。
 ファイル名は「log4net.Config.xml」です。何でもよいでしょうけど。DLLと同じようにプロパティで「常にコピーする」としておくことを忘れずに。

内容は以下の1行だけで作成されます。

<?xml version="1.0" encoding="utf-8" ?>

 次に、このファイルがlog4netの設定ファイルですよと認識させるために、ソリューション・エクスプローラから「My Project」の項目を展開して「AssemblyInfo.vb」ファイルを開きます。「すべてのファイルを表示」にしていないと見えていないのでご注意を。
 ファイルの最後に以下の記述を追加し、設定ファイル名称を明示します。

「AssemblyInfo.vb」への追加内容

'log4net設定ファイル情報
<Assembly: log4net.Config.XmlConfigurator(ConfigFile:="./Config/log4net.Config.xml", Watch:=True)>
AssemblyInfo.vb内容←AssemblyInfo.vb内容

(2)log4net設定ファイルの設定内容

 先ほど作成した「log4net.Config.xml」ファイルに設定を追加してみます。
 細かい設定は、アットマーク・アイティさんの「オープンソースのロギング・サービス「log4net」を使う」が非常に参考になりますので、そちらを参照するとして、実際の業務系アプリでは、「log4net.Appender.RollingFileAppender」というサイクリックなログファイル作成を使うことが多ので、その設定を以下のように記述します。
 なお、ログファイルの場所と名称は「File」パラメータで「./Log/log4net.log」とします。実行ファイルができるフォルダの「Log」フォルダに作成されます。


  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="./Log/log4net.log" /> 
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="composite" />
      <param name="StaticLogFileName"  value="True" />
      <param name="MaxSizeRollBackups" value="30" />
      <param name="MaximumFileSize"    value="1000KB" />
      <param name="DatePattern"        value="yyyy-MM-dd"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %C %M - %m%n" />
      </layout>
    </appender>

 ここでは、出力内容を指定する「ConversionPattern」で、以下のものを指定指定しています。

  • %d:日付時刻
  • %t:スレッドID(VB.netではあまり必要ないと思うけどつけている事例多数)
  • %p:ログレベル(-5指定で5文字固定で表示する)
  • %C:クラス名(vb.netではだいたいフォーム名、小文字のcでも同じ)
  • %M:メソッド名(vb.netではだいたいイベント名)
  • %m:メッセージ(自分で指定したメッセージ)
  • %n:改行

 VisualStudioでデバッグする際に、「出力」ウインドウにもログを出しておくと、いちいちログファイルを開かなくてよいので、その記述も以下のように追加しておきます。


<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
   <layout type="log4net.Layout.PatternLayout">
       <param name="ConversionPattern" value="%d [%t] %-5p %C %M - %m%n" />
   </layout>
</appender>

 最後にroot要素で出力するログレベルと使用するアペンダ名を指定します。
 ログレベルはデバッグ中は「ALL」か「DEBUG」でリリース後は「INFO」が多いと思います。


<root>
  <level value="ALL" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="RollingFileAppender" />
</root>

 全体は以下の感じです。

log4net.Config.xmlの内容log4net.Config.xmlの内容

(3)メニューフォームのコーディング

 以上でlog4net利用の準備が終了です。
 さっそくメニューフォームで、コーディングの基本形を作りながらLOG出力を利用してみます。
 フォームコーディングの内容はだいたい以下のような構成が多いと思います。

  • ヘッダーコメント:プログラムの基本情報メモ
  • 変数設定:フォーム内で使用する変数の定義
  • 共通設定:ほぼすべてのフォームで使用する部分を記述
  • 初期設定:初期設定や初期表示などのフォーム表示前に行う部分
  • イベント:ボタンクリックなどのイベント処理を記述する部分
  • 関数:フォーム内で使用する関数群を記述する部分

 そのほかには、データベースを使用する定義部分や印刷関係などありますが、今回は上記でOKかと思います。


・ヘッダーコメント

 仕事上は以下の感じが多いかと。ただし、履歴がメンテされているかというと。。私も忘れます。


'************************************************
' プロジェクト名       : PDF操作
' プログラム名         : メニュー画面
' フォーム名           : Frm_MainMenu
' 概要              : メニューです。
' 作成                : Simpleware
' 履歴
' 2013.05.22    T.Hosaka    :新規作成
'***********************************************

・お約束コーディング

 ヘッダーコメントの次に以下の内容は必須で記述しています。


Option Explicit On
Option Strict On
'import
Imports System.Data.Common
Imports System.Collections
Imports System.Resources
Imports System.Text
'ファイルIO関連の名前空間
Imports System.IO
Imports System.Diagnostics

・変数設定

 変数設定のエリアをとりあえず「Region」で囲っておきます。


#Region "変数設定"

#End Region

・共通設定

 だいたいのフォームで共通にしておくほうが都合がよいイベントや設定をここで記述します。以下の内容が多い。

  • log4netの定義:言わずもがな
  • フォームLoadイベント:初期処理の関数のみ定義しておく(表示前)
  • フォームShowイベント:フォームLoad後の処理(必要な時)
  • フォームClosingイベント:フォームが閉じるときの処理

 log4netの定義

Private Shadows _log As log4net.ILog = _
            log4net.LogManager.GetLogger( _
                System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

 フォームLoadイベントの定義。
 ここには関数名のみを定義し、実際の初期処理はその関数内に定義する。
 通常、FormLoadイベントを追加すると、sub名はそのフォーム名になるのですが、ここはあえてその名称を汎用的な「Frm_FormLoad」に変更して、他フォームへもコピペして違和感無いようにしています。そんなことしなくともとも問題ないですが。

Private Sub Frm_FormLoad(sender As Object, e As EventArgs) Handles Me.Load

     Call Me.Init()  '初期化処理

End Sub

 FormClosing、FormShownイベントの定義。
 ここでlog4netによるログ書き込みテストを兼ねて、起動、終了メッセージを書いてみます。

Private Sub Frm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
     _log.Info("システム 終了")
 End Sub

Private Sub Frm_FormShown(sender As Object, e As EventArgs) Handles Me.Shown
     _log.Debug("システム 開始")
     _log.Info("システム 開始")
     _log.Error("システム 開始")
     _log.Fatal("システム 開始")
 End Sub


・初期設定

 フォームロード時の各種初期処理を記述する。いまは特にないのでRegionで囲って、FormLoadで記述した初期化関数のみカラで定義しておく。


#Region "初期設定"

        ''' 
        ''' 初期設定
        ''' 
        ''' Loadイベントから呼び出し
        Private Sub Init()
            'フォームLoad時の各種初期化処理を記述する


        End Sub

#End Region

 イベント記述の前に、まだメニューフォームに何もボタンを配置していないので、PDF機能実装のためのフォームへ飛ぶボタン(BtnBookMarkGet)と終了ボタン(BtnEnd)を配置します。

ボタン配置ボタン配置
・イベント

 ここではボタンクリックなどのイベント処理を記述します。
 上記のボタンをクリックすると、それぞれクリックイベントが実装されますので、それを「#Region "ボタン" #End Region」で囲って、まとめます。以下の感じ。

 イベント実装

#Region "イベント"

#Region "ボタン"

   Private Sub BtnBookMarkGet_Click(sender As Object, e As EventArgs) Handles BtnBookMarkGet.Click

       'フォーム表示

   End Sub

   Private Sub BtnEnd_Click(sender As Object, e As EventArgs) Handles BtnEnd.Click
       Me.Close()
   End Sub

#End Region

#End Region

(4)ビルドプラットフォームの指定

 VisualStudioでは、ビルド時のプラットフォームはデフォルトでは「AnyCPU」となっています。このままでも、最新のWindows7やWindows8で外部モジュールを使用しない場合は問題ないのですが、古い環境で動かすとか、WindowsXP時代の外部モジュールを使用するときなどは、うまく動かないケースがあります。実際、AcrobatSDKを使ったときにそうなりました。なので、明示的に「X86(32ビット)」にしておきます。私は。
 方法は、メニューの「ビルド」-「構成マネージャ」で新規で「X86」を作成して指定します。

構成マネージャ構成マネージャ
「X86」追加「X86」追加
「X86」設定「X86」設定

 構成マネージャが表示されていない場合は、「ツール」-「オプション」で「プロジェクトおよびソリューション」-「全般」の「ビルド構成の詳細を表示」にチェックを入れると出てきます。

(5)メニュー実行とログの確認

 ここで、開始ボタンで実行すると、メニューが表示され、「終了ボタン」または「X(バツボタン)」で終了できます。
 そして、実行ディレクトリ(SimplewareSolution-PdfProject-PdfProject-bin-x86-Debug)内の「Log」フォルダにログファイルができていると思います。

 ログ内容

2013-05-25 10:48:39,940 [9] DEBUG      App.Form.Frm_MainMenu Frm_FormShown - システム 開始
2013-05-25 10:48:39,956 [9] INFO       App.Form.Frm_MainMenu Frm_FormShown - システム 開始
2013-05-25 10:48:39,956 [9] ERROR      App.Form.Frm_MainMenu Frm_FormShown - システム 開始
2013-05-25 10:48:39,956 [9] FATAL      App.Form.Frm_MainMenu Frm_FormShown - システム 開始
2013-05-25 10:48:41,345 [9] INFO       App.Form.Frm_MainMenu Frm_FormClosing - システム 終了

(6)フォームの移動

 PDF機能を実装するフォームを、メニューーから呼び出し、またメニューに戻る、という動作を実装してみます。業務アプリは結構、呼び出した順番で戻る、という仕様が大半なので、いわゆる「モーダル」となります。
 まず、itextSharpを使用したアプリの手始めとして、PDFのしおり(Bookmark)を取得する機能を作成します。そのために、「Form」フォルダ内に「BookMark」フォルダを作ります。そしてそこに「Frm_BookMarkGet.vb」というフォームを作成します。この時に、Namespace「App.Form」追加を忘れずに。「Frm_BookMarkGet.vb」と「Frm_BookMarkGet.Designer.vb」両方共です。
 そして、「Frm_BookMarkGet.Designer.vb」ファイルを開いて、「Dispose」関数内に「Call Me.Owner.Show() 」を追加します。
 これによって、呼び出し元(Owner)のフォームを再表示できるようになります。

Call Ownerの追加Call Ownerの追加

 そんでもって、メニューフォームのボタンイベントの「BtnBookMarkGet_Click」に以下のコードを実装します。これで、呼び出すときに、メニューフォームがOwnerとなり、メニューが非表示でしおり機能フォームを呼び出します。しおり機能フォームが閉じるときに「Dispose」関数が動いて、メニューを表示するということです。

Private Sub BtnBookMarkGet_Click(sender As Object, e As EventArgs) Handles BtnBookMarkGet.Click

    'フォーム表示
    My.Forms.Frm_BookMarkGet.Show(Me)
    Me.Hide()   '自分自身を非表示にする。

End Sub

(7)今回のまとめ

 息切れです。とりあえず2時間を目安にしてるので時間切れです。
 今回は、log4netを組み込んで、メニューフォームのコーディングを行い、ログ出力をテストして、フォーム呼び出しの基本を作りました。
 なかなかiTextSharp実装まで行きませんが、次回は、iTextSharpの実装ができると思います。
では。

以上

| ソフトウェア開発 | 14:47 | comments(1) | trackbacks(0) | - | - |
これからドットネットでの開発をしなければならず、丁度iTextSharpの使い方等を調べていて辿り着きました。

プロジェクト構成やログの取り方等、大変勉強になりました。
PDF関連が次回実装予定のようですので、是非続きを御願い致します。

| 超初心者 | 2014/10/02 9:48 AM |










http://blog.simpleware.jp/trackback/29
    123
45678910
11121314151617
18192021222324
25262728293031
<< March 2018 >>
+ RECOMMEND
PHILIPS Fidelio/フィデリオ 【寝室にぴったりな一台】ドッキングスピーカー DS1100
PHILIPS Fidelio/フィデリオ 【寝室にぴったりな一台】ドッキングスピーカー DS1100 (JUGEMレビュー »)

目覚ましとiPhone4s充電スピーカとして購入。
なかなかよい感じ。アプリ連動あるし。
+ RECOMMEND
Apple Apple TV MC572J/A
Apple Apple TV MC572J/A (JUGEMレビュー »)

いまさらですが、これで、月1回程度映画レンタルしてます。また、インターネットラジオも。よいと思います。
+ RECOMMEND
日本電気 モバイルWiMAXルータ AtermWM3500R マーズレッド PA-WM3500R(AT)R
日本電気 モバイルWiMAXルータ AtermWM3500R マーズレッド PA-WM3500R(AT)R (JUGEMレビュー »)

今月契約して使い始めてます。チューニングしないと安定しませんが、そこそこでしょう。出張に都内で使う前提なので問題ないです。
+ RECOMMEND
ML110 G6 BM101A Xeon X3430 2.4GHz メモリ1GB DVD-ROM HDDレス OS無し
ML110 G6 BM101A Xeon X3430 2.4GHz メモリ1GB DVD-ROM HDDレス OS無し (JUGEMレビュー »)

ほぼ1ヶ月使用してます。RAID0の書き込みは遅いけど、コストパフォーマンスは上々です。
+ RECOMMEND
TWINBIRD LINK ZABADY 10型 防水ワイヤレスモニター VW-J107W ホワイト
TWINBIRD LINK ZABADY 10型 防水ワイヤレスモニター VW-J107W ホワイト (JUGEMレビュー »)

チューナ機能はないですが、TVやDVDと接続してお風呂で見られます。良いです。
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ CATEGORIES
+ ARCHIVES
+ MOBILE
qrcode
+ LINKS
+ PROFILE
+ OTHERS
このページの先頭へ