チュートリアル : COBOL での Windows フォームの作成

このチュートリアルでは、付属する Book プログラムのような既存の COBOL プログラムと連動する Windows フォームを作成する方法を示します。

この章の内容

概要

このチュートリアルでは、Windows フォームの作成方法と、この Windows フォームを既存の COBOL プログラムと相互に動作させる方法を示します。フォームはマネージ COBOL で生成されます。フォームは、.NET データ型を COBOL データ形式にマッピングするための中間プログラムを呼び出します。中間プログラムは、ビジネスロジックを実行するための既存の COBOL プログラムを呼び出します。

このソリューションには、次の 3 つのプログラムがあります。

前提条件

このチュートリアルを始める前に、以下の手順に従って WinBook例題の一部として提供されている BookWrapper と LegacyBook プロジェクトをビルドしておく必要があります:

  1. Visual Studioを起動します。
  2. ファイル > 開く > プロジェクト/ソリューション をクリックします。
  3. samplesディレクトリ C:\Users\Public\Documents\Micro Focus\Visual COBOL 2010\Samples の下の \Forms\WinBook ブラウズします。
  4. .sln 拡張子のファイルを選択し案す。
  5. 開く をクリックします。
  6. ソリューションエクスプローラ内で WinBook ソリューションを右クリックし ソリューションのビルド を選択します。

これによって次の二つのバイナリ BookWrapper.dll および LegacyBook.dllbin サブフォルダに作成されます。

フォームのペイントの開始

ここでは、Windows フォームを作成し、フォームをペイントします。生成されたコードを確認することもできます。フォームの作成とペイントについての基本情報は、『入門書』の『Visual Studio を使用した COBOL プログラム開発』を参照してください。

  1. for .NET Framework 4.0 のマネージ Windows フォームアプリケーションを作成し、 次の選択または指定を行います。
    • COBOL プロジェクト」および「Windows アプリケーション
    • プロジェクト名として「WinFormBook
    • プロジェクトの場所として「Tutorials
    • ソリューション名として「WinBook」を指定し、「ソリューションのディレクトリを作成」をチェックする。
  2. ソースエディタで main.cbl を開きます。
  3. 以下の行を静的メインメソッドの手続き部の先頭に追加します:
    invoke type System.Windows.Forms.Application::EnableVisualStyles()
    
    これによって Windowsフォームが Visual Studio 2010スタイルになります。
  4. デザイナでフォームを開きます。
  5. フォーム上にラベルを 4 つ、テキストボックスを 3 つ、ボタンを 1 つ作成します。
  6. コントロールをダブルクリックしないように注意して、コントロールのプロパティを編集します。ダブルクリックすると、コントロールのイベントが作成されますが、それは次の手順で行います。次の値で、プロパティを編集します。
    コントロール名前プロパティテキストプロパティ
    ラベルlabel1在庫番号
    テキストボックスtextBoxStockNo (大文字と小文字を区別します)(空白)
    ラベルlabel2タイトル
    テキストボックスtextBoxTitle (大文字と小文字を区別します)(空白)
    ラベルlabel3価格
    ラベルlabel4 (大文字と小文字を区別します)(空白)
    テキストボックスtextBoxPrice (大文字と小文字を区別します)(空白)
    ボタンbutton1 (大文字と小文字を区別します)読み取り

    プロパティを表示するには、ラベルを右クリックしてから [プロパティ] をクリックします。該当するプロパティまでスクロールして編集します。

  7. [読み取り] ボタンにクリックイベントを作成します。イベントを作成するには、ボタンをダブルクリックします。これにより、button1_Click というイベントが作成され、フォーム用に生成されたコードが表示されます。
  8. button1_Click メソッドのコードでは、まだ何も実行されません。手続き部は空です。さらにスクロールして、生成されたコードを確認できます。
  9. フォームは、[ビルド] > [WinFormBook のビルド] をクリックして、ビルドすることができます。エラーにはならないはずです。

生成コードの詳細は、『入門書』の『Visual Studio を使用した COBOL プログラム開発 』のチュートリアルを参照してください。

クリックイベントの処理

