過去の桐井戸端BBS (桐ver.9)
24090 一括処理で宣言した固有変数はどのフォームでも有効なのでしょうか もさく 2004/01/01-18:25
Aフォームで宣言した固有変数を参照用に開いたBフォームの変数ウオッチで確認すると未宣言状態です。
ということは固有変数は宣言したフォームでのみ使用できるということになるのでしょうか。
とすると一括処理で宣言した固有変数はどうなのでしょう。
固有変数が削除される条件と使用可能な条件は異なるのですね。
ヘルプで確かめましたが私には完全に理解し切れません。
いろいろやってみれば判ることかもしれませんが、一人で確かめたのみでは、確かめ方に不備があるかもしれません。
よろしくお願いします。
24092 Re:固有変数について KH 2004/01/01-20:14
記事番号24090へのコメント
もさくさん、明けましておめでとうございます。

>Aフォームで宣言した固有変数を参照用に開いたBフォームの変数ウオットチ
>で確認すると未宣言状態です。ということは固有変数は宣言したフォームで
>のみ使用できるということになるのでしょうか。とすると一括処理で宣言し
>た固有変数はどうなのでしょう。

一括処理から入った場合は、その一括処理が終わるまで宣言された固有変数は生きています。
例えば、Aフォームで代入した固有変数の値はBフォームでその値は生きてきます。


24095 Re:固有変数について もさく 2004/01/01-21:25
記事番号24092へのコメント
KHさん

一括処理で宣言した固有変数は各フォームて゛共用出来ることはわかりました。
と言うことはフォームで使用する固有変数はそれぞれのフォームで宣言しなければならないということになるのでしょうか。
2つ以上のフォーム間にわたり使用する固有変数は一括処理で宣言するか、
または共通変数を使用しなければならないことになるのでしょうか。
(あるフォームで宣言した固有が他のフォームでも使用出来たことが有ったような気がするのですが私の錯覚かも?)
24096 変数とその有効範囲 佐田 守弘 2004/01/02-01:36
記事番号24090へのコメント
もさくさん

●ヘルプ情報
変数に関しては、桐のヘルプ、[ヘルプ]→[トピックスの検索]を選び、
「変数」で検索て下さい。「変数」の下にある「変数-変数の種別」に詳しい
情報が書かれています。
また、一括処理&イベントリファレンスの中の「変数宣言」コマンドの
内容も重要です。

●変数の種別
桐の変数には、組み込み、共通、固有、局所、自動の種別があります。
(これ以外にウォッチ変数という変数もあるが、ここでは割愛)
これらの内で左側の方がグローバルであり、右側の方がローカルです。
上記ヘルプにこれらの有効範囲が書かれておりますが、簡単に述べます。

・組み込み変数
桐の起動時に自動的に定義される変数です。そしてその値は、起動時、ないしは、
特定の操作(項目集計など)によって、自動的に値が書き込まれます。
ユーザーがこの変数を勝手に利用する事も可能です。
この変数は、桐が起動している限り常に有効であり、どこからも参照できます。
ユーザーが削除する事はできません。

・共通変数
ユーザーが定義する変数ですが、桐が起動していれば、どの場面でも定義でき
かつ、桐が終了するまで有効で、どこからでも参照できます。

・固有変数
固有変数は、表、フォーム、一括処理などの何らかのウィンドウが開かれた後で定義できます。
そして全ウィンドウが閉じて、桐ウィンドウだけの状態に戻った段階で自動的に削除されます。
固有変数も、定義されている間は、どこから(どのフォーム、一括処理)からでも有効です。

・局所変数
局所変数は、フォームと連係していて、フォームの定義画面で定義します。
そのフォームが開かれた時に局所変数も自動的に定義され、値が設定されていれば、
その値が初期値になります。
フォームに付随するイベントのメイン部分で、変数宣言コマンドを使って定義する事もできます。
局所変数は、それを定義したフォームの中(イベントを含む)だけで有効で、
他のフォームからは参照できません。
異なるフォームで同じ名前の局所変数を定義できます。
別のフォームで同じ名前の局所変数を定義しても、それぞれれ別の変数として扱われます。

・自動変数
イベントハンドラの中で自動的に定義される変数です。
イベントハンドラの中で、変数宣言コマンドで宣言する事もできます。
自動変数は、そのイベントハンドラ内だけで有効で、イベントハンドラを抜けると削除されます。

