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

概要

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

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

  • Windows フォーム。Microsoft のフォームデザイナでは、C# や COBOL などの任意の .NET 言語で Windows フォームを作成できます。このチュートリアルでは、.NET COBOL でフォームを生成する方法を説明します。
  • 既存の COBOL プログラムである Book プログラム。このプログラムは、既存の COBOL プログラムをシミュレートします。このプログラムにはビジネス ロジックが含まれています。また、このプログラムが変更されることはありません。Book プログラムは製品に付属しており、このチュートリアルではこのプログラムをソリューションに追加します。ソリューションでは、このプログラムのソースを変更しないで、マネージ コードとして再コンパイルし、.NET マネージ コードから呼び出し可能なクラスとして公開します。
  • 中間 COBOL クラスである BookWrapper プログラム。このプログラムは、既存の COBOL プログラムとクライアント フォームとの間のインターフェイスとして機能します。この中間クラスは、.NET クライアント フォームとのインターフェイスにオブジェクトを使用し、既存の COBOL とのインターフェイスに標準の COBOL PIC X データ形式を使用します。BookWrapper 中間クラスは製品に付属しており、このチュートリアルではこの中間クラスをソリューションに追加します。

前提条件

このチュートリアルの前提条件として、次のように WinBook サンプルの一部である BookWrapper プロジェクトと LegacyBook プロジェクトをビルドしておく必要があります。

  1. [スタート > すべてのプログラム > Micro Focus Enterprise Developer > サンプル > Visual COBOL サンプル] をクリックしてサンプル ブラウザーを起動します。
    注:Windows 8、Windows 10、または Windows Server 2012 でサンプル ブラウザーを開始するには、[スタート] 画面に移動し、[サンプル] タイルをクリックします。
  2. 左側のウィンドウで [Windows Forms] をクリックし、[Win Book] をクリックします。
  3. [Open sample in Visual Studio] をクリックします。

    これにより、ソリューション エクスプローラーで WinBook ソリューションが読み込まれます。このソリューションは、BookWrapper、LegacyBook、および WinFormBook の 3 つのプロジェクトで構成されています。WinFormBook が太字表記になっているのは、ソリューションのスタートアップ プロジェクト、つまりデバッガーの起動時に実行されるプロジェクトであることを示すためです。

  4. ソリューション エクスプローラーで ソリューション 「WinBook」 を右クリックして、[ソリューションのビルド] を選択します。

ビルドにより、WinBook ソリューションの WinFormBook\bin\Debug サブフォルダーに BookWrapper.dll および LegacyBook.dll という 2 つのバイナリが作成されます。このソリューションは閉じて構いません。

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

ここでは、Windows フォームを作成し、フォームをペイントします。生成されたコードを確認することもできます。

  1. .NET Framework 4.5 用のマネージ Windows フォーム プロジェクトを作成し、以下を選択または指定します。
    1. [File > New > Project] の順にクリックして、プロジェクトを新規作成します。

      [New Project] ダイアログ ボックスが開きます。

    2. [New Project] ダイアログ ボックスで [Installed > Templates > COBOL > Managed] とクリックします。
    3. [Windows Forms Application] をクリックします。
    4. [Name] フィールドに「WinFormBook」と入力します。
    5. [Location] フィールドで [Browse] をクリックして Tutorials フォルダーに移動します。
    6. [Solution name] フィールドに「WinBook」と入力します。
    7. [Create directory for solution] を選択します。
    8. [OK] をクリックします。

    Visual Studio でプロジェクトが作成され、デザイナーで自動的にフォームが開きます。

  2. 以下の表に示すとおり、フォーム上にラベルを 4 つ、テキスト ボックスを 3 つ、ボタンを 1 つ作成します。
    注:コントロールをダブルクリックしないように注意して、コントロールのプロパティを編集します。ダブルクリックすると、コントロールのイベントが作成されますが、それは次の手順で行います。次の値を持つようにプロパティを編集します。
    コントロール 名前プロパティ テキスト プロパティ
    ラベル label1 在庫番号
    テキスト ボックス textBoxStockNo (大文字と小文字を区別します) (空白)
    ラベル label2 タイトル
    テキスト ボックス textBoxTitle (大文字と小文字を区別します) (空白)
    ラベル label3 価格
    ラベル label4 (大文字と小文字を区別します) (空白)
    テキスト ボックス textBoxPrice (大文字と小文字を区別します) (空白)
    ボタン button1 (大文字と小文字を区別します) 読み取り

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

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

