前へ 次へ 目次 文書セット ホーム


第 7 章

 

コードの生成


はじめに

これまで、Sun WorkShop Visual の対話型機能を使用してユーザーインタフェースの動作プロトタイプを作成してきました。本章では、デザ インを独立したプログラムに変換するために必要なコード生成機能について説明します。コード生成は、C 、C++、Java、または UIL で動作します。

以下の作業を進めながら説明していきます。

また、さまざまなファイルに生成されたコードの分析、および種々のファイルの上 手な構成の仕方についても説明します。

前提知識

生成されたコードファイルを理解し、コールバック関数のコードを作成するために は、C、C++、Java、または UIL についての知識が必要です。また、X Window System についての知識もある程度必要となります。

生成メニュー

「生成」メニューは、ソースコード、X リソースファイルおよびメークファイルをデザインから生成するために使用します。「生成」メニューには 、「C」、「C++」、「UIL」、「X リソース」、「メークファイル」、「Java」、「生成」の 7 個のオプションがあります。最初の 6 個のオプションでは、「コード生成」ダイアログで設定したファイルを生成することができます。

「生成」オプションを選択すると「コード生成」ダイアログが表示されます。

本章の例では、C を使用します。C++ の生成は C の場合とまったく同じであるため、学習例に C++ を使用することも可能です。UIL の手順は、 1 つの手順を除いて C の手順とほぼ同じです。異なる手順については、「言語の設定」で説明します。

Java の生成の詳細については、第 10 章「Java 用のデザイン」 を参照してください。

「コード生成」ダイアログ

「コード生成」ダイアログを表示するには、「生成」メニューをプルダウンして「 生成」を選択します。

 

    図 7-1 「コード生成」ダイアログ

このダイアログには、デザインから生成できるすべてのファイルの概要が表示され ます。ダイアログには、デフォルトのファイル名を含むデフォルト設定がいくつかあります。デフォルトの ファイル名は、生成されるファイルの種類および言語に適したものになっています。デフォルト設定は、ア プリケーションリソースファイルで変更することができます。詳細は、「フィルタ」を参照してください。

ダイアログの設定

生成するファイルを個々に設定する前に、すべてのファイルに影響する 2 つのオプションを設定する必要があります。

  • 使用言語
  • ファイルを生成するベースディレクトリ

言語の設定

言語の場合は、ダイアログの最上部にある「言語」オプションメニューを使用しま す。言語の選択肢としては、C、C++、UIL、Java があります。Microsoft Windows モードでは、さらに「C++ (Motif XP)」および「C++ (Microsoft Windows MFC)」という選択肢もあります。Microsoft Windows モード、Motif XP、MFC の詳細については、第 11 章「Microsoft Windows 用のデザイン」を参照してください。この学習では C 言語を使用するため、次の作業を行なってください。

  • 「言語」オプションメニューで「C」が選択されていることを確認します。
  • 注 - 言語として「Java」を選択している場合は、「生成」ダイアログの使い方がまった く異なります。そのため、Java コードを生成するための「生成」ダイアログについては、第 10 章「Java 用のデザイン」「生成ダイアログ」で説明します。

UIL 使用時の注意事項

UIL で作業を行う場合、そのコード生成関数は基本的には C の場合と同じです。しかし、UIL は C ほど強力な言語ではないため、Sun WorkShop Visual の機能の中には UIL では実装できないものがあります。デザインを完全に機能させるためには、UIL ファイルに加えて補足の C ファイルを生成する必要があります。

「言語」オプションメニューから「UIL」を選択する場合は、UIL ファイルの名前を「UIL」フィールドに、補足の C ファイルの名前を「コード」フィールドに入力します。また、コンパイルする UIL ファイルの名前も指定する必要があります。指定するには、コードの「オプション」ボタンを押し、「UID ファイル」フィールドに名前を入力します。

「インクルード」(「基本ソースファイルの設定」を参照)、「メインプログラム」、「リンク」(「コード生成オプション」を参照) は、C ファイルには生成できますが、UIL には生成することができません。

UIL は Motif 固有の言語であるため、Motif ツールキット以外のウィジェットでは動作しません。デザインに他のツールキットからのウィジェットが含 まれている場合には、C または C++ を使用する必要があります。

ベースディレクトリの設定

ベースディレクトリを設定するには、「ディレクトリ」というラベルが付いたテキ ストボックスに直接入力するか、「ブラウズ」ボタンを押します。「ブラウズ」ボタンを押すと、ファイル 選択ボックスが表示され、ディレクトリの検索や選択を行うことができます。生成されるファイルのファイ ル名は、ベースディレクトリからの相対パスで表示されます。デフォルトでは、ベースディレクトリは保存 したデザインを最後に開いたディレクトリか、デザインを新規に作成している場合は Sun WorkShop Visual を呼び出したディレクトリです。デフォルトは括弧で囲まれて表示されますが、.xd ファイルには保存されません。明示的に名前を付けたディレクトリが保存されます。

ファイル名テキストボックスには、絶対パス名を入力することができます。しかし 、ファイルごとにこのパスを入力しなければならないため、この方法はお勧めできません。最初にディレク トリを設定し、すべてのファイルをそのディレクトリからの相対と見なした方が、簡単で入力ミスも少なく なります。

基本ソースファイルの設定

「コード」というラベルが付いたテキストボックスに、基本ソースファイルのファ イル名を入力します。このファイルの説明については、「基本モジュールの分析」を参照してください。

    1. 「コード」テキストボックスに次のように入力します。
    icecream.c

    規約により、基本ソースファイルおよびスタブファイルを含むすべての C ファイルには、接尾辞 .c が付けられます。

    2. テキストボックスの横にある「生成」トグルが設定されていることを確認します。

    「生成」トグルを設定しているファイルだけが生成されます。

    3. 「コード」ファイル名の横にある「オプション」というラベルが付いたボタンを押します。

    基本ソースファイルに関連するオプションが表示されます。

 

    図 7-2 基本ソースファイルの「C コードのオプション」ダイアログ

基本ソースファイルの「C コードのオプション」ダイアログには、以下のオプションがあります。

  • ANSI C
    Sun WorkShop Visual に ANSI C を生成させたい場合は、このオプションを選択します。
  • Motif ヘッダーファイルをインクルード
    このオプションは、デフォルトで選択されています。このオプションの選択を解除する場合は、必ず Motif ヘッダーをインクルードする場所を別に指定する必要があります。指定しないと、コンパイルエラーが起こ ります。学習のための例を実行する場合は、このオプションを選択してください。このオプションは、Micr osoft Windows モードで MFC 様式のコードを生成する場合は表示されません。
  • MFC ヘッダーファイルをインクルード
    このオプションは、Microsoft Windows モードで MFC 様式のコードを生成する場合にのみ表示されます。このオプションはデフォルトで選択されています。選択 されている場合は、MFC 様式のコードファイルにヘッダーファイルがインクルードされます。
  • ヘッダーファイルをインクルード
    基本ソースファイルにヘッダーファイルをインクルードするための行を追加する場合は、このオプションを 選択してヘッダーファイルの名前を入力します (「ヘッダーファイル」と「外部宣言ファイル」は、Sun WorkShop Visual と『Sun WorkShop Visual ユーザーズガイド』では同一のものを指します)。外部宣言ファイル (「外部宣言ファイルの設定」を参照) を生成する場合は、通常、基本ソースファイルにその外部宣言ファイルがインクルードされるようにそのフ ァイルの名前を入力します。学習のための例ではヘッダーファイルをインクルードしないため、このオプシ ョンは選択しないでください。自身で作成したソースコードにヘッダーファイルをインクルードする際の補 足情報については、「ヘッダーファイルをインクルードする際の注意事項」 を参照してください。
  • 注 - コードファイルとメインプログラムファイルを別々に生成する場合は、両方のファ イルで同一の変数名が使用されるように、生成された外部宣言ファイルをインクルードしなければなりませ ん。

  • ピックスマップ・ファイルをインクルード
    これは「ヘッダーファイルをインクルード」オプションと類似しています。独立したピックスマップファイ ルを生成して、生成したピックスマップファイルを基本ソースファイルにインクルードしたい場合は、この トグルをオンにしてテキストボックスにピックスマップファイルの名前を入力します。これにより、明示的 なピックスマップ定義の代わりに #include 指令が基本ソースファイルに生成されます。ピックスマップファイルの生成については、「ピックスマップファイルの設定」を参照してください。学習用の例を実行する場合は、この オプションは選択しないでください。
  • UID ファイル
    UIL を生成した場合にのみ有効になります。このテキストボックスには UID ファイルの名前を指定します。詳細は、「UIL 使用時の注意事項」を参照してください。
  • 4. 「了解」ボタンを押して「C コードのオプション」ダイアログを閉じます。

    5. 「コード生成」ダイアログの「適用」ボタンを押します。

    これによって、コードを生成しなくても設定内容が保存されます。