●質問の内容に戻って
質問の内容は、固有変数がどこまで有効かですが、一括処理で定義した固有変数であれば、
その一括処理が動いている間は常に有効です。
そして、有効な間は開かれているどのフォームからも、その変数が参照できます。
なお、もし一括処理を終えてもその値を残しておきたい時には、
共通変数としておけば、間違いないでしょう。

佐田守弘(KS-00119)
24097 変数の有効範囲についての追加補足 佐田 守弘 2004/01/02-02:10
記事番号24096へのコメント
変数に関しての補足というか追加です。

●同じ名前の変数を重複して宣言した場合
同じ名前の変数を重複して宣言した場合にどうなるかを述べておきます。

1)種別が同じ変数変数の場合
例えば共通変数ないし固有変数など、同じ種別の変数を繰り返して宣言した場合、
同じデータ型であれば、エラーになりません。この場合、その変数を再度宣言し直した事になり、
値は失われて初期値に戻ります。
異なるデータ型で宣言しようとすると、エラーになります。

2)異なる種別の場合
データ型が異なると、同じ名前の変数でも異なるデータ型で宣言できます。
この場合、仮に同じ変数名でも、別の変数として扱われます。
つまり、共通変数として「&番号」を整数型で定義している時に、
固有変数ないし局所変数で文字列型の「&番号」を定義できます。

そして重要な事は、グローバルな種別の変数よりも、ローカルな種別の変数の方が、
優先度が高いという事です。
仮に固有変数と局所変数で「&番号」を定義したとします。
この場合、局所変数を定義したフォームの中で「&番号」を参照すると、局所変数の方を指定した事になります。
この場合、固有変数の方は参照できないはずです。
それ以外のフォームの中では、この局所変数は無効ですから、固有変数の方が参照されます。
これは案外陥りやすいエラーなので、記憶しておいて下さい。

その様なわけで、異なる種別で同じ名前の変数を定義するのは、避けた方が賢明でしょう。

●異なる桐環境での変数
桐の起動を繰り返すと、桐のタスクバーが複数作られます。
あるいは一括処理を複数開いても、それぞれの一括処理毎にタスクバーができます。
メモリ上に展開されるプログラムは1つですが、それぞれ別のプロセスが実行され、
プロセス毎に別の桐環境が作られます。
変数は、桐環境毎に別々に作られますから、異なるプロセス間では、
共通変数であっても互いに参照する事はできません。

特殊な例と思いますが、1つの一括処理ないしはフォームで開いたイベントの中から、
シェル実行コマンドを使って別の桐を起動し、一括処理を走らせた場合には、
相互に変数の受け渡しはできません。
どうしても必要なら、変数書き出しでファイルに書き出し、これを読み込む様な事が必要になります。

ついでに述べると、一括処理は、その中で閉じた(完結した)機能であり、
使用する変数も予め一括処理プログラム上で決めてあります。
作った人が同じだと、複数の一括処理で同じ変数名を使う事が良くあります。
もし他に動いている一括処理、ないしは会話処理で同じ変数が使われた場合でも
その影響を受けると不都合がおきます。
このために、変数値の上で他の一括処理などの影響を遮断するために、
別プロセスを作っている考えられます。

佐田守弘(KS-00119)
24098 別のフォームで未宣言の理由 佐田 守弘 2004/01/02-02:23
記事番号24090へのコメント
もさくさんは
先のコメントで変数の概論を述べましたが、質問の主旨に対する答えが
きちんと書いてなかったので、この部分を補足します。
 >Aフォームで宣言した固有変数を参照用に開いたBフォームの変数ウオッチ
 >で確認すると未宣言状態です。

最初に確認ですが、これはウォッチ変数として一括処理で宣言した固有変数を
ウォッチする設定をしたという意味で宜しいですね。
ウォッチ変数は、変数管理のダイアログの上では、別の種別の様なメニューになっていますが、
実質的には共通、固有、局所のいずれかです。
つまりウォッチする変数が固有変数であれば、ウィンドウが全て閉じられる事によって、
変数が削除されない限り、異なるフォームからでも参照できるはずです。

もし定義されている変数が未定義であるという事は、もう1つ別の桐を起動して、
そちらでもうBフォームを開いているという事はないでしょうか。

佐田守弘(KS-00119)

戻る