基本仕様 こんな時には 前の章 次の章

VB C# ALL プログラミング言語によるフィルタ (ここで選んだ言語で選別された説明や図だけが表示されます)

付録. こんな時には

このページでは、トラブルの回避法や使用上のヒントなどを紹介しています。

不可解なビルドエラーが発生したら

例外「不正な手段でなされた項目値の変更を発見」が発生したら

ソリューションを開いたままコード合成すると

バーチャルオブジェクトに関するご注意

MyBinPath および myPath について

フックメソッドのパラメタを Decimal 型 として宣言する場合

フックメソッドのパラメタを Integer 型 として宣言する場合

フックメソッドのパラメタを int 型 として宣言する場合

フックメソッドのパラメタを Boolean 型 として宣言する場合

フックメソッドのパラメタを boolean 型 として宣言する場合

Check 系フックメソッドの ByRef 指定のパラメタについて

Derived 系フックメソッドの戻り値について

MANDALA フォームを Dll にして複数のフォームから共用する方法

システムエラーの際の緊急処置

MANDALA バッチ動作中に MANDALA ツール類の動作は禁止


不可解なビルドエラーが発生したら

まずは、ソリューションのクリーン(C) を行ってから、ソリューションのリビルド(R) を行ってみてください。これで問題を解決できることがよくあります。

それから、統合開発環境 VS2008 をいったん終了させて、再度開いてから、上記を行うことで問題を解決できることもあります。

ツーピーススタイルの一方で dll のコピーのエラーが発生するときには、もう一方の VS2008 をいったん終了させると有効なことが多いようです。

VB をお使いの場合、ツーピーススタイルのセントラル側でビルドエラーが発生するときには、My Project に余分な生成モジュールが含まれていることが原因かもしれません。 ソリューションエクスプローラで、My Project の「すべてのファイルを表示」をして、AssemblyInfo.vb 以外のモジュールが含まれていたら、プロジェクトから削除(J) してみてください。


例外「不正な手段でなされた項目値の変更を発見」が発生したら

例外「不正な手段でなされた項目値の変更を発見」は、項目値すなわち MANDALA コントロールText プロパティをアプリケーションの中で直接的に変更したときに発生します。 Text プロパティは、ForeColor および BackColor などと同様に、MANDALA.net が制御することになっているので、これをアプリケーションの中で直接的に変更することが禁止されています。

これを解決するには、どこで Text プロパティを変更しているのかを調べて、そのプログラムを修正することが必要です。

これを解決するには、どこで Text プロパティを変更している (setText メソッドを使用している) のかを調べて、そのプログラムを修正することが必要です。

このために、実行時のフックメソッドのログをとれば、どのフックメソッドが関係しているのか絞り込むことができます。フックメソッドのログの取り方は、ログの取得 に書いてあります。 そして、フックメソッドの中に適当なブレークポイントを設定することで、問題の箇所をさらに絞り込むことができるでしょう。

あるいは、文字列検索で、Text プロパティを変更しているプログラムコードを洗い出してください。

いずれにしても、上記のようにすることで、Text プロパティを変更している部分を見つけ出します。 そして、setValue メソッド (FormBase の setValue または ItemBase の setValue) を使って項目値の変更するように修正してください。

アプリケーションの中で、MANDALA コントロールに値を設定するには、コントロールの Text プロパティを変更するのではなく、setValue メソッドなどを使って行うことになっています。

なお、これでも問題が解決しない場合には、実際にこの現象が発生するプロジェクトのソースプログラムを送付してください。


ソリューションを開いたままコード合成すると

その 1: コード合成をする前に必要な「すべて保存」の操作

統合開発環境 VS2008 でソリューションを開いてプログラムの修正を行った場合、すべて保存の操作を行わないと、変更された内容はメモリ上にあるだけで、ハードディスク内には保存されません。一方 MANDALA.net はハードディスク内のプログラムを参照してコード合成を行うので、すべて保存の操作を行っていないと、食い違いが生じます。

このような食い違いの発生を防ぐために、統合開発環境 VS2008 が開かれたままになっていると、コード合成の直前に以下のダイアログを表示して、注意を喚起しています。

その 2: コード合成結果を反映するための再読み込み