生成コードの詳細については、「チュートリアル:.NET マネージ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. 一部の語句の下に、赤い波線が引かれます。これらは、バックグラウンドで行われている自動解析で生じた構文エラーを示しています。下線の引かれた語句の上にカーソルを移動すると、エラーについての情報がポップアップで表示されます。ステータス バーには、バックグラウンドの解析エラーの数が表示されます。
  3. エラーのある語句の上に移動してポップアップを表示すると、PopulateForm メソッドが見つからないと表示されます。コードのbutton1_Click メソッドの後、end class 文の前に、次のメソッドを追加します。
           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 でこの変換が行われるので、このプログラムをソリューションに追加する必要があります。

提供されるファイルは、%PUBLIC%\Documents\Micro Focus\Enterprise Developer\Samples フォルダー内の Forms サブフォルダーにあります。

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

  1. 付属の LegacyBook フォルダーおよび BookWrapper フォルダーを、Forms フォルダーから Tutorials ディレクトリにコピーします。
  2. BookWrapper プロジェクトを次の手順でソリューションに追加します。
    1. ソリューション エクスプローラーでソリューションを右クリックします。
    2. [追加] > [既存のプロジェクト] をクリックします。
    3. Tutorials フォルダー内の BookWrapper フォルダーに移動します。
    4. プロジェクト ファイル BookWrapper.cblproj を選択して [開く] をクリックします。
  3. 同様にして、LegacyBook プロジェクトを追加します。
  4. BookWrapper プロジェクトに、WinFormBook プロジェクトへの参照を追加します。これを行うには、次の手順を行います。
    1. ソリューション エクスプローラーで、WinFormBook プロジェクトを右クリックします。
    2. [参照の追加] をクリックします。
    3. 左側のペインで [ソリューション] を展開し、[プロジェクト] をクリックします。
    4. BookWrapper プロジェクトと LegacyBook プロジェクトにチェックマークを入れ、[OK] をクリックします。

      これで、プロジェクトがソリューションの References フォルダに追加されました。

  5. この 2 つのプロジェクトがビルドされたときに、ビルドされた .dll ファイルがプロジェクト WinFormBookbin ディレクトリに保存されることを確認してください。確認するには、BookWrapper プロジェクトと LegacyBook プロジェクトで、次の手順を行います。
    1. ソリューション エクスプローラーで、各プロジェクトの [プロパティ] フォルダーをダブルクリックします。
    2. プロパティで、[COBOL] タブをクリックします。
    3. [出力パス] が ..\bin\Debug であることを確認します。BookWrapper または LegacyBook ディレクトリが WinFormBook の兄弟ディレクトリでない場合は、この相対パスを正しく設定する必要があります。または、絶対パスを指定します。

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

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

  1. 次のように、フォーム MainForm.cbl のメイン クラスの作業場所節でデータ アイテム my-book を宣言します。
           01 my-book   type BookWrapper.Book.
  2. BookWrapper が宣言されたため、解析エラーがなくなります。エラーがある場合には、Forms\WinBook にあるデモンストレーションと照合して、違いを確認します。

  3. BookData に用意されている bookfile.* データ ファイルを指す環境変数を設定します。これを行うには、次の手順を行います。
    1. プロジェクト WinFormBook を右クリックし、[追加 > 新しい項目] をクリックします。
    2. [インストール済み] ペインで [COBOL 項目 > マネージ] をクリックします。
    3. [アプリケーション構成ファイル] を選択します。
    4. [追加] をクリックします。

      これで、App.config ファイルが WinFormBook プロジェクトに追加されます。

    5. ソリューション エクスプローラーで App.config を右クリックして [編集] をクリックします。
    6. 次の手順で [アプリケーション設定] ダイアログの [環境] タブに詳細を入力します。
      • dd_bookfileを [名前] フィールドに入力します。これは、プレフィックス dd_ の後に、プログラム book.cbl で宣言されたデータ ファイル名が続いた名前です。
      • [変数] フィールドに、bookfile.dat のパスとファイル名を入力します。たとえば、次のように入力します。
        • %PUBLIC%\Documents\Micro Focus\Enterprise Developer\Samples\BookData\bookfile.dat などのハードコーディング パス。

          [スタート > すべてのプログラム > Micro Focus Enterprise Developer > サンプル > Visual COBOL サンプル] を参照してマシンにあるサンプルの正確な場所を調べます。

    7. [Set] をクリックします。
    8. [OK] をクリックします。
    9. 表示されるダイアログで [Yes] をクリックして、ソリューション内の App.config ファイルをリロードします。