#include 生成制御

デザインの一部として、生成したコードにインクルードファイルとして追加される ようにファイルの名前を指定できます。デフォルトでは、Sun WorkShop Visual はインクルード文を次のような山括弧 < > で囲みます。

#include <externs.h>

この動作はすべての言語型や構成に適しているわけではありません。次のリソース を使用して、「#include」 文の生成方法を制御できます。

visu.defaultIncludeInQuotes: true
visu.defaultIncludeObjectFileInQuotes: false

1 番目の文は、外部宣言ファイルを引用符で囲むか囲まないかを制御します。2 番目の文は、Sun WorkShop Visual が自動生成するヘッダーファイル ( xdclass.h ファイル) の生成を制御します。

この機能はデフォルトの動作に優先します。基本ソースファイルの 「コードのオプション」 ダイアログでヘッダーファイルの名前を引用符 " " または 山括弧 < > で明示的に囲んで入力すると、デフォルト値は無効になります。

ヘッダーファイルをインクルードする際の注意事項

外部のヘッダーファイル (Sun WorkShop Visual を使用しないで作成したもの) と Sun WorkShop Visual を使用して作成した外部宣言ファイルの両方をコードファイルにインクルードしたい場合は、外部のヘッダ ーファイルが Sun WorkShop Visual の生成した外部宣言ファイルをインクルードしていることを確認して、「ヘッダーファイルをインクルード 」テキストボックスに外部のヘッダーファイルの名前を入力してください。

「コードのオプション」ダイアログの「ヘッダーファイルをインクルード」トグル をオンに設定して外部宣言ファイルの名前をテキストボックスに入力すると、そのファイルがコードファイ ル、(生成する場合は) スタブファイル、および (コードファイルとは別に生成される場合は) メインプログラムファイルにインクルードされます。

コードファイルとメインプログラムファイルを別々に生成する場合は、外部宣言フ ァイルで定義された変数名が両方のファイルで使用されるため、必ず外部宣言ファイルをインクルードして ください。

スタブファイルの設定

デザインのすべてのコールバックおよびコールバック・メソッドに対して、コール バックスタブ、すなわち指定したコールバック名またはメソッド名を持つ「空」ルーチンが生成されます。 これらのルーチンは、スタブファイルという独立したソースファイルに生成されます。デザインにコールバ ックまたはメソッドがある場合は、コールバックは基本ソースコードから参照されるため、スタブファイル を生成することによってアプリケーションをコンパイルすることができます。ただし、必要な関数は自身で コールバックルーチンに追加しなければなりません。コールバックの追加については、「コールバック関数の追加」を参照してください。

Sun WorkShop Visual はコールバックスタブとともに特別なコメントを生成します。これらのコメントについては、「スタブファイルのコメント」を参照してください。

現在、学習用のデザインにはコールバック関数 quit() 1 つだけが含まれています。次に空の quit() 関数でスタブファイルを生成します。この空の関数により、アプリケーションをプロトタイプとしてコンパ イル、リンク、実行することができます。「コールバック関数の追加」で、 quit() に本当の機能を追加してアプリケーションを完成させます。

    1. 「スタブ」テキストボックスに次のように入力します。
    stubs.c

    2. 「スタブ」テキストボックスの横にある「生成」トグルをオンにします。

    「生成」トグルがオンに設定されているファイルだけが生成されます。

スタブファイルには個別のオプションはありません。

外部宣言ファイルの設定

Sun WorkShop Visual は、スコープが大域的なすべてのウィジェットに対しての外部宣言、デザインのための C++ クラス定義、C 構造体の定義を含むヘッダーファイルを生成することができます。大域的ウィジェットには、ユーザーが明 示的に命名したウィジェットおよびコアリソースパネルにおいて大域的として指定したウィジェットが含ま れます。

外部宣言ファイルを設定するには、「外部宣言」テキストボックスにファイルの名 前を入力し、「生成」トグルをオンにします。規約により、外部宣言ファイルには接尾辞 .h を付けます。

  • 学習のための例には外部宣言ファイルは必要ないので、「外部宣言」というラベル が付いたテキストボックスの横にある「生成」トグルが設定されていないことを確認してください。

生成された外部宣言ファイルを基本モジュールに組み込む方法については、「基本ソースファイルの設定」の「コードのオプション」ダイアログの記述を参照してくださ い。Sun WorkShop Visual は明示的な型定義の代わりに #include 指令を基本ソースファイルに生成します。ユーザーがこの動作を行う場合、大域的ウィジェットは基本ソー スファイルに割り当てられたままです。

外部宣言ファイルは、大域的ウィジェットの呼び出し、または型定義を参照するス タブファイルやその他のコードファイルへの組み込みを行う場合にも役に立ちます。詳細は 「大域的ウィジェット変数」 を参照してください。

外部宣言ファイルには、個別のオプションはありません。

ピックスマップファイルの設定

ピックスマップファイルは、外部宣言ファイルと類似しています。デザイン内にあ るすべてのピックスマップの静的宣言を持つヘッダーファイルを生成します。ピックスマップファイルを生 成することで、扱いにくいピックスマップ構造の定義を、基本ソースファイルとは別のファイルに入れてお くことができます。

ピックスマップファイルを生成するためには、「ピックスマップ」テキストボック スにファイルの名前を入力し、対応する「生成」トグルをオンにします。規約により、ピックスマップファ イルには接尾辞 .h を付けます。

  • 学習用の例ではピックスマップファイルは必要ありません。「ピックスマップ」と いうラベルが付いたテキストボックスの横にある「生成」トグルが設定されていないことを確認してくださ い。

メインプログラムファイルの設定

メインプログラムファイルとは、 main() 関数を含むファイルです。独立したファイルを生成することによって、この関数を残りのソースコードと切 り離すことができます。これは、ユーザーインタフェースを開始する前に、独自の初期化を実行したり、ア プリケーションの別の場所を呼び出すように関数を編集する必要がある場合に便利です。このファイルを編 集したときは、生成は必ず 1 回だけにしてください。以降の生成が変更内容を上書きするためです。 main() 関数の詳細は、「main() 関数プログラム」を参照してください。

main() 関数を基本ソースファイルに生成したい場合は、「メインプログラム」というラベルが付いたテキストボッ クスの名前が「コード」テキストボックスの名前と同じで、かつ対応する「生成」トグルが設定されている ことを確認してください。

学習用の例では、以下の作業を行います。

    1. ベースディレクトリが設定されているかどうかを調べます。

    「ベースディレクトリの設定」を参照してください。

    2. 「メインプログラム」というラベルが付いたテキストボックスに icecream.c と入力します。

    3. 「メインプログラム」テキストボックスの横にある「生成」トグルが設定されていることを確認します。

    メインプログラムには、個別のオプションはありません。

X リソースファイルの設定

「リソース」 で記述したように、リソース設定は有効でなければなりません。そうでない場合は、インタフェース実行時 にリソースが適用されません。リソース値は、基本ソースファイルまたは X リソースファイルのどちらかで有効にすることができます。ソースファイルへリソースを生成することを、 リソースをハードワイヤするといいます。

    1. ベースディレクトリが設定されいることを確認してください。

    「ベースディレクトリの設定」を参照してください。

    2. 「X リソース」とラベルの付いたテキストボックスに次のように入力します。
    icecream.res

    3. テキストボックスの横にある「生成」トグルを設定します。

    オプションメニューを使用して、生成するリソースおよび生成先のファイルを設定 することができます。詳細は 「コード生成オプション」 を参照してください。

X のリソースファイル認識

X は icecream.res をアプリケーションのリソースファイルとして自動的に認識するわけではありません。このファイルを検索 する場所を X が認識できるように、指定されたアプリケーションリソース・ディレクトリ (POSIX 準拠システム上では
/usr/lib/X11/app-defaults ) にリソースファイルをコピーすることをお勧めします。そのディレクトリ内のファイル名はアプリケーショ ンクラス名で、接尾辞を持たない「 XDTutorial 」となります (アプリケーションのクラス名の設定方法については 「コード生成オプション」を参照してください)。この方法により、アプリケーション固有の リソースファイルと、使用する他のファイルとの混同を避けることができます。

アプリケーションリソースディレクトリへのアクセス権が許可されていない場合は 、以下の操作を行います。

    4. 環境変数 XENVIRONMENT をリソースファイルのファイル名に設定します。

    実際の構文は、使用するシェルによって異なります。 C シェルの場合は、次のように入力します。