次に、ボタンクリックに対応するコードを追加する必要があります。このコードでは、レガシー COBOL プログラムを呼び出して、返された情報をフォームに入力する必要があります。

  1. コードビューで、button1_Click メソッドを検索します。次のように、コードを更新します。
           method-id  button1_Click final private.
           local-storage section.
           01 input-string string.
           01 my-exception type System.Exception.
           procedure division using by value sender as object e as type System.EventArgs.
               set input-string to textBoxStockNo::Text
               try
                   set my-book to type BookWrapper.Book::Read(input-string)
                   invoke self::PopulateForm(my-book)
               catch my-exception
                   invoke self::DisplayException(my-exception)
               end-try
           end method.
    
  2. 一部の語句の下に、赤い波線が引かれます。これらは、バックグラウンドで行われている自動解析で生じた構文エラーを示しています。下線の引かれた語句の上にカーソルを移動すると、エラーについての情報がポップアップで表示されます。ステータスバーには、バックグラウンドの解析エラーの数が表示されます。

    先頭のリポジトリ節で class-exception as a System.Exception を宣言すると、これらのエラーのうち 1 つを解決できます。次の行をコピーアンドペーストではなく手入力すると、IntelliSense により適切なシステムクラスが提示されます。

           class class-exception as "System.Exception"

    クラス例外を示す赤い波線が消えていることを確認します。

  3. エラーのある語句の上に移動してポップアップを表示すると、PopulateForm メソッドが見つからないと表示されます。コードの button1_Click メソッドの後、end object 文の前に、次のメソッドを追加します。
           method-id  PopulateForm final private.
           procedure division using my-book as type BookWrapper.Book.
               if my-book <>null
                   set textBoxStockNo::Text      to my-book::StockNumber
                   set textBoxTitle::Text        to my-book::Title
                   set textBoxPrice::Text        to type System.Convert::ToString(my-book::RetailPrice)
               else
                   set textBoxStockNo::Text      to "****"
                   set textBoxTitle::Text        to "*************************************"
                   set textBoxPrice::Text        to "****"
               end-if
           end method.
           method-id DisplayException private.
           procedure division using by value ex as type System.Exception.
               set label4::Text to ex::Message
               set my-book to null
               invoke self::PopulateForm(my-book)
           end method.

残りの赤い波線は、すべて my-book に関連しています。これらのエラーは、レガシーコードを追加すると解決されます。

レガシーコードとラッパーコードの追加

次に、ビジネスロジックが含まれている既存の COBOL コードを追加して、フォームで使用できるようにする必要があります。このコードは、book.cbl を含む LegacyBook プロジェクトにあります。

さらに、データを .NET 型から COBOL 形式に変換するためのラッパーコードが必要です。Windows フォームでは .NET データ型が使用されます。このチュートリアルでは、System.String オブジェクトがこれにあたります。Book プログラムは、PIC X や PIC 99V99 などの COBOL 形式を使用します。付属のプログラム BookWrapper.cbl でこの変換が行われるので、このプログラムをソリューションに追加する必要があります。

book.cblBookWrapper.cbl を追加するには、次の手順を行います。

  1. 付属の LegacyBook フォルダと BookWrapper フォルダを、Examples¥Visual Studio Integration¥Forms からチュートリアルのディレクトリにコピーします。
  2. BookWrapper プロジェクトを次の手順でソリューションに追加します。
    1. ソリューション エクスプローラでソリューションを右クリックします。
    2. [追加] > [既存のプロジェクト] をクリックします。
    3. Examples¥Visual Studio Integration¥Forms にある BookWrapper フォルダまで移動します。
    4. プロジェクトファイル BookWrapper.cblproj を選択します。
  3. 同様にして、LegacyBook プロジェクトを追加します。
  4. WinFormBook プロジェクトに、BookWrapper プロジェクトへの参照を追加します。手順は次のとおりです。
    1. ソリューション エクスプローラで、WinFormBook プロジェクトを右クリックします。
    2. [参照の追加] をクリックします。
    3. [プロジェクト] タブを選択します。
    4. [BookWrapper] を選択し、[OK] をクリックします。
  5. この 2 つのプロジェクトがビルドされたときに、ビルドされた .dll ファイルがプロジェクト WinFormBook の bin ディレクトリに保存されることを確認してください。確認するには、BookWrapper プロジェクトと LegcayBook プロジェクトで、次の手順を行います。
    1. プロジェクトを右クリックして、[プロパティ] をクリックします。
    2. [構成プロパティ] > [ビルド] を表示します。
    3. 出力パスが ..¥bin¥ であることを確認します。BookWrapper または LegacyBook ディレクトリが WinFormBook の兄弟ディレクトリでない場合は、この相対パスを正しく設定する必要があります。または、絶対パスを指定します。

レガシーコードへのアクセスの設定

次に、ラッパーコードを呼び出し、my-book に関連する最後の赤い波線を消去するために、フォームにコードを追加する必要があります。

  1. オブジェクトの作業場所節でデータ項目 my-book を次のように宣言します。
           01 my-book   type BookWrapper.Book.

    BookWrapper が宣言されたので、解析エラーがなくなります。エラーがある場合には、Examples¥Visual Studio Integration¥Forms¥WinBook にあるデモンストレーションと照合して、違いを確認します。

  2. Examples¥Visual Studio Integration¥BookData にある bookfile.* データファイルを指す環境変数を設定します。手順は次のとおりです。
    1. プロジェクト [WinFormBook] を右クリックし、[追加] > [新しい項目]をクリックします。
    2. テンプレートペインから [アプリケーション構成ファイル] を選択します。
    3. [追加] をクリックします。
      これでプロジェクトに App.config ファイルが追加されます
    4. ソリューションエクスプローラ内で App.config を右クリックし [編集] を選択します。
    5. アプリケーション設定」ダイアログの環境 タブで次のように詳細情報を入力します。
      • 名前 フィールドに dd_bookfile をにゅうりょくします。 これは、プログラム book.cbl で宣言されたデータファイル名に接頭語dd_ を付加したものです。
      • フィールドにデータファイル bookfile.dat のパス名を指定します。 例えば:
        • C:\Users\Public\Documents\Micro Focus\Visual COBOL 2010\Samples \BookData\bookfile.dat のようにハードコードされたパスで指定します。

          スタートメニュー > すべてのプログラム > Micro Focus Visual COBOL 2010 > Visual COBOL Samples を参照して、正しいインストール先を確認してください。

