このチュートリアルでは、付属する Book プログラムのような既存の COBOL プログラムと連動する Windows フォームを作成する方法を示します。
このチュートリアルでは、Windows フォームの作成方法と、この Windows フォームを既存の COBOL プログラムと相互に動作させる方法を示します。フォームはマネージ COBOL で生成されます。フォームは、.NET データ型を COBOL データ形式にマッピングするための中間プログラムを呼び出します。中間プログラムは、ビジネスロジックを実行するための既存の COBOL プログラムを呼び出します。
このソリューションには、次の 3 つのプログラムがあります。
このチュートリアルを始める前に、以下の手順に従って WinBook例題の一部として提供されている BookWrapper と LegacyBook プロジェクトをビルドしておく必要があります:
これによって次の二つのバイナリ BookWrapper.dll および LegacyBook.dllが bin サブフォルダーに作成されます。
ここでは、Windows フォームを作成し、フォームをペイントします。生成されたコードを確認することもできます。フォームの作成とペイントについての基本情報は、『入門書』の『
invoke type System.Windows.Forms.Application::EnableVisualStyles()これによって Windowsフォームが Visual Studio 2010スタイルになります。
コントロール | 名前プロパティ | テキストプロパティ |
---|---|---|
ラベル | label1 | 在庫番号 |
テキストボックス | textBoxStockNo (大文字と小文字を区別します) | (空白) |
ラベル | label2 | タイトル |
テキストボックス | textBoxTitle (大文字と小文字を区別します) | (空白) |
ラベル | label3 | 価格 |
ラベル | label4 (大文字と小文字を区別します) | (空白) |
テキストボックス | textBoxPrice (大文字と小文字を区別します) | (空白) |
ボタン | button1 (大文字と小文字を区別します) | 読み取り |
プロパティを表示するには、ラベルを右クリックしてから [プロパティ] をクリックします。該当するプロパティまでスクロールして編集します。
生成コードの詳細は、『入門書』の『
次に、ボタンクリックに対応するコードを追加する必要があります。このコードでは、レガシー COBOL プログラムを呼び出して、返された情報をフォームに入力する必要があります。
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.
先頭のリポジトリ節で class-exception as a System.Exception を宣言すると、これらのエラーのうち 1 つを解決できます。次の行をコピーアンドペーストではなく手入力すると、IntelliSense により適切なシステムクラスが提示されます。
class class-exception as "System.Exception"
クラス例外を示す赤い波線が消えていることを確認します。
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.cbl と BookWrapper.cbl を追加するには、次の手順を行います。
次に、ラッパーコードを呼び出し、my-book に関連する最後の赤い波線を消去するために、フォームにコードを追加する必要があります。
01 my-book type BookWrapper.Book.
BookWrapper が宣言されたので、解析エラーがなくなります。エラーがある場合には、Examples¥Visual Studio Integration¥Forms¥WinBook にあるデモンストレーションと照合して、違いを確認します。
これで、アプリケーションが実行可能な状態になります。
サンプルコードは、本 COBOL 開発システムの Examples¥Visual Studio Integration¥Forms ディレクトリにあります。
この book.cbl プログラムは、Net Express に数年間添付されている昔からのデモプログラムです。このデモプログラムは、手続き型 COBOL で作成されています。このプログラムによって、書籍レコードを含む索引ファイルを読み書きします。
このソリューションでは、Book デモプログラムを変更しないで、マネージ コードとして再コンパイルします。プログラムを再コンパイルすることにより、クラスとして公開し、そのメインエントリポイントを静的メソッドとして公開します。
このプログラムの連絡節では、データが PIC X などの標準 COBOL 形式で定義されています。そのため、COBOL 以外のクライアントプログラムでは、これらのデータ形式を認識できません。クライアントプログラムと通信するためには、これらの形式を .NET と互換性がある型にマッピングする必要があります。このマッピングは、中間プログラム BookWrapper.cbl によって行われます。
クライアント Windows フォーム Form1.cbl は、COBOL として生成されます。ユーザーはこのフォームにデータを入力し、そこで戻りデータを受け取ります。クライアントフォームでは、次の処理が実行されます。
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".
詳細は次のとおりです。
クライアントフォームから渡される、.NET の System.String である stockno が記述されています。返される Book クラスのインスタンスも記述されています。BookWrapper.cbl では、新規の .NET 型、Book が定義されています。Book は、任意の .NET 言語で書かれたプログラムで使用できます。
set myBook to Book::New
BookWrapper クラスの新規インスタンスを作成します。
set mybook::StockNumber
.NET の System.String (stockno) からデータを受け取り、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 "RaiseExceptionIfError"
ファイルの読み取りで返されたファイルのステータスを確認します。エラーがあった場合には、.NET 例外が発生します。例外は、エラー状態を通知するための標準の .NET メカニズムです。