setenv XENVIRONMENT icecream.res
  

    Bourne シェルの場合は、次のように入力します。

XENVIRONMENT=icecream.res 
export XENVIRONMENT

    別の方法で X に X リソースファイルを認識させることもできます。 詳細は、X ウィンドウシステムの資料を参照してください。参考文献の名前については、付録 E「参考資料」を参照してください。

メークファイルの設定

Sun WorkShop Visual は、正しい依存性を持ち、デザインに必要なすべてのファイルに対するコンパイル命令を作成するメークフ ァイルを生成することができます。学習用の例では、メークファイルは、 icecream.c stubs.c の両ファイルをコンパイルし、その結果として生じるオブジェクトファイルを必要なライブラリにリンクし ます。

    1. 基本ソースファイルとスタブファイルがこれまで生成されていたディレクトリまたは今後生成されるディレ クトリに、ベースディレクトリが設定されていることを確認します。

    2. 「メークファイル」というラベルが付いたテキストボックスに「 Makefile 」と入力し、「生成」トグルが設定されていることを確認します。

    3. メークファイルテキストボックスの横にある 「オプション」 というラベルが付いたボタンを押します。

    図 7-3 に示すような 「メークファイルオプション」 ダイアログが表示されます。

 

    図 7-3 「メークファイルオプション」ダイアログ

Sun WorkShop Visual は、メークファイルを生成するために内部メークファイルテンプレートを使用します。内部メークファイル テンプレートには、各種プラットフォームおよび環境に関する情報が含まれています。 Sun WorkShop Visual は、テンプレート機能を使用して、複数のデザインから生成されたソースを 1 つのアプリケーションに構築するメークファイルを作成することもできます。

「メークファイルオプション」 ダイアログの「新規メークファイル」と「メークファイルテンプレート」トグルで、生成するメークファイ ルの種類を指定します。生成できるメークファイルは、1 つのデザインからソースを構築する簡易メークファイルと、ソースをさらに追加できるテンプレート付きメ ークファイルです。「デバッグ」トグルは、コンパイル時に -g フラグを使用するかどうかを制御します。

このダイアログの右側には、Sun WorkShop Visual が自動的にメークファイルを生成できるプラットフォームとコンパイラを示したリストがあります。このリ ストには、64 ビットのアプリケーションをコンパイルするためのオプションもあります。このダイアログの詳細について は、第 19 章「メークファイル生成」を参照してください。

この節では、学習用デザインからソースを構築することのできる簡易メークファイ ルの生成方法について説明します。テンプレートの使い方やメークファイルのカスタマイズなど、メークフ ァイル生成の詳細については、第 19 章「メークファイル生成」 を参照してください。メークファイルテンプレートのアプリケーションリソースを変更する方法については 、付録「アプリケーションのデフォルト」「生成」を参照してください。

    1. 学習用アプリケーションを実行する場合は、「新規メークファイル」トグルをオンにして、「メークファイ ルテンプレート」 トグルはオフにしてください。

    学習用のアプリケーションにはこれ以上ソースファイルは追加しないので、テンプ レートコメントは必要ありません。

    2. 必要に応じて「デバッグ」トグルをオフにできます。

    この学習用アプリケーションではデバッグは行いません。

    3. ダイアログの右側のリストで選択されている項目が、ターゲットプラットフォームおよびコンパイラと一致 していることを確認します。

    デフォルトで選択されている項目をそのまま使用できますが、一致しているかどう か分からない場合はシステム管理者に確認してください。このリストの詳細については、「メークファイルの種類のリスト」を参照してください。

    4. 「了解」 を押して変更内容を保存し、「メークファイルオプション」 ダイアログを閉じます。

    「生成」 ダイアログに戻ります。

コード生成オプション

ファイルを生成する前に、コード生成オプションを変更する必要があるかどうかを 必ず確認してください。「コード生成」ダイアログの最下部にある「オプション」ボタンを押すと、図 7-4 に示すダイアログが表示されます。

 

    図 7-4 「コードオプション」ダイアログ

このダイアログを使用して、リンク用コードの生成場所、リンク用コードを生成す るかどうかの制御、アプリケーションクラス名の指定、各種リソースの生成場所の制御を行うことができま す。以下で、それぞれのオプションを説明します。

アプリケーション・クラス名

アプリケーション・クラス名は、X リソースファイルを生成する際にリソース設定を識別するために使用されます。リソース値がシステム全体 の X リソースと混同されないようにするため、デフォルトの「XApplication」以外の名前を割り当てます。

リンクのコード生成

「リンク」というラベルが付いたオプションメニューを使用すると、リンクを基本 ソースファイルに生成する (コード生成)、スタブファイルに生成する、まったく生成しないのうちのいずれかを選択することができま す。または、リンクコード宣言だけを生成するよう選択することもできます。

リンク関数の一部として生成されたコードは、汎用関数セット (各種リンク用) およびこれらの関数の宣言で構成されています。関数は常に同じなので、アプリケーション全体で 1 セットだけ関数を生成すれば十分です。複数のデザインからコードを生成し、各デザインにリンクが含まれ ている場合は、関数の生成は 1 度だけで十分ですが、宣言はデザインごとに生成する必要があります。宣言は常に基本ソースファイルに生 成されます。

大域オブジェクト関数

Sun WorkShop Visual では、カラー、フォント、文字列、ピックスマップの各オブジェクトの大域アクセス関数を生成できます。 そのため、アプリケーションの複数のファイルでこれらのオブジェクトを共有することが可能です。「コー ドオプション」 ダイアログのトグルを使用して、カラー、フォント、文字列、ピックスマップの各オブジェクトを大域的に することができます。これらのトグルを選択すると、Sun WorkShop Visual は、オブジェクトを返すオブジェクトごとに関数を 1 つずつ作成します。Sun WorkShop Visual は、次のアルゴリズムを使用してオブジェクトの名前で関数の名前を構築します。

xdGet + <object_name> + <object_type> + Object

< object_name > にはオブジェクトにバインドした名前を指定します。< object_type > にはオブジェクトの型に合わせて 「 Color 」、「 Font 」、「 String 」、「 Pixmap 」 のいずれかを指定します。たとえば、「 Foreground 」 というカラーオブジェクトは、デフォルトでは次のアクセス名で生成されます。

xdGetForegroundColorObject

xdGet タグはリソースを介して上書きできます。

visu.globalObjectFunctionStart: xdGet

たとえば、次の場合を想定します。

visu.globalObjectFunctionStart: my

さらに、1 つのカラーオブジェクトが 「 Background 」 の場合、カラーの大域オブジェクトトグルがオンになっていると、次のコードが生成されます。

Pixel myBackgroundColorObject() {
	...
}

言語が MFC の場合は次のコードが生成されます。

CBrush myBackgroundColorObject() {
	...
}

デフォルト記憶領域の制御

Sun WorkShop Visual は、デフォルトで、作成される関数に対する局所変数として各ウィジェットを生成します。ウィジェットに 名前を指定しても、Sun WorkShop Visual は変数を大域的にします。名前付きウィジェットの場合、このデフォルト動作は、「コードオプション」 ダイアログで 「デフォルトの記憶領域」 オプションメニューを変更して制御できます。

ウィジェットがクラスに属している場合でも (クラスを作成しているウィジェットの子の場合など)、「コードオプション」 ダイアログで「デフォルトの記憶領域」オプションを選択していても選択していなくても、ウィジェットは 属しているクラスの変数を保持します。

名前付きウィジェットのデフォルトの記憶領域は 「大域」です。次のリソースを設定して、このデフォルトを変更できます。

visu.defaultStorageType:static

このリソースで使用できる値は次のとおりです。

  • 「(大域)」 (Sun WorkShop Visual で通常使用するデフォルト。この場合は「大域」)
  • 「大域」
  • 「常に表示」

コメントプレリュード

このオプションメニューは、生成されたコードの中でプレリュードを追加できる領 域の周囲に記述される、特別なコメントを参照します。プレリュードの追加については、「生成されたファイルのカスタマイズ : プレリュード」を参照してください。コメントの追加を「含む」(プレリュードが指定されているかど うかに関係なく)、「定義時にのみ含む」(すなわちプレリュードが指定された場合のみ)、「含まない」の うちのいずれで行うかを選択できます。デフォルトは「含まない」です。

以下の例は、シェルのマネージ前プレリュードのコメントを示しています。コメン ト内にプレリュードがないので、「含む」が選択されたオプションであると見なします。

/* visu: prelude for shell1: pre-manage >>> */
 