アプリケーションの実行

これで、アプリケーションが実行可能な状態になります。

  1. プロジェクトをビルドします。
  2. フォームのプロジェクトを開始プロジェクトとして設定します。これを行うには、ソリューション エクスプローラで WinFormBook プロジェクトを右クリックして、[スタートアップ プロジェクトに設定] をクリックします。
  3. [デバッグ] > [デバッグなしで開始] をクリックします。
  4. 情報を入力し、[読み取り] ボタンを使用して動作を試験します。在庫番号 1111 と 2222 のデータが読み取れます。

サンプルコードの確認

サンプルコードは、本 COBOL 開発システムの Examples¥Visual Studio Integration¥Forms ディレクトリにあります。

Legacy Book プログラム

この book.cbl プログラムは、Net Express に数年間添付されている昔からのデモプログラムです。このデモプログラムは、手続き型 COBOL で作成されています。このプログラムによって、書籍レコードを含む索引ファイルを読み書きします。

このソリューションでは、Book デモプログラムを変更しないで、マネージ コードとして再コンパイルします。プログラムを再コンパイルすることにより、クラスとして公開し、そのメインエントリポイントを静的メソッドとして公開します。

このプログラムの連絡節では、データが PIC X などの標準 COBOL 形式で定義されています。そのため、COBOL 以外のクライアントプログラムでは、これらのデータ形式を認識できません。クライアントプログラムと通信するためには、これらの形式を .NET と互換性がある型にマッピングする必要があります。このマッピングは、中間プログラム BookWrapper.cbl によって行われます。

クライアント Windows フォーム

クライアント Windows フォーム Form1.cbl は、COBOL として生成されます。ユーザはこのフォームにデータを入力し、そこで戻りデータを受け取ります。クライアントフォームでは、次の処理が実行されます。

  1. フォームのテキストボックスから、入力データを System.Strings として抽出します。
  2. BookWrapper を呼び出して、その文字列オブジェクトを渡します。
  3. System.Strings でフォームのテキストボックスにデータを出力します。

Book Wrapper プログラム

BookWrapper.cbl プログラムは、既存の COBOL プログラム book.cbl と Windows フォームとの間の中間プログラムとして機能します。この中間プログラムにより、既存の COBOL を変更する必要がなくなります。

ここで重要な点は、複数の言語を使用する場合、互換性がある型を使用することです。Windows フォームではデータを .NET 型として格納しますが、Book プログラムではデータを COBOL 形式と見なします。

BookWrapper プログラムの目的は、COBOL の PICTURE を .NET System.Strings にマッピングすることです。BookWrapper プログラムは、Windows フォームからデータを System.Strings として受け取り、標準の COBOL データ形式にマッピングしてから既存の Book プログラムに渡します。

BookWrapper プログラムでは、次のように、クラス Book を宣言しています。

class-id. Book as "BookWrapper.Book"

オブジェクトの作業場所節では、コピーファイルを使用してブックレコードのデータ項目を次のように宣言しています。

 object.
        data division.
        working-storage section.
        copy "book-rec-dotnet.cpy" replacing == (prefix) == by == book ==.
    ...

コピーファイル book-rec-dotnet.cpy では、book-details レコードを宣言しています。ここで、book-title と book-stockno を COBOL の Picture 形式で宣言し、プロパティとしても宣言します。したがって、Getter/Setter メソッドを使用してこれらにアクセスできます。コピーファイルには、次の内容が記述されています。

   01 (prefix)-details.
      03 (prefix)-text-details.
    	    05 (prefix)-title  pic x(50) property as "Title".
      ...
      03 (prefix)-stockno pic x(4) property as "StockNumber".

次の get property メソッドでは、book-details レコードへのポインタを受け取ります。

        method-id. get property "BookDetails".
        procedure division returning bookDetailsAddress as pointer. 
            set bookDetailsAddress to address of book-details
            goback.
        end method.

Read メソッドは、次のように静的な節に記述されています。

        method-id. "Read". 
        procedure division using by value stockno as string
                           returning      myBook  as Book. 
            set myBook to Book::New
            set myBook::StockNumber to stockno
            call "BookLegacy" using by value readRecord
                                   by value myBook::BookDetails
                                   by reference status-code       
            invoke "aiseExceptionIfError"
            goback.
        end method "Read".

詳細は次のとおりです。