アプリケーションの実行

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

  1. プロジェクトをビルドします。フォームのプロジェクトを開始プロジェクトとして設定します。

    これを行うには、ソリューション エクスプローラーで WinFormBook プロジェクトを右クリックして、[スタートアップ プロジェクトに設定] をクリックします。

  2. [デバッグ] > [デバッグなしで開始] をクリックします。
  3. 情報を入力し、[読み取り] ボタンを使用して動作を試験します。

    在庫番号1111および2222のデータを検索できます。

サンプル コードの確認

サンプル コードは、全 Visual Studio および .NET のサンプルとともに Samples フォルダーおよびそのサブフォルダーの Forms にあります。

クライアント 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 にマッピングすることです。このプログラムは、Windows フォームからデータを System.Strings として受け取り、標準の COBOL データ形式にマッピングしてから既存の Book プログラムに渡します。

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

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 レコードへのポインターを受け取ります。

       property-id BookDetails pointer.
       getter. 
           set property-value to address of book-details
       end property.

Read メソッドは、次のように実装されています。

       method-id Read static. 
       local-storage section.
       01 file-status pic xx.
       procedure division using by value stockno-in as string
                          returning      myBook     as type BookWrapper.Book. 

           set myBook to new BookWrapper.Book()
           set myBook::StockNumber to stockno-in

           call "BookLegacy" using by value readRecord
                                   by value myBook::BookDetails
                                   by reference file-status       
            
           invoke self:RaiseExceptionIfError(file-status)
           goback.
       end method.

詳細は次のとおりです。

  • procedure division using ...

    .NET の System.String であるstockno-inは、クライアント フォームから渡されます。また、返される Book クラスのインスタンスも表示されます。BookWrapper.cbl は、新しい.NET タイプBookを定義します。これは、任意の .NET 言語で書かれたプログラムで使用できます。

  • set myBook to new BookWrapper.Book() 

    BookWrapper クラスの新規インスタンスを作成します。

  • set mybook::StockNumber

    .NET の System.String (stockno-in) からデータを受け取り、myBook の StockNumber プロパティとして格納します。このプロパティは、コピーブックで Picture 文字列として宣言されており、データは標準の COBOL データ形式として book-stockno に格納されます。COBOL コンパイラは、データを .NET 文字列から COBOL の USAGE DISPLAY 項目 (pic x) に暗黙的に変換します。

  • call BookLegacy using ...

    レガシー プログラム book.cbl を呼び出します。book.cbl プログラムに、myBook の「BookDetails」プロパティを渡します。BookWrapper.cbl のコードを見ると、BookDetails は book-rec-net.cpy で定義された BookRecord 構造体へのポインターを渡すことがわかります。この構造体は古い book-rec.cpy の構造体と一致します。したがって、従来の Book プログラムが見るのは、参照によって渡されるブック レコードです。これは想定通りの動作です。Book は、このレコードから在庫番号を読み取って、索引付きファイルから対象のレコードを読み取り、このレコードの他のフィールドにそのデータを書き込みます。

  • invoke self:RaiseExceptionIfError(file-status)

    ファイルの読み取りで返されたファイルのステータスを確認します。エラーがあった場合には、.NET 例外が発生します。例外は、エラー状態を通知するための標準の .NET メカニズムです。

Legacy Book プログラム

この book.cbl プログラムは、Micro Focus 製品に長らく同梱されているデモ プログラムです。このデモ プログラムは、手続き型 COBOL で作成されています。このプログラムによって、ブック レコードを含む索引付きファイルを読み書きします。

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

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