/* <<< pre-manage ends. */
XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
shell1 = XmCreateDialogShell ( parent, "shell1", al, ac );
	ac = 0;
	/* visu: prelude for form1: pre-create >>> */
 
	/* <<< pre-create ends. */
	XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++;
	form1 = XmCreateForm ( shell1, "form1", al, ac );

リソースの操作

「オプション」ダイアログの中央のパネルには各リソース型が列挙されています。< /P>

Motif の定義しているリソース型を以下に示します。

  • 文字列 (NULL 終了文字列、および XmString を含む)
  • フォント
  • カラー
  • ピックスマップ
  • トランスレーション
    「ウィジェット」メニューにあるコマンドで定義されます。「トランスレーションとアクション」を参照してください。
  • スカラー (ブール型を含む複数選択肢を持つリソース)
    ほとんどのリソースパネルでは、これらのリソースは「設定」のページにあります。
  • 整数 (スカラーではない整数リソース設定)
  • 実数 (浮動小数点数リソース値)

各リソースが生成されるファイルを指定することができます。あるリソースがソー スコードに生成された場合は、ソースコードにハードコードされるため、リソースファイルからは変更でき ません。通常は、ソースコードに生成されなかったリソースはすべて X リソースファイルに生成されます。X リソースファイルは、アプリケーションのユーザーが編集することのできるファイルです。Xリソースファ イルについての詳細は、「X リソースファイルの設定」を参照してください。

「コールバック」 とラベルのついたオプションメニューは、言語型に UIL を選択している場合だけに表示されます。このオプションで、コールバックを UIL コードと C コードのどちらに登録するか選択することができます。デフォルトでは UIL に登録されます。ただしクライアントデータを使用している場合は、構造型が UIL では定義されていないため、コールバックを C コードに登録する必要があります。C および UIL ファイルについては、「言語の設定」を参照してください。

学習の例を実行する場合は、「コードオプション」ダイアログで以下の変更を行い ます。

    1. 「リンク」オプションメニューから「コードに生成」を選択します。

    2. 「アプリケーション・クラス名」テキストボックスに、次のように入力します。 XDTutorial

    3. リソースの種類のオプションメニューが、図 7-5 に示すとおりに設定されていることを確認します。

    「コールバック」オプションメニューが表示されることに注意してください。この メニューは、言語型に UIL を選択している場合だけに表示されます。

    4. 「ウィジェットリソースをマスク」ラジオボタンがオンになっていることを確認します。

    このラジオボタンの意味については、「リソースのマスク」で説明します。

    5. 「了解」をクリックします。

 

    図 7-5 コード生成のリソース設定 (言語型 UIL)

リソースのマスク

リソースパネルには、図 7-6 に示すように各リソースの横にラベルの付いていないトグルがあります。

 

    図 7-6 リソースパネルのマスクトグル

これらのトグルは、「コードオプション」ダイアログの「ウィジェットリソースを マスク」ラジオボタンおよび「大域リソースのみマスク」ラジオボタンとともに機能します。これらのトグ ルをすべて使用すると、個別にリソースの生成を制御することができます。

ウィジェットリソースのマスク

「ウィジェットリソースをマスク」を設定している場合は、以下の説明を参照して ください。

個々のリソースがリソースパネルトグルを設定していない場合は、「コード生成」 ダイアログ内の該当する種類のオプションメニューに従ってリソースが生成されます。たとえば、「ラベル 」のリソースパネルのトグルがオフに設定されている場合は、「文字列」というラベルが付いたオプション メニューで指定されたファイルに対して、ラベル文字列が生成されます。

個々のリソースがリソースパネルトグルを設定している場合は、「コード生成」ダ イアログ内のオプションメニューによって該当する種類に指定されたファイルとは「反対の」ファイルに対 して、リソースが生成されます。たとえば、リソースパネルトグルをオンにした状態で「整数」オプション メニューが「コード」に設定されている場合はリソースファイルに対して、また、オプションメニューが「 リソースファイル」に設定されている場合はコードファイルに対して整数リソースが生成されます。

言い換えると、生成ダイアログのオプションメニューが規則を確立し、リソースパ ネルにあるトグルがこの規則の例外を識別します。

大域リソースのみマスク

「大域リソースのみマスク」を設定している場合は、以下の説明を参照してくださ い。

生成ダイアログのオプションメニューは、この段階で大域オブジェクト (フォント、カラー、ピックスマップオブジェクト) にのみ適用します。これらのオブジェクト (のみ) は、すべてのリソースについて 「ウィジェットリソースのマスク」で記述したとおりに制御されます。

その他のすべてのリソースは、個々のリソースパネルトグルによってのみ制御され ます。それらのリソースは、リソースパネルトグルがオフの場合はコードファイルに、リソースパネルトグ ルがオンの場合はリソースファイルに生成されます。

マスク効果の例

多くの場合、設計者は編集が容易に行えるように、ほとんどの文字列を X リソースファイルに生成しようとします。これにより、X リソースファイルを編集するだけで、他の言語のアプリケーションを生成することができます。このために は、文字列を X リソースファイルに生成すると効果的です。しかし、会社の住所など、ユーザーが変更できないようにした い文字列もいくつか存在します。これらの文字列リソースは、個々のマスクトグルを設定することにより、 ハードワイヤすることができます。

同様に、企業のイメージカラーとして決まっている色を除く色をユーザーが編集で きるようにしたい、という場合もあるでしょう。これを行うには、会社のイメージカラーを制御する個々の リソースについてマスクトグルを設定します。コードの生成時には、リソースファイルにグループ化して色 を生成します。Sun WorkShop Visual はタグの付けられたリソースをソースコードにハードワイヤします。

デフォルト設定

リソースパネル上の括弧内に示されるデフォルトリソース値は、どちらのファイル にも生成されることはありません。この場合、Motif は実行時にリソース値を計算します。結果は、プログラムを実行するプラットフォームによっては、インタ フェース構築時に確認したデフォルト値と異なる場合があります。デフォルト値を使用すると、多くの場合 はアプリケーションに移植性を持たせる際に役立ちます。

コード生成ダイアログの終了

生成したいファイルおよびそのオプションの設定を「コード生成」ダイアログで終 了したら、「適用」ボタンを押して設定を保存するか、「生成」ボタンを押してすぐにファイルを生成しま す。「適用」ボタンを押した場合は、生成する準備が完了したときに「コード生成」ダイアログを呼び出し て「生成」ボタンを押します。または、「コード生成」ダイアログを表示せずにツールバーの関連するボタ ンを選択して、生成することもできます。この場合、最後に適用した設定が使用されます。「生成時に適用 」トグルを設定して「生成」ボタンを押すと、「適用」ボタンを押して「生成」ボタンを押した場合と同様 の処理が行われます。

学習例でのコード生成

生成したいファイルおよびそれに関連するオプションを生成ダイアログで設定した ら、コードを生成し、プロトタイプのアプリケーションを実行します。

    1. プロトタイプですべてのファイルを生成するには、生成ダイアログを表示して「生成」ボタンを押します。

    2. 「コード生成」ダイアログ上で、現作業ディレクトリが、「コ−ド生成」ダイアログで指定した (ファイルが生成された) ディレクトリであることを確認します。

    3. $VISUROOT に Sun WorkShop Visual のインストールディレクトリのパス名を設定します。

    4. プロトタイプを構築するには、次のように入力します。
    make

    5. X が X リソースファイルを見つけられることを確認します。

    「X リソースファイルの設定」を参照してください。

    6. プロトタイプを実行するには、次のように入力します。
    icecream

 

    図 7-7 実行中のインタフェースのプロトタイプ

ダイナミックディスプレイの場合と同じように、プロトタイプにあるすべてのウィ ジェットが機能します。ボタンのクリック、メニューのプルダウンなどを行うことができます。さらに、プ ロトタイプにリンクを組み込むこともできます。画面右側にあるメニューをプルダウンしてその中の 1 つの項目をクリックすることにより、ヘルプ画面を表示することができます。ヘルプ画面内のボタンをクリ ックすると、ヘルプ画面が閉じます。

プロトタイプでも、 exit_button がクリックされると quit() が呼び出されますが、 quit() を機能させるためのコードがまだないため、動作は何も実行されません。このコードの追加については、以 下のセクションで説明します。プロトタイプを確認し終わったら、プロトタイプを終了します。

    7. ウィンドウマネージャを使用してメインウィンドウを閉じます。

コールバック関数の追加

quit() に関数を追加すると、本章での学習は完了です。Sun WorkShop Visual では、スタブファイル内のコールバックを直接編集する手段が提供されています。

Sun WorkShop Visual 内でのコールバックコードの編集