統合開発環境 VS2008 で開いたままになっているプロジェクトに対して、(いわばその側面から) MANDALA.net でコード合成を行うと、その内容が変更された新たなプロジェクトが自動的に統合開発環境に取り込まれるわけではありません。しかし、このことを統合開発環境 VS2008 が察知すると、以下のダイアログを表示します。プロジェクトの中身が変更されているので、再読み込みをしないと最新版のプログラムにならないと注意を喚起します。このような場合には、ボタン再読み込み(R) をクリックして変更内容を反映した最新のソースプログラムを統合開発環境 VS2008 に取り込むことが必要です。

統合開発環境 eclipse で開いたままになっているプロジェクトに対して、(いわばその側面から) MANDALA.J でコード合成を行うと、その内容が変更された新たなプロジェクトが自動的に統合開発環境に取り込まれるわけではありません。変更点を eclipse に認識させるためには、対象のプロジェクトに対して「更新」指示を与えます。パッケージエクスプローラなどでプロジェクトのノードをポイントし、ファイル(F) メニュータイトルをクリックしてメニューを開き、更新メニュー項目をクリックするとプロジェクトの内容が再度読み込まれ、最新の状態になります。

なお、統合開発環境 VS2008 でソリューションを開いていない状態で、その中のプロジェクトに対して MANDALA.net によるコード合成をするのであれば、上記のような注意は全く必要ありません。 また、統合開発環境 VS2008 のバグだと思われるのですが、再読み込みが正しくなされない場合もたまにあるので、プロジェクトを閉じてからコード合成を行う習慣をつけることをお勧めいたします。


バーチャルオブジェクトに関するご注意

バーチャル項目については、オブジェクト型にすることができますが、これに関しては、ツーピーススタイルの場合に、いろいろご注意が必要です。

ご注意1:

一般に、MANDALA コントロールの値は、自動的にコヒーレント制御がなされるようになっているので、ローカル・セントラル間で不整合が生じることはありません。 このことは、バーチャル項目についても同様です。したがって、変数をバーチャル項目にすれば、コヒーレント制御のサービスを受けることができます。 ただし、バーチャルオブジェクトについては特別の指定をしないとコヒーレント制御がなされません。

なお、特別の指定とは、そのバーチャルオブジェクトに関する ItemBase オブジェクトの Incoherent プロパティを True にすることです。

ご注意2:

バーチャルオブジェクトについて特別の指定をしてコヒーレント制御を行うと、一方のサイトからバーチャルオブジェクトの内容をシリアライズして転送して、もう一方のサイトでデシリアライズしてオブジェクトを復元することになります。 このため、オブジェクトの中味はローカル・セントラル間で整合した値になりますが、オブジェクトそのものは以前のものと異なるものに変わってしまいます。 それから、ローカル側とセントラル側のオブジェクトそのものは、異なるものであることは言うまでもありません。

ご注意3:

バーチャルオブジェクトを明細行にもつボディ部または拡張ボディ部に関して、明細行操作を行った場合に関しては、自動的にコヒーレント制御がなされます。

たとえば、明細行削除の操作を行うと、削除した明細行より下の明細行を1行だけ上に移動させます。これに関しては、自動的にコヒーレント制御がなされ、セントラル側にも反映されます。

ここで、ご注意ですが、このような場合には、多量のデータがローカルセントラル間で転送されることになりかねないという問題点があります。

それから、ご注意2で述べたように、オブジェクトの中味はローカル・セントラル間で整合した値になりますが、セントラル側のバーチャルオブジェクトのオブジェクトは以前のものと異なるものに変わってしまうという問題があります。

なお、現在開発中の最適化オプション「明細行操作時の最適化」をオンにすることによって、これらの二つの問題点を解消する予定です。

ただし「明細行操作時の最適化」オプションをオンにしても、ご注意2については解消できません。


MyBinPath および myPath について

十分な権限を持たない状態で、 アプリケーションプログラムを動作させたときには、MyBinPath および myPath には実行パスではなく、空文字 "" (String.Empty) が設定されます。


フックメソッドのパラメタを Decimal 型 として宣言する場合

一般に Decimal 型の変数は、Nothing 値を保持することができません。したがって、フックメソッドのパラメタを Decimal 型にした場合には、当然のことですが、Nothing 値になることはありません。しかし、便法としてパラメタが本来 Nothing 値 (すなわち空欄) の場合には、そのパラメタにはゼロ (0D) が設定されるようにしています。ところで、パラメタの本来の値がゼロの場合にも、パラメタにはゼロ (0D) が設定されます。つまり、本来の値が Nothing 値 (空欄) かゼロかを区別することはできません。