「コールバック」ダイアログには「コードを編集」というラベルが付いたボタンが あります。このボタンの横にあるオプションメニューで、Sun WorkShop Visual にスタブファイルの使用言語を指示することができます。これにより、C と C++ の両言語を生成している場合に曖昧さが生じることを防ぐことができます。通常は、Sun WorkShop Visual が正しい値を選択するため、このオプションメニューを変更する必要はありません。「コールバック」ダイ アログについては、「コールバックのデザイン」を参照してください。

「コードを編集」 ボタンを押すと、Sun WorkShop Visual は Sun WorkShop 編集サーバーを使用します。別の編集ウィンドウにスタブファイルが開かれて、選択したコールバックの関 数角括弧の中の挿入ポイントに入力できます。他のコールバックを選択すると、常に正確な場所に入力でき るように、挿入ポイントがファイル内を移動します。「編集サーバー」 ウィンドウにまだ保存していない変更内容がある場合にスタブファイルの生成を試みると、まず変更内容を 保存するように促されます。

スタブファイルの編集の前に、Sun WorkShop Visual は最後のスタブファイル生成以降にデザインに変更があったかどうかをチェックします。変更が見つかった 場合は、コードを再生成するかを編集の前に尋ねます。再生成しない場合は、ファイルを編集することはで きません。

スタブファイルを再生成しようとするときに編集ウィンドウに保存していない変更 がある場合は、まずそのファイルを保存するかどうかを尋ねるメッセージが表示されます。最初にファイル を保存すると、追加したコールバックコードはすべて保持されます。詳細は、「追加のスタブファイル生成」を参照してください。変更を保存しないで再生成するように選 択すると、最後の保存以降の変更はすべて失われます。

コールバックの編集

Sun WorkShop Visual を使用せずにコールバックを編集する場合は、次のようにします。

  • テキストエディタを使用して stubs.c を開き、手順 5 へ進みます。

Sun WorkShop Visual を使用してコールバックを編集する場合は、次のようにします。

    1. ウィジェット exit_button を選択します。

    2. ツールバー上の「コールバック」ボタンをクリックするか、「ウィジェット」メニューから「コールバック 」を選択します。

    3. コールバックのリストから quit() を選択します。

    4. 「コードを編集」というラベルのついたボタンを押します。

    ファイル stubs.c が開きます。

スタブファイルの編集

quit() に対してのコードは次のようになります。

void 
quit (Widget w, XtPointer client_data, XtPointer xt_call_data )
{
	XmPushButtonCallbackStruct *call_data = 
(XmPushButtonCallbackStruct *) xt_call_data;
}

    5. quit() の中括弧 {} の間のテキストを次の内容で置き換えます。
    exit (0);

    6. ファイルを保存します。

    7. 実行可能モジュールを作り直し、プログラムを実行します。

    詳細は 「学習例でのコード生成」を参照してください。

    「Exit」ボタンが機能するようになります。

    8. プログラムを終了するには、インタフェースの Procedures (procedure_cascade) メニューをプルダウンして、「Exit」ボタンをクリックします。

コールバックの詳細は、コールバックに引き渡される引数、およびデザイン内のウ ィジェットの呼び出し方法や操作方法も含め、「コールバック関数」で説明します。

これで、学習の例は終了しました。本章の残りでは、前節で取り上げた問題をさら に詳細に説明します。

追加のスタブファイル生成

後に続けて同じスタブファイルを生成する場合、Sun WorkShop Visual はファイル内の特殊なコメントから、どのコールバックおよびメソッドがすでに生成されているかを判断し ます。このようにして、ユーザー独自のコードをスタブに追加すると、スタブは上書きされません。

Sun WorkShop Visual は、新しいコールバックまたはメソッドをスタブファイルの末尾に追加します。新しいスタブファイルが生 成された場合には、古いバージョンは、指定された名前に接尾辞 .bak の付いたファイルにコピーされます。

    注 - Sun WorkShop Visual 内でウィジェットからコールバックを削除した場合は、スタブファイルの中にコールバックのスタブが残さ れます。ルーチンを削除したい場合は、そのスタブファイルを開いて、コールバックルーチンの上にあるコ メントを削除する必要があります。

以下に、quit という名前のコールバックを 1 つ含むスタブファイルの例を示します。

/*
** Generated by Sun WorkShop Visual
*/
プレリュードの開始
/*
** Sun WorkShop Visual generated prelude.
** Do not edit lines before "End of Sun WorkShop Visual generated prelude"
** Lines beginning ** Sun WorkShop Visual Stub indicate a stub
** which will not be output on re-generation
*/
/*
**LIBS: -lXm -lXt -lX11
*/
プレリュードの終了
/* End of Sun WorkShop Visual generated prelude */
スタブを示す特殊コメント
/*
** Sun WorkShop Visual Stub about_sh_c::DoSetText
*/
void
quit (Widget w, XtPointer client_data, XtPointer xt_call_data )
{
		XmPushButtonCallbackStruct *call_data = 
			(XmPushButtonCallbackStruct *) xt_call_data;
}

スタブファイルのコメント

ファイルの先頭に、Sun WorkShop Visual が読み出し、最終的には破棄するプレリュードがあります。このプレリュードは常に新しく再生成されます 。Sun WorkShop Visual は、すべてのスタブの前にコールバックまたはメソッドの名前を示すコメントを生成します。このように、 Sun WorkShop Visual は既存のスタブファイルを読み出して、新たに生成する必要のあるスタブを判別します。

    注 - スタブを再生成する場合を除いて、これらのコメントを変更しないでください。

コールバックスタブの再生成

Sun WorkShop Visual にスタブを再生成させるには、スタブの前にあるコメントとスタブ自体を取り除いてください。どちらか一 方だけを取り除いた場合には、以下のような結果になります。

  • スタブを取り除き、コメントを残している場合には、スタブは生成されない
  • コメントを取り除き、スタブを残している場合には、同じスタブが重複して生成さ れる

スタブを再生成すると、ルーチンの内容が失われることに注意してください。

特殊コメントがコールバックまたはコールバック・メソッドに一致しなくなった場 合でも、Sun WorkShop Visual は古いスタブを取り除きません。

ファイル全体の再生成

何らかのコールバックの削除、あるいは名前の変更などにより、古いものが生成さ れ続けてしまい、ファイルが不要コードで一杯になってしまうことがあります。このような場合には、Sun WorkShop Visual にファイル全体を新しく再生成させる必要があります。これを行うには、単純にスタブファイルおよび接尾 辞 .bak の付いたファイルを取り除くか、その名前を変更します。Sun WorkShop Visual は、スタブファイルに指定した名前を見つけることができない場合は、新しいファイルを生成します。

基本モジュールの分析

基本コードモジュールには、上から下への順序で以下の部分が含まれています。

この節では、ファイル内のコードを分析します。

◆ テキストエディタを使用して icecream.c を開き、それを読みながら分析します。

ファイルのオプション部分は制御パネルにあるトグルを設定することにより組み込 んだり、外したりすることができます。これらのトグル、およびオプション部分の組み込みの長所と短所に ついては、「コード生成オプション」で説明します。

ヘッダー部分

基本モジュールには、ヘッダー項目が以下に示す順序で含まれています。

  • モジュール見出し (存在する場合)
  • Sun WorkShop Visual の見出し
  • #include 文 (必要に応じて)
  • モジュール・プレリュード (存在する場合)

ファイルには、モジュール見出しやモジュール・プレリュードはまだ必要ありませ ん。これらの場所に挿入するコードは、 Sun WorkShop Visual の中から指定することができます。コードの指定の手順については、「生成されたファイルのカスタマイズ : プレリュード」で説明します。

いくつかの標準 Sun WorkShop Visual コメントの後、モジュール内のコード に必要な #include 文のリストがあります。 #include 文はオプションであり、「コード生成」ダイアログのトグルにより制御されます。「基本ソースファイルの設定」を参照してください。

また、Sun WorkShop Visual が使用する基底クラスを定義するために、Sun WorkShop Visual 独自のヘッダーファイルをインクルードする必要があります。インクルードするファイルの名前を変更した い場合や、基底クラスのヘッダーファイルをインクルードしない場合に変更する必要のあるアプリケーショ ンリソースの詳細は、「生成」を参照してください。

リンク関数またはリンク宣言

モジュールにはリンク関数のためのコードが含まれます。以下のコード部分では、 代表的なリンク関数を示します。

void XDunmanage_link ( Widget w, XtPointer client_data, XtPointer call_data )

このコードの生成はオプションであり、「コード生成」ダイアログによって制御さ れます。「コード生成オプション」を参照してください。

変数宣言

この部分では、デザイン内で大域的に定義されたすべてのウィジェットが宣言され ます。以下に代表的な行を示します。

Widget exit_button = (Widget) NULL;
Widget help_cascade = (Widget) NULL;

ここでは大域的なウィジェットだけが宣言されます。デフォルトでは、ウィジェッ トの有効範囲は局所的となっています。局所的ウィジェットは、その親であるシェルを作成する関数におい て定義されるため、アプリケーションのその他の場所で参照することはできません。ウィジェットを大域的 にするためには、次のどちらかの操作を行います。

  • コアリソースパネル上でウィジェットを大域的として指定する
  • ウィジェットに明示的な名前を指定する

アプリケーションシェルおよび最上位シェルの変数名は、Sun WorkShop Visual では常に大域的であるため、それらを局所的にすることはできません。別の種類のシェルの詳細は、「シェルの型」を参照してください。

変数名

変数名は固有のものでなければなりません。変数名が既存のウィジェット名と重複 するウィジェットをデザインに「読む」または「ペースト」を行うと、Sun WorkShop Visual は自動的に重複を取り除き、ウィジェットの型に数値を添えた形式 、たとえば shell4 form5 などの形式をとる新しい局所的な名前を割り当てます。

規約によりウィジェットの変数名は小文字で始めます。これにより、Motif の宣言との衝突を避けることができます。

作成関数

デフォルトにより、Sun WorkShop Visual はデザインのシェルウィジェットの作成関数を生成します。作成関数は、生成されるコードの中心部となり ます。各作成関数では以下の動作が行われます。

  • シェルウィジェットそのものを作成する
  • シェルおよびその子の子を作成して管理する
  • シェルのすべての子に対してハードワイヤされたすべてのリソースを設定する
  • コールバックを追加し、(オプションで) コールバックを持つシェルの子にリンクを追加する

作成関数はシェルを表示しません。通常は、 main() 関数またはコールバック関数にある関数呼び出しによってウィンドウが表示されます。

デフォルトでは、作成関数はシェルの変数名にもとづいて、 create_ <シェル名> の形式をとります。デザインには、 help_window という名のダイアログシェルと、 myFirstShell という名のアプリケーションシェルがあります。したがって、作成関数も create_myFirstShell create_help_window の 2 つが存在します。作成関数の名前は、コードプレリュード (本章で後述) において変更することができます。

create_help_window は、次の形式をとります。

void create_help_window (Widget parent)
{
	. . .
}

関数の本文には、ダイアログシェルそのものを作成する関数呼び出しが含まれてい ます。

help_window = XmCreateDialogShell ( parent, "help_window", al, ac );

ダイアログシェルはアプリケーションシェルとは異なり、親である別のシェルに依 存しています。様々なシェルの型と個々の動作の詳細は、「シェルの型」を参照してください。

create_help_window はまた、シェルのすべての子を作成します。ユーザーが明示的変数名を指定した子のダイアログテンプレー トが作成され、大域的変数に割り当てられます。

dialog_2 = XmCreateMessageBox ( help_window, "dialog_2", al, ac );

ユーザーにより明示的に命名されていないラベルは、以下に示すように局所的変数 に割り当てられます (コード内の変数名は異なる場合があります)。

label1 = XmCreateLabel ( dialog_2, "widget14",al,ac);

アプリケーションシェルの作成関数である create_myFirstShell は、異なるタイプのシェルであるため引数が異なります。

void create_shell_1 (Display *display, char *app_name, int app_argc, char **app_argv)
{
. . .
}

これらの引数についての説明は、「作成の前プレリュード」を参照してください。

この関数は create_help_window に似ていますが、メインウィンドウの方がヘルプウィンドウよりも多くの子ウィジェットを持っているため 、メインウィンドウの関数の方がより長くなっています。

コールバック関数

基本モジュールにはコールバック関数そのものは含まれていません。そのかわり、 基本モジュールは各ウィジェットのコールバック・リストに、指定されたコールバックを追加します。 create_myFirstShell には、次に示す行が含まれます。これらの行は exit_button を作成して quit コールバックを追加するためのものです (これらの行は物理的に離れていても構いません)。

exit_button = XmCreatePushButton ( rowcoll, "exit_button", al, ac );
. . .
XtAddCallback (exit_button, XmNactivateCallback, quit,NULL);

quit() の外部宣言は、ソースファイルの早い時点で生成されます。

ウィジェット help_button にある「表示」リンクは、Sun WorkShop Visual 関数 XDmanage_link に活性化コールバックを挿入します。 help_button を作成してリンクを追加するコードは、 exit_button を作成したそのコールバックを追加するコードに似ています。

help_button = XmCreatePushButton ( rowcol2, "help_button", al, ac );
. . .
XtAddCallback (help_button,XmNactivateCallback, XDmanage_link, (XtPointer) &xd_links[0] );

main() 関数プログラム

生成ダイアログにおいて「メインプログラム」トグルが設定されている場合には、 別のファイル、または基本モジュールの終わりに最小の main() 関数が生成されます。 main() 手続きを別ファイルに生成する方法については 「メインプログラムファイルの設定」を参照してください。

Sun WorkShop Visual の main() 関数では、以下の動作が行われます。

  • X サーバーへの接続を開く
  • X ツールキットを初期化する
  • 最初のアプリケーションシェルのための作成関数を呼び出す
  • デザイン内のその他のシェルのための作成関数を呼び出す
  • XtRealizeWidget() を呼び出して最初のアプリケーションシェルを表示する
  • XtAppMainLoop() (戻ることがない) を呼び出す
  • exit() を呼び出す (このコード行は、形式を整えるためだけのもので実行はされ
    ない)

いままで確認してきたように、この main() 関数によって、インタフェースの実行とその動作の確認をすることができます。多くのアプリケーションの 場合、ほとんどの関数はコールバックで処理されるため、 main() に追加する必要があるコードはほとんどありません。しかし、アプリケーションの他の部分を初期化する必 要がある場合には、別の main() 手続きのソースファイルをコード生成ダイアログで一度だけ生成し、そのファイルを編集する必要がありま す。終了用のコードは、アプリケーションを終了させるために呼び出されるコールバック関数に入れるべき です。

◆ ファイル icecream.c を閉じます。

リソースファイルの構文

生成されたリソースファイルのデフォルトの構文は、以下のようになります。

<アプリケーション名>*<ウィジェット名>.<リソース>: <値>

識別しやすくするために、ウィジェットの変数名 (ウィジェット名ではない) をリソースリストの前にコメントで示します。しかし、ウィジェットのグループが 1 つのウィジェット名を共有する場合には、グループからの変数名が 1 つだけ表示されます。また、リソースがまったくファイルに生成されていないウィジェットに対してもコメ ントが生成されます。

構文の例

  • X リソースファイル icecream.res をテキストエディタで開き、内容を確認します。

以下に示すファイルの部分には、文字列リソースだけが含まれています。

! button1
XDTutorial*button1.labelString: Cone
 
! button2
XDTutorial*button2.labelString: Dish
 
! button3
XDTutorial*button3.labelString: Cancel
 
! procedure_cascade
XDTutorial*procedure_cascade.labelString: Procedures
 
! button4
XDTutorial*button4.labelString: Wash Dishes...
 
! button5
XDTutorial*button5.labelString: Count Money
 
! exit_button
XDTutorial*exit_button.labelString: Exit
XDTutorial*exit_button.accelerator: Ctrl<Key>E
XDTutorial*exit_button.acceleratorText: Control+E
 
! help_cascade
XDTutorial*help_cascade.labelString: Help
XDTutorial*help_cascade.mnemonic: H
 
! help_button
XDTutorial*help_button.labelString: About This Layout
XDTutorial*help_button.mnemonic: A

エンドユーザーは、X リソースファイル内で値を編集することによって、これらの文字列を変更することができます。たとえば、 2 行目を次のように変更することができます。

XDTutorial*procedure_cascade.labelString: Closing Up

また、ユーザーのホームディレクトリにある .Xdefaults ファイルを使用して、このファイルの値を書き換えることもできます。

リソース結合へのインクルード

デザインのウィジェットに対して「リソースの結合にインクルード」トグル (コアリソースパネルの「コード生成」ページ) を設定している場合は、リソースファイルの様子が多少異なります。Sun WorkShop Visual がデフォルトでリソースファイル用に生成する構文は非常に汎用的で、アプリケーション全体で指定したウ ィジェット名を持つすべてのウィジェットに適用します。同じ名前を持つウィジェットが複数ある場合がよ くあります。密な結合を使用すると、ウィジェットリソースに関してより幅広く制御することができます。

    注 - ここでは、生成されたリソースファイルの構文だけを説明します。密な結合の詳細 は、「密な結合」を参照してください。