もしも、これを区別したい場合には、フックメソッドのパラメタを WrpDecimal 型として宣言してください。こうすれば、次のような If 文によって本来の値が Nothing 値 かどうかを判定できます。

If パラメタ Is Nothing Then

if (パラメタ is null) {

なお、WrpDecimal 型パラメタの Decimal 値は、Nothing 値でないと判定した後に、次のようにして得ることができます。このように WrpDecimal 型を用いると Nothing 値でないという判定が必要な分だけ、Decimal 型 の場合に比べてプログラムが長くなります。

パラメタ.DecimalV


フックメソッドのパラメタを Integer 型 として宣言する場合

フックメソッドのパラメタを int 型 として宣言する場合

一般に Integer 型の変数は、Nothing 値を保持することができません。したがって、フックメソッドのパラメタを Integer 型にした場合には、当然のことですが、Nothing 値になることはありません。しかし、便法としてパラメタが本来 Nothing 値 (すなわち空欄) の場合には、そのパラメタにはゼロ (0) が設定されるようにしています。ところで、パラメタの本来の値がゼロの場合にも、パラメタにはゼロ (0) が設定されます。つまり、本来の値が Nothing 値 (空欄) かゼロかを区別することはできません。

プリミティブ型 int の変数は、null 値を保持することができません。したがって、フックメソッドのパラメタを int 型にした場合には、当然のことですが、null 値になることはありません。しかし、便法としてパラメタが本来 null 値 (すなわち空欄) の場合には、そのパラメタにはゼロ (0) が設定されるようにしています。ところで、パラメタの本来の値がゼロの場合にも、パラメタにはゼロ (0) が設定されます。つまり、本来の値が null 値 (空欄) かゼロかを区別することはできません。

もしも、これを区別したい場合には、フックメソッドのパラメタを WrpInteger 型として宣言してください。こうすれば、次のような If 文によって本来の値が Nothing 値 かどうかを判定できます。

もしも、これを区別したい場合には、フックメソッドのパラメタをラッパ型 Integer (java.lang.Integer) として宣言してください。こうすれば、次のような if 文によって本来の値が null 値 かどうかを判定できます。

If パラメタ Is Nothing Then

if (パラメタ is null) {

if (パラメタ == null) {

なお、WrpInteger 型パラメタの Integer 値は、Nothing 値でないと判定した後に、次のようにして得ることができます。このように WrpInteger 型を用いると Nothing 値でないという判定が必要な分だけ、Integer 型 の場合に比べてプログラムが長くなります。

パラメタ.intValue

なお、Integer 型パラメタの 整数値は、null 値でないと判定した後に、次のようにして得ることができます。このように Integer 型を用いると null 値でないという判定が必要な分だけ、int 型 の場合に比べてプログラムが長くなります。

パラメタ.intValue()


フックメソッドのパラメタを Boolean 型 として宣言する場合

フックメソッドのパラメタを boolean 型 として宣言する場合

一般に Boolean 型の変数は、Nothing 値を保持することができません。したがって、フックメソッドのパラメタを Boolean 型にした場合には、当然のことですが、Nothing 値になることはありません。しかし、便法としてパラメタが本来 Nothing 値 (すなわち空欄) の場合には、そのパラメタに False が設定されるようにしています。ところで、パラメタの本来の値が偽の場合にも、パラメタには False が設定されます。つまり、本来の値が Nothing 値 (空欄) か 偽 かを区別することはできません。

プリミティブ型 boolean の変数は、null 値を保持することができません。したがって、フックメソッドのパラメタを boolean 型にした場合には、当然のことですが、null 値になることはありません。しかし、便法としてパラメタが本来 null 値 (すなわち空欄) の場合には、そのパラメタに false が設定されるようにしています。ところで、パラメタの本来の値が偽の場合にも、パラメタには false が設定されます。つまり、本来の値が null 値 (空欄) か 偽 かを区別することはできません。

もしも、これを区別したい場合には、フックメソッドのパラメタを WrpBoolean 型として宣言してください。こうすれば、次のような If 文によって本来の値が Nothing 値 かどうかを判定できます。

If パラメタ Is Nothing Then

もしも、これを区別したい場合には、フックメソッドのパラメタをラッパ型 Boolean として宣言してください。こうすれば、次のような If 文によって本来の値が null 値 かどうかを判定できます。

if (パラメタ == null) {

なお、WrpBoolean 型パラメタの Boolean 値は、Nothing 値でないと判定した後に、次のようにして得ることができます。このように WrpBoolean 型を用いると Nothing 値でないという判定が必要な分だけ、Boolean 型 の場合に比べてプログラムが長くなります。

パラメタ.BooleanV

なお、Boolean 型パラメタの 真偽値は、null 値でないと判定した後に、次のようにして得ることができます。このように Boolean 型を用いると null 値でないという判定が必要な分だけ、boolean 型 の場合に比べてプログラムが長くなります。

パラメタ.booleanValue()


Check 系フックメソッドの ByRef 指定のパラメタについて

Check 系フックメソッド (Check, CheckLC, CheckC, CheckCLC) の ByRef 指定のパラメタを Decimal 型 または Integer 型 として宣言する場合には、まず「フックメソッドのパラメタを Decimal 型 として宣言する場合」「フックメソッドのパラメタを Integer 型 として宣言する場合」の注意事項をご覧ください。

そこでの説明のように、パラメタの本来の値 (すなわち、そのパラメタに対応する項目の値) が Nothing 値 (空欄) かゼロかを区別することができません。このような状況 (つまり ByRef 指定のパラメタにゼロが設定されてきた場合) においては、 パラメタの変更を行わずにゼロを返すと、そのパラメタに対応する項目の値は変更されずに、元の Nothing 値 (空欄) かゼロのままとどまります (必ずしもゼロになるわけではありません)。

これ以外の状態 (つまり、ByRef 指定のパラメタにゼロが設定されてこなかった場合) においては、ByRef 指定のパラメタに返した値が、そのパラメタに対応する項目に設定されます。たとえば、ByRef 指定のパラメタにゼロを返すと、そのパラメタに対応する項目の値はゼロになります。Nothing 値にすることはできません。

もしも、ByRef 指定のパラメタに対応する項目の値として Nothing 値 (空欄) を設定したい場合には、パラメタを WrpDecimal 型 または WrpInteger 型 として宣言してください。


Derived 系フックメソッドの戻り値について

Derived 系フックメソッドの戻り値としてゼロが設定された場合、 元の項目値が Nothing であった、その項目の値は変更されずに、元の Nothing 値 (空欄) まま変化しません。

Derived 系フックメソッドの戻り値としてゼロが設定された場合、 元の項目値が null であった、その項目の値は変更されずに、元の null 値 (空欄) まま変化しません。

これ以外の状態 (つまり、Derived 系フックメソッドの戻り値としてゼロが設定されなかった場合または元の項目値が Nothing でない場合) では、その戻り値が対応する項目に設定されます。

これ以外の状態 (つまり、Derived 系フックメソッドの戻り値としてゼロが設定されなかった場合または元の項目値が null でない場合) では、その戻り値が対応する項目に設定されます。

もしも、ByRef 指定のパラメタに対応する項目の値として Nothing 値 (空欄) を設定したい場合には、パラメタを WrpDecimal 型 または WrpInteger 型 として宣言してください。


MANDALA フォームを Dll にして複数のフォームから共用する方法

選択リスト用のフォームなどのサブフォームを MANDALA フォームとして作成することができます。この場合に、次の二つのどちらかの形態を選択できます。

後者の場合、クラスライブラリ (dll) にすることが必要ですが、複数のフォームから呼び出すことのできる共用サブフォームにすることができます。


システムエラーの際の緊急処置

まず、そのプロジェクトのバックアップをとって、調査用の資材としてお送りいただくようにお願いいたします。

これとともに、調査には時間がかかることがありますので、次のようにして回復を試みることをお勧めいたします。

システムエラーのために解析やコード合成が不能なプロジェクトがあるときには、そのプロジェクトを統合開発環境 VS2008 で開いて異常がないかを調べてみてください。また、生成モジュール (XxxxFormeBase, YyyyCommon) をプロジェクトから削除してみてください。こうした処置を行った後に、 再度、解析・コード合成を実施してみてください。


MANDALA バッチ動作中に MANDALA ツール類の動作は禁止

MANDALA バッチの動作中に、MANDALA ツール類を動作させることは禁止されています。また、MANDALA バッチを多重に動作させることも禁止されています。