「密な結合」の例を使用すると、次のような行が生成されます。

XDTutorial*FirstForm*OkButton.labelString: Ok

緩い結合

緩い結合を設定している場合は、生成されたリソースファイルの最上部に表示され ます。緩い結合は個々のウィジェットを参照しないため、その構文は多少異なります。

    注 - ここでは、リソースファイルの構文だけを説明します。緩い結合の詳細は、「緩い結合」を参照してください。

「緩い結合」の例を使用すると、リソースファイルに次のような行が生成されます。

XDTutorial*XmDialogShell*MyForm.MyButton.labelString: Bound

共有リソース値

ウィジェットを完全に識別するためには、X はウィジェット自身の名前に加え、階層内のすべての祖先を示すリストを必要とします。生成された X リソースファイルでは、Sun WorkShop Visual は特定の祖先のリストの代わりに、ワイルドカード (*) を使用します。このため、各ウィジェットはアプリケーション名とウィジェット名だけで区別され、ウィジ ェット名を共有するウィジェットは X リソースファイルに生成されたリソースも共有します。

次に示す行は、Sun WorkShop Visual 自身の X リソースファイルから取り出したものです。

/* ダイアログのボタン */
visu*apply_button.labelString: 適用
visu*cancel_button.labelString: 閉じる

Sun WorkShop Visual には、 apply_button というウィジェット名を持つ複数のボタンがあります。これらのボタンはすべてラベル文字列「適用」を共 有しています。同様に、 cancel_button という名前のすべてのボタンはラベル文字列「閉じる」を共有しています。これらの文字列は、X リソースファイルにある 1 行を編集することにより、すべてのボタンについて一度に変更することができます。

また、ソースファイルに生成したリソースは、ウィジェットが名前を共有している 場合でも、各ウィジェットごとに常に設定されます。

ファイルの整理

Sun WorkShop Visual では、ユーザーの好みに合わせて柔軟にファイルを並べておくことができます。そのため、必要なコードが すべて重複することなく含まれ、アプリケーションへのリンクが正しく行われるよう、ユーザー自身が配慮 する必要があります。

また、コードを生成した後でも、 Sun WorkShop Visual で作成したインタフェースを変更できるようなファイルの構成にしておく必要があります。どのように変更 してもコードおよび (おそらく) リソースファイルを再生成する必要があります。それまでに行なったプログラム作業を上書きしないように 、ファイルとディレクトリを設定してください。

これらの点に考慮しながら、本節ではコードファイルを組織化する方法を説明しま す。

別ディレクトリの使用

それぞれの Sun WorkShop Visual アプリケーションに対して個別のディレクトリを使用するようにしてください。デザインを開始する前にデ ィレクトリを作成します。デザインファイルの保存およびすべてのコードファイルとリソースファイルの生 成は、そのディレクトリ上で行います。

生成されたファイルを変更しない

エラーを防ぐために、ユーザー独自のプログラムはすべて、Sun WorkShop Visual で生成された基本モジュールと X リソースファイルの外で行います。コードプレリュード、モジュール・プレリュード (「生成されたファイルのカスタマイズ : プレリュード」参照) および生成ダイアログにあるさまざまなスイッチを使用すると、Sun WorkShop Visual 内から基本モジュールを制御することができます。同様にリソースプレリュードを使用すると、X リソースファイルを調整することができます。これらのファイルを Sun WorkShop Visual の外で編集しない場合は、デザインを変更する際に、今まで行なった作業を犠牲にすることなくファイルの 再生成を行うことができます。

main() を別ファイルに生成

生成された main() 手続きは、ほとんどの場合編集しなければなりません。そこで、 main() を別のファイルに生成することをお勧めします。 main() のファイル (メインプログラムファイルと呼びます) は自由に編集することができます。いったんメインプログラムファイルに変更を加えたら、そのファイルは 再生成しないように注意してください。 main() プログラムを別のファイルにする方法については、「メインプログラムファイルの設定」を参照してください。

スタブファイル

生成された他のファイルとは異なり、スタブファイルは編集されることを前提とし ています。再度生成された場合でも、スタブファイルに加えた変更は保持されます。コールバックの追加、 編集、および内容理解については、第 6 章「インタフェースの起動 : ユーザーコードの追加」を参照してください。スタブファイルの編集については 「コールバック関数の追加」を参照してください。

リンクを置く場所

アプリケーションがリンクを使用する場合には、リンク関数とリンク関数宣言をコ ードファイルかスタブファイルに生成する必要があります。

アプリケーションが複数のデザインファイルから生成されたコードを使用する場合 は、すべての基本モジュールにリンク関数宣言を生成し、1 つのファイルにのみリンク関数を生成します。

インクルードファイルを置く場所

構築手順で基本モジュールとアプリケーションコードのコンパイルを別々に行う場 合には、基本ソースコードモジュール用の「ヘッダーファイルをインクルード」トグルをオンにする必要が あります。これまでの学習では、この手順を使用しました。詳細は 「基本ソースファイルの設定」を参照してください。

#include 指令を作成してアプリケーションのコードファイルに生成されたコードを組み込み、すべてのコードを一緒 にコンパイルするという方法もあります。この場合は、基本モジュールに対してのみ「ヘッダーファイルを インクルード」をオンにして、スタブファイルを生成する際にオフにします。

生成されたファイルのカスタマイズ : プレリュード

Sun WorkShop Visual を使用すると、Sun WorkShop Visual の生成した基本ソースファイルまたは X リソースファイルを編集してユーザー自身のコード (ここではプレリュードと呼ぶ) を追加することができます。Sun WorkShop Visual にプレリュードを入力すると、Sun WorkShop Visual がそのプレリュードを認識し、コードの中の適切な場所に挿入します。プレリュードには、コードを挿入す る場所によって区別される、いくつかの種類があります。

モジュール・プレリュード

「モジュール」メニューにある「モジュール・プレリュード」コマンドを使用する と、図 7-8 に示すダイアログを使用して、ユーザー自身が作成したコードに見出しプレリュード、モジュール・プレリ ュード、およびリソース・プレリュードを入力することができます。

 

    図 7-8 「モジュール・プレリュード」ダイアログ

学習例のテキストに表示されるトグルの 1 つを選択すると、その種類のプレリュードを編集することができます。コードプレリュードは次の 2 つの方法で追加することができます。

「コードを直接編集」トグルを使用して、上記の方法のうち希望する方法を指定し ます。「コードを直接編集」トグルをオンにした場合は、コードを追加できるように、生成されたコードの ファイルが開かれます。詳細については、「編集機能の使用」を参照してください。

「コードを直接編集」トグルをオフにしている場合は、ダイアログの右側に大きな テキストウィジェットが表示されます。ここに、コードを入力します。テキストエディタを使用して別のコ ードを入力するときと同じように、正しくコードを入力してください。すなわち、行末マーカー、括弧規約 などを含め、対象となる言語の規則および規約に準拠する必要があります。プレリュードの最終行の後は、 必ず Return キーを押してください。

見出しプレリュード

見出しプレリュードは、メインプログラムファイル、コードファイル、外部宣言フ ァイル、スタブファイルの先頭に挿入されます。通常は、モジュール見出しにはプログラム名、SCCS ID またはバージョン番号などの情報のコメントが含まれます。

モジュール・プレリュード

モジュール・プレリュードは、生成されたコードファイルの先頭で Sun WorkShop Visual の生成した #include 指令 (存在する場合) の直後に挿入されます。モジュール・プレリュードは、コードに必要な #define または #include 指令あるいは外部宣言を設定することができます。モジュール・プレリュードは、基本モジュールにのみ生 成され、スタブファイルには生成されません。

リソース・プレリュード

リソース・プレリュードは X リソースファイルの先頭に挿入され、以下の構文でアプリケーションのリソース設定、つまり、個々のウィ ジェットではなくアプリケーション全体に対する設定を指定します。

<アプリケーション名>*<リソース>: <値>

たとえば、次のように指定します。

visu*symbolFont: -*-symbol-medium-r-normal--14*

このようなリソース設定は、アプリケーション内のすべてのウィジェットに適用さ れますが、個々のウィジェットまたは共通の名前を持つウィジェットのグループでの詳細なリソース設定に より書き換えられます。

リソースプレリュードにコメント行や SCCS または RCS キーワード を指定することもできます。

モジュール全体および個々のウィジェットに対する緩い結合の設定方法については 、「緩い結合」を参照してください。

コードプレリュード

モジュール・プレリュードがモジュール全体に適用されるのに対し、コードプレリ ュードは個々のウィジェットに割り当てられます。つまり、コードプレリュードが挿入された後に、ウィジ ェットが作成されてマネージされます。コードプレリュードを追加するには次のようにします。

    1. コードに追加するウィジェットを選択します。

    2. 「ウィジェット」メニューから「コードプレリュード」を選択します。

    図 7-9 に示す「コードプレリュード」ダイアログが表示されます。

 

    図 7-9 コードプレリュードダイアログ

「コードプレリュード」ダイアログ

「コードプレリュード」ダイアログには、選択したウィジェットに対して生成され たコードを表わすテキストが表示されます。このコードは見本用で、プレリュードが追加される位置を確認 することができます。これは、実際の生成されたコードではありません。

このダイアログには、C コード (「コードプレリュード」ラベル) 用と、C++ (「メソッドプレリュード」ラベル) 用の 2 つの領域があります。テキストの両方の領域内にあるトグルを使用して、各種プレリュードを編集するかど うかを選択することができます。C で使用できるコードプレリュードには、「作成の前」と「マネージの前」の 2 種類があります。詳細は、「作成の前プレリュード」および 「「マネージの前」プレリュード」を参照してください。

また、C++ で使用されるメソッドプレリュードには「公開」、「限定公開」、「非公開」 の 3 種類があります。コールバック・メソッドのアクセス制御の詳細は、「メソッドのアクセス制御」を参照してください。ただし、プレリュードではメソッドとデー タメンバーを両方とも追加することができます。学習の例の中で、コードプレリュード・ダイアログを使用 してデータメンバーを追加する方法を、「クラスメンバーをプレリュードとして追加」で説明します。

「コードプレリュード」または「メソッド・プレリュード」をクリックすると、対 応するテキスト領域がフォールドされ、別の種類のプレリュードだけが表示されます。

コードプレリュードの追加

見本のテキストに表示されるトグルの 1 つを選択すると、その種類のプレリュードを編集することができます。コードプレリュードは、次の 2 つの方法で追加することができます。

  • 生成されたコードの編集
  • ダイアログへのコードの入力

「コードを直接編集」トグルを使用して、上記の方法のうち希望する方法を指定し ます。「コードを直接編集」トグルをオンにしている場合は、コードを追加できるように生成コードが開か れます。詳細については、「編集機能の使用」を参照してください。

「コードを直接編集」トグルをオフにしている場合は、ダイアログの右側に大きな テキストウィジェットが表示されます。ここに、コードを入力します。テキストエディタを使用して別のコ ードを入力するときと同じように、正しくコードを入力してください。行末マーカー、括弧規約などを含め 、対象とする言語の規則および規約に準拠する必要があります。

作成の前プレリュード

「作成の前」プレリュードは、選択されたウィジェットが作成される前に、コード に挿入されます。

選択されたウィジェットがシェルウィジェットではない場合は、「作成の前」プレ リュードはウィジェットの親であるシェルの作成関数に挿入され、制限されることなく任意のコードを提供 することができます。「作成の前」プレリュードは一般的に、ウィジェット作成時にのみ設定することがで きるリソースを設定する場合に使用されます。シェル用の「作成の前」プレリュードは異なっており、「シェルの作成の前プレリュード」で説明します。以下に示す生成されたコードの断片は、「 作成の前」プレリュードが追加される場所を示します。

		...
/* visu: prelude for rowcol1: pre-create >>> */
	ここに「作成の前」プレリュードを入力
/* <<< pre-create ends. */
rowcol1 = XmCreateRowColumn ( shell11, "rowcol1", al, ac );
		...

「コードを直接編集」を選択して、かつ生成コードを直接編集している場合は、コ ードを必ず特別なコメントに囲まれた領域に入力してください。こうしておくと、コードの再生成時にこの コードが保持されます。特別なコメントは変更および削除しないでください。

シェルの作成の前プレリュード

シェル用のコードプレリュードは、他のウィジェットのコードプレリュードとは多 少異なります。「作成の前」プレリュードは、シェルの作成関数の関数ヘッダーを置き換えるために使用さ れます。そして必要に応じて、追加引数を定義することができます。

デフォルトの関数ヘッダーでは、生成された関数の本体は引数として渡される変数 の 1 つまたは複数を参照します。これらの変数はスコープ内に存在している必要がありますが、引数として引き 渡すか、または大域変数として宣言するかを選択することができます。以下の変数もスコープ内に存在して いる必要があります。

アプリケーションシェルに必要な変数
Display *display;
char *app_name;
int app_argc;
char **app_argv;
ダイアログシェルまたは最上位シェルに必要な変数
Widget parent;
UIL に対する C に必要な変数
MrmHierarchy hierarchy_id;
MrmCode *class;

シェルウィジェットに生成前プレリュードを指定しないと、作成関数名はデフォル トで create_ <ウィジェット変数名> に設定され、引数は必須引数だけになります。

    注 - シェルに作成の前プレリュードを指定すると、生成されたデフォルトの main( ) 関数プログラムの作成関数の呼び出しが不正になる場合があります。

注意 - シェルの「作成の前」プレリュードは Motif XP および MFC コードでは直接編集することができません。コードプレリュードにはプラットフォーム独自のコードが含ま れているため、通常クロスプラットフォームのデザインにはコードプレリュードを使用することはお勧めし ません。

「マネージの前」プレリュード

「マネージの前」プレリュードは、「作成の前」プレリュードの少し後方の、ウィ ジェットコールバックが追加される直前に挿入されます。このプレリュードは、コールバックに対してクラ イアントデータを設定する場合などに使用されます。その他には、テキストウィジェットの値の設定、スク ロールリストウィジェットへの項目の挿入、あるいはその他の動的初期化などに使用されます。以下の例は 、マネージの前プレリュードが挿入される個所を示す、生成されたコードの断片です。

		...
/* visu: prelude for shell1: pre-manage >>> */
	ここに「マネージの前」コードを入力
/* <<< pre-manage ends. */
XtSetArg(al[ac], XmNallowShellResize, TRUE); ac++;
XtSetArg(al[ac], XmNargc, app_argc); ac++;
XtSetArg(al[ac], XmNargv, app_argv); ac++;
		...

「コードを直接編集」を選択して、かつ生成されたコードを直接編集している場合 は、コードを必ず特別なコメントに囲まれた領域に入力してください。こうしておくと、コードの再生成時 にこのコードが保持されます。特別なコメントは変更および削除しないでください。

シェルの「マネージの前」プレリュード

シェルの「マネージの前」プレリュードは、関数中の局所的宣言の直後に挿入され ます。それ以外の点では、他のウィジェットに対する場合と同様です。

編集機能の使用

生成されたコードファイルを使用するとき、Sun WorkShop Visual は Sun WorkShop 編集サーバーを使用します。選択した種類のプレリュードのファイルの適切な場所で、別の編集ウィンドウ にファイルが開きます。他の種類のプレリュードを選択すると、ユーザーが常に正確な場所に入力できるよ うに、挿入ポイントがファイル内を移動します。「編集サーバー」 ウィンドウに保存していない変更内容がある場合にコードファイルの再生成を試みると、まず変更内容を保 存するように促されます。

「プレリュード選択」ダイアログ

プレリュードを追加した後でコードファイルを再生成すると、図 7-10 に示す「プレリュード選択」ダイアログが表示されます。「プレリュード選択」ダイアログに直接コードを 追加した場合は、「プレリュード選択」ダイアログは表示されません。

 

    図 7-10 「プレリュード選択」ダイアログ

このダイアログで、ファイルが最後に生成されてから変更を加えたプレリュードを 個別に選択したり、それらのプレリュードを受け入れるか拒否するかを指定することができます。プレリュ ードを選択し、矢印キーを押してそれらのプレリュードをあるリストから別のリストに移動します。「了解 」ボタンを押すと、受け入れるように設定したファイルだけが再度生成されます。あるいは、新たに追加さ れたファイルをすべて受け入れるかすべて拒否するかを選択することもできます。「コードプレリュード選 択」ダイアログで「了解」ボタンを押すと、それまでに拒否したプレリュードは削除され、復帰することは できません。

以前に行なったコード生成の前に追加されたプレリュードは、保持されています。 「プレリュード選択」ダイアログで制御できるプレリュードは、コードファイルが最後に生成された後で追 加されたものだけです。

    注 - 「コードを直接編集」トグルをオフにして、最後にコードファイルを生成してから プレリュードを追加している場合は、「プレリュード選択」ダイアログが表示されます。これは、新規プレ リュードは必ず「プレリュード」ダイアログに表示される必要があるためです。

 


前へ 次へ 目次 文書セット ホーム

サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.