過去の桐井戸端BBS (桐ver.9)
22160 複数のフォームで同じ変数を使う方法 しぼうかん 2003/09/04-14:43
A.wfmとB.wfmが有ります。

両方のフォームの使用方法は

A.wfmとB.wfmを開く為のメニュー.wfmを作らずに、

1)A.wfmだけを開いて使う場合、
2)B.wfmだけを開いて使う場合、
3)A.wfmを開いてからB.wfmを開いて使う場合、
4)B.wfmを開いてからA.wfmを開いて使う場合、

の4つの場合が有ります。

A.wfmとB.wfmの両方のフォームで同じ名前の変数を
20個ぐらい使いたいと思いますが何か方法があるでしょうか?

仮に共用したい変数を"&社名"とすると、普通にA.wfmと
B.wfmで変数宣言をした場合、3)や4)の方法で使う場合、
2番目に開くフォームを開く時に"&社名は宣言済みだぞ"
という意味合いのエラーが出てしまいます。

また、&社名が宣言済みの場合は宣言をし、宣言済みで
無い場合は宣言をするというような事が出来るコマンドが
有ればいいのですが、その様なコマンドは無い様です。

22161 Re:複数のフォームで同じ変数を使う方法 うにん 2003/09/04-14:58
記事番号22160へのコメント
>A.wfmとB.wfmの両方のフォームで同じ名前の変数を20個
>ぐらい使いたいと思いますが何か方法があるでしょうか?

共通変数のことなんだと思いますが、それなら宣言しないで、
桐起動時に変数ファイルから読み込めばいいのでは?

宣言済みかどうかは#配列要素数()でわかります。

22164 Re:複数のフォームで同じ変数を使う方法 アックン 2003/09/04-18:11
記事番号22160へのコメント
しぼうかんさん、はじめまして。アックンと申します。
先日はフォローありがとうございました。
ぼくが使っている方法をご紹介します。
「A.wfmとB.wfm」双方のメイン部に記述する方法と、
イベントハンドラ中に記述する方法の2通りです。
(以下、欧文のままですみません。
マニュアル「一括編」の「一括処理コマンド別名一覧」を参照してください。)

(方法1)
1)名札 メイン
2) var  局所 , 整数 { &end }
3) var 局所 , 数値 { &借方合計 , &貸方合計 }
4) cond( .not#v( "伝票No" ) ) readvar "会計" , 固有 , 終了状態=&end
5) cond( .not#v( "振替伝票win" ) ) var 固有 , 整数 { &振替伝票win }
6) cond( .not#v( "入金伝票win" ) ) var 固有 , 整数 { &入金伝票win }

下の行から説明していきます。
(5)(6)行目:
&振替伝票win と &入金伝票win が変数宣言されてないときは、この場で変数宣言します。
すでに変数宣言されているときは、なにもしません。

(4)行目:
フォーム終了後も変数値を保持しておいた変数をここで読み込みます。
変数ファイル中のある変数(ここでは &伝票No )がなければ変数ファイルを
読み込み、すでに変数があればなにもしません。

(2)(3)行目:このフォームだけで変数値を使いたいが、他のフォームでも同名の変数を
使いたいというときは、ここで局所変数として宣言します。
こうすると、A.wfm の &end と、B.wfm の &end は同名でも、互いに干渉しません。

(方法2)
次ぎに、ちょっとご質問の主旨からはずれるかもしれませんが、ついでに。
イベントハンドラ中で変数宣言します。方法1と併用することもあります。

 if( .not#v( [借方科目] , 1 ) .and[借方科目] )
   eval "var 固有,数値{ &"+[借方科目]+"[3] = { 0 , 0 , 0 } }"
 end

方法1では条件コマンドを使いましたが、ここではIF文の条件式で変数が宣言されているかどうか調べています。
宣言されてないときは、コマンドコマンド(eval)を使って配列変数を宣言しています。

 ご参考になればいいのですが。 アックン(=^・^=)
22171 Re:複数のフォームで同じ変数を使う方法 悲しげ 2003/09/04-21:42
記事番号22160へのコメント
#22164でアックンwrote

>cond( .not#v( "伝票No" ) ) readvar "会計" , 固有 , 終了状態=&end

この部分を日本語で記述すると、
 条件(#変数("伝票No")="") 変数読み込み ・・・・・
となる訳で、その意味は「変数&伝票Noが存在しなければ」になると思います。
同じことをうにんさんの#22161の方法でやるには、
 条件(#配列要素数("伝票No")=-1) 変数読み込み ・・・・・
のように記述します。私が使っている例では次のようなものもありました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
名札 メイン
 if(#配列要素数("JAN")=-1)
  ライブラリ "..\LBvar.cmd"
  call LBvar()
 end
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
これは、某代表的な変数でもって宣言済の有無を判断し、無宣言であれば、
変数宣言一括処理をライブラリとして読み込んでから手続き実行して変数宣
言をしています。何でこのようにまわりくどいやり方をしているかと云うと、
う〜ん、確か「変数読み込み」だと配列変数の関係が厳しかったからだと思います。

それと、共用する変数の種別は固有でもいいのかもしれませんが、
慣れるまでは統一して共通変数にしておいた方が無難かと思います。

>仮に共用したい変数を"&社名"とすると、普通にA.wfmと
>B.wfmで変数宣言をした場合、3)や4)の方法で使う場合、
>2番目に開くフォームを開く時に"&社名は宣言済みだぞ"
>という意味合いのエラーが出てしまいます。

この部分はちょっと勘違いが入っていると思います。
変数の種別(共通とか固有とか局所とか自動とか)が異なる場合は、変数名が
同じでもぶつからなかったと思います。
つまり、共通変数としての&社名
(変数値="A社")と局所変数としての&社名(変数値="B社")は併存可能。
但し変数読み込みの場合はちょっと挙動が異なるみたいです(cf.ヘルプ)。
変数の種別が同じで且つデータ型も同じであれば、後から同名変数を再宣言した場合、
エラーにはならず前回のものがクリアされて新しいそれに上書きされる。
同名変数でエラーになるのは、変数の種別が同じで異なるデータ型のものを
再宣言しようとした場合だったと思います。
例えば文字列型固有変数の&日付が存在している時に、
日時型としての固有変数&日付を再宣言しようとした時とか。
(あと配列要素数の関係のエラーもあるらしい)

ま、その辺り、錯綜するとワケワカメになるので、変数の種別が同じだろうが
異なろうが、ともかく同名変数は使わない方が無難ではあります。(^^;)

ps
変数まわりに関してはONnojiさんが詳しいので、フォローがあるかも。(^^;)
え〜と「変数のONnoji」「結合表のうにん」の駄洒落ネタなんかもあるのですが、
それは別途別所にて。(^^;)(^^;)
22178 変数の存在を調べる方法ありますか? 変数のONnoji 2003/09/05-09:42
記事番号22171へのコメント
悲しげさん
>ps
>変数まわりに関してはONnojiさんが詳しいので、フォローがあるかも。(^^;)
>え〜と「変数のONnoji」「結合表のうにん」の駄洒落ネタなんかもあるので
>すが、それは別途別所にて。(^^;)(^^;)

ド・モ・ONnojiです。
悲しげさんの[呼び出しコマンド]に反応してしまいました。(^^ゞ

しぼうかんさん、こんにちは。

この掲示板の以下の過去ログが参考になるカモしれませんよ。

15277 変数の存在を調べる方法ありますか? 2002/03/01-11:41
http://www.fuku3.com/~habata/kbbs/kakov8/15277.htm

ps.
「変数の〜」という別名は知りませんでした。(^^ゞ
ドジソン先生曰く、「別名はいくつでも作成できる!」ですね。

22179 Re:変数の存在を調べる方法ありますか? ド・モ・ONnoji 2003/09/05-10:24
記事番号22178へのコメント
しぼうかんさん、こんにちは。

すこし気が付いたことを書かせていただきます。

【引用は過去ログより】
>桐ver7.1,8であれば、次の関数が使えるかと思います。
>
> #配列要素数(str)
> str で指定した変数の配列要素数を調べます。
> 指定した変数が配列変数でなければ、0 を返します。
> 指定した変数が宣言されていなければ、-1 を返します。
> -- 桐ヘルプより抜粋 --
>
>配列変数ではなくても、宣言されていなければ -1 を返してくれます。

「変数が存在するか?」ですが、これは #配列要素数( )関数が確実です。

しかし、注意しなければならない点もあります。

それは、変数の有効範囲(スコープ:scope)が異なる同名変数が存在する場合です。

例えば…

共通変数:&名前
局所変数:&名前

というように有効範囲(スコープ:scope)の異なる同名の変数が宣言済みだとします。
※この例はどちらも文字列型と予想できるので良いほうですが、
※場合によっては、配列要素数が異なっていたり、データ型が異なっていたり…

この場合、フォーム側で#配列要素数( )を使うと優先順位の高い局所変数を調べると思います。

また、#変数( )、#set( )、#setvar( )関数も優先順位の高い局所変数を対象にすると思います。
※#局所変数( )関数は局所変数以外の値も返してしまいます。看板に偽り有りですね。(T_T)

このような混乱を防ぐためには「スコープの異なる同名変数を宣言しない!」という方針が必要になります。

【引用は過去ログより】
>同名の変数で困らないようにするには、変数の有効範囲(スコープ:scope)によって、
>接頭辞を付けるといいですよ。
>
>自動 &名前  接頭辞は付けない
>局所 &m名前 接頭辞 "m" を付ける:モジュール=フォームの意味
>固有 &g名前 接頭辞 "g" を付ける:グローバルの意味
>共通 &p名前 接頭辞 "p" を付ける:パブリックの意味
>
>その他に、変数のデータ型を示す接頭辞を併用するとより明確になります。
>ただし、面倒ですが…(^^ゞ

<蛇足>

変数宣言 自動,文字列{ &varName }
変数宣言 自動,整数{ &dimMax, &isVar }

&varName = "名前"
&dimMax = #配列要素数( &varName )
&isVar = 1 + &dimMax
if ( &isVar )
 確認 "変数が存在する"
else
 確認 "変数が存在しない"
end
 :
 :

22183 ああ、勘違い、すいません。 しぼうかん 2003/09/05-14:32
記事番号22160へのコメント

うにんさん、アックンさん、悲しげさん、ONnojiさん
アドバイスありがとうございました。

皆さんに教えて頂いた方法を試した所うまく行きました・・・

・・・と言いたかったのですが、教えて頂いた方法を
試すまでも無く、悲しげさんが洞察された通り、
勘違いをしていました。

つまり共通変数で種別が異なる同名の変数を再宣言しようとしていました。

そこで変数の種別を同じにしてみるとあっさりとうまくいってしまいました。  
お恥ずかしい限りです。(>_<)       

教えて頂いた#配列要素数()と変数ファイル読み込みは
次の機会に利用させて頂きます。(^_^;)

ありがとうございました。

そこで、せっかく教えて頂いたので少し覚えて
おきたいので関連質問させて下さい。

#配列要素数()と変数ファイルの読み込みを使う方法は
種別が違う同名の変数を複数フォームで使う事以外に
どういう時に利用出来るのでしょうか?
22185 Re:ああ、勘違い、すいません。 悲しげ 2003/09/05-15:10
記事番号22183へのコメント
どもっ、しぼうかんさん、

>つまり共通変数で種別が異なる同名の変数を再宣言
>しようとしていました。
>
>そこで変数の種別を同じにしてみるとあっさりと
>うまくいってしまいました。  
>
>#配列要素数()と変数ファイルの読み込みを使う方法は
>種別が違う同名の変数を複数フォームで使う事以外に
>どういう時に利用出来るのでしょうか?

用語が間違っています。
以下、ヘルプの「変数宣言」の例でいえば

変数宣言
自動|局所|固有|共通               ← これが種別
文字列|数値|通貨|整数|長整数|実数|日時|時間 ←これはデータ型

とすれば、

>つまり共通変数で種別が異なる同名の変数を再宣言

の部分は矛盾しておりまして

変数の「種別」は同じく共通変数ながら、データ型が
異なる同名の変数を再宣言・・・・

のように書くべきではないでしょうか?
細かいようですが、そうしないと、この場合は全然別な意味になってしまいますよ。
22186 Re:ああ、勘違い、すいません。 悲しげ 2003/09/05-15:27
記事番号22183へのコメント
>#配列要素数()と変数ファイルの読み込みを使う方法は
>種別が違う同名の変数を複数フォームで使う事以外に
>どういう時に利用出来るのでしょうか?

ここで云う「種別」なる云いまわしが、本当に「種別」なのか
「データ型」のつもりなのかで、若干変わって来ますが、
いずれにせよ、私からの回答は次のとおりです。

   同名変数は避けた方がいい!

そもそも#配列要素数や#変数関数でチェックするのは、
同名変数の再宣言を避けることが主な目的であって、
あえて「種別が違う同名の変数を複数フォームで使う」ため(^^;)ではないと私は思います。
何だか発想が本末転倒っぽい感じがしますが、
そもそもしぼうかんさんは同名変数を「どういう時に利用」したいのですか?

22187 Re:ああ、勘違い、すいません。 悲しげ 2003/09/05-15:50
記事番号22183へのコメント
ついでにもう一点(^^;)

>#配列要素数()と変数ファイルの読み込みを使う方法は

「#配列要素数」と「#変数」では無かったとですね。(^^;)
となると、上記ふたつの並列は(?_?)です。

例えば「#配列要素数」や「#変数」関数は、同名変数を再宣言しない目的で使うことがある。
片や、変数の宣言(取得)の仕方には「変数宣言」や「変数読み込み」
あるいは「ライブラリ」+「手続き実行()」コマンド等の方法がある。
しぼうかんさん自身が、この辺りで質問自体を混同している可能性なきにしもあらず(^^;)なのかもしれませんが、
このふたつのうちのどちらを(あるいは両方を?)話題にしたかったのですか?

22188 Re:変数の種別 ド・モ・ONnoji 2003/09/05-16:05
記事番号22183へのコメント
しぼうかんさん、こんにちは。

変数の有効範囲については以下の過去ログが参考になるカモと思います。

19312 サブフォームで「変数読み込み」と「変数書き出し」をすると変数が無効になってしまう 2003/03/12-16:59
http://www.fuku3.com/~habata/kbbs/kakov9/19312.htm

以下は過去ログより引用です。

スコープの異なる同名の変数の有効範囲は以下のようになる。├──┤有効範囲を広さを表す。

├─自動─┤この変数は宣言した手続き内でのみ有効です。手続きから抜けると、自動的に削除されます。

├─局所────┤この変数は、ウィンドウ固有ものです。フォームウィンドウが閉じると、自動的に削除されます。

├─固有───────┤この変数は、表またはフォームのウィンドウが開いているあいだだけ、有効です。

├─共通───────────┤この変数は、桐で作業しているあいだは、つねに有効です。


自動と局所の変数は単純に自動削除されるが、固有の自動削除は少しややこしいです。

<固有変数の特殊性>
この種別の変数が宣言できるのは、表ウィンドウ、フォームウィンドウが開いているあいだ、
または一括処理が実行されているあいだだけ有効です。

(1) 宣言した変数は、表ウィンドウとフォームウィンドウ、一括処理がすべて閉じると、自動的に削除されます。
(2) 宣言後、ウィンドウを新たに開かない限りは、任意に削除できます。
  ただし、ウィンドウが開かれる前に宣言した変数は、すべてのウィンドウを閉じない限り、削除できません。

<蛇足>

以下は桐ver.8トピックの検索より引用

・組み込み変数と同じ名前の変数は宣言できません。
・局所変数は、フォーム定義画面でだけ宣言できます。
・自動変数は、一括処理の手続きの中でだけ宣言できます。
・各種別で同じ名前の変数を宣言した場合、次の順番で検索され、
 最初に見つかった変数の値が参照されます。

 自動
 局所
 固有
 共通

22191 勘違いから書き間違いにverUP しぼうかん 2003/09/05-20:05
記事番号22187へのコメント
悲しげさんすいません×2、おっしゃる通り

>つまり共通変数で種別が異なる同名の変数を再宣言

では無くて

>つまり共通変数でデータ型が異なる同名の変数を再宣言

とするべきでした。

>しぼうかんさんは同名変数を「どういう時に利用」した
>いのですか?

うまく説明するのは難しいのですがとりあえずA.wfmとB.wfm
だとイメージがつかみにくいかもしれないので言い換えます。

A.wfmは商品受注台帳.wfm(編集対象表=商品受注台帳.tbl)とします。

項目は[コード]と[社名]と[数量]と[住所]他いろいろ有ります。

変数宣言で&コードと&社名と&数量他いろいろ宣言しています。

B.wfmは部品発注書.wfm(編集対象表=部品発注書.tbl)とします。

項目は[発注日]と[コード]と[社名]と[数量]と[合計数量]だけが有るとします。

変数宣言で&発注日と&コードと&社名と&数量と&合計数量を宣言しています。

B.wfmを入力する時には[コード]を入力した後にイベントで

1)その値を&コードに取る
2)編集表を商品受注台帳.tblに切り替る、
3)[コード]=&コードで検索して[社名]と[数量]を&社名と
  &数量に取る。
4)編集表を部品発注書.tblに切り替え[社名]と[数量]に
  &社名と&数量を代入する。

こんな事をしようとしましたが部品発注書.wfmで使う&コードや
&社名や&数量は商品受注台帳.wfmで&コードや&社名や&数量は
同じデータを扱うし、両方のフォームの[コード]や[社名]などの
オブジェクト名も同じなので同じ変数名にしたほうが
わかりやすいと思ったのです。

しかし、&コードのデータ型を違わせてエラーを出してしまい、
その結果今回の投稿をする事になりました。

NO.22187については

実はNO.22183で書いた通り問題が解決してしまったので、
教えて頂いた方法は難しそうなので後でじっくり試してみようと思って
まだ試してはいませんでした。

そこで教えて頂いた事を試すにあたって普通はどういう風に
使うのか知っていた方がいいと思って関連質問をしたのですが、

アックンさんが

>変数ファイル中のある変数(ここでは &伝票No )がなければ変数
>ファイルを
>読み込み、すでに変数があればなにもしません。

と説明していた部分と

悲しげさんがNO.22171で

>条件(#配列要素数("伝票No")=-1) 変数読み込み ・・・・・
>のように記述します。

と説明していた部分を

#配列要素数と変数ファイルの読み込みの両方を使えばいいんだな。
ふむふむ。

と(誤)解釈して

>#配列要素数()と変数ファイルの読み込みを使う方法は
>種別が違う同名の変数を複数フォームで使う事以外に
>どういう時に利用出来るのでしょうか?

と質問してしまいました。

検証しないで質問してしまった結果いつものごとくおかしな質問になってしまったようです。

>そもそも#配列要素数や#変数関数でチェックするのは、
>同名変数の再宣言を避けることが主な目的であって、
>あえて「種別が違う同名の変数を複数フォームで使う」
>ため(^^;)ではないと私は思います。

よくわかりました。

22192 Re:変数の種別 しぼうかん 2003/09/05-20:26
記事番号22188へのコメント
ONnojiさん、詳しい解説ありがとうございます。
うにんさんと言えば結合表とは知ってましたが、
変数のONnojiさんと異名をお持ちだとは知りませんでした。

変数の種別の違いに関してはぼんやりとわかっている
つもりでしたが、変数の種別を区別して使うのが
けっこう面倒そうなので実は殆ど共通変数しか
宣言して使っていません。

そして紹介して頂いたNO.19312の内容を流し読みした感じでは
やはり使い分けは面倒そうなので、これからも当分変数は
共通変数一本でいこうと思っています。

ということは悲しげさんもおっしゃっている通り、
同名の変数宣言は出来る限り避けるようにするのがベターと理解しました。

NO.15277に関しては今回の質問とほぼ同じ質問なので参考になります。
しかしもっとよく過去ログを探さないとダメですね。

紹介していただいた過去ログに関しては少しづつ読解して
いきたいと思います。(難しそうなので)

22193 Re:知りませんでした ド・モ・ONnoji 2003/09/05-20:38
記事番号22192へのコメント
しぼうかんさんは No.22192「Re:変数の種別」で書きました。
>ONnojiさん、詳しい解説ありがとうございます。
>うにんさんと言えば結合表とは知ってましたが、
>変数のONnojiさんと異名をお持ちだとは知りませんでした。

しぼうかんさんと同じく、私も知りませんでした。(^・^)

>NO.15277に関しては今回の質問とほぼ同じ質問なので
>参考になります。
>しかしもっとよく過去ログを探さないとダメですね。

引用した過去ログは、たまたま私がリプライしたことのある内容だから覚えていただけです。
当然ながら過去ログを全部覚えているわけではありません。
本当にたまたまなんですよ。

22194 Re:勘違いから書き間違いにverUP うにん 2003/09/05-21:15
記事番号22191へのコメント
>B.wfmを入力する時には[コード]を入力した後にイベントで
>
>1)その値を&コードに取る
>2)編集表を商品受注台帳.tblに切り替る、
>3)[コード]=&コードで検索して[社名]と[数量]を&社名と
>  &数量に取る。
>4)編集表を部品発注書.tblに切り替え[社名]と[数量]に
>  &社名と&数量を代入する。
>
>こんな事をしようとしましたが部品発注書.wfmで使う&コードや
>&社名や&数量は商品受注台帳.wfmで&コードや&社名や&数量は
>同じデータを扱うし、両方のフォームの[コード]や[社名]などの
>オブジェクト名も同じなので同じ変数名にしたほうが
>わかりやすいと思ったのです。

全体を理解しているわけではないのでなにですが、こういうときこそ
自動変数を使うと、イベントの始めで宣言して使い終わったときは
自動的に消えてくれるというわけですよね。
既に同名で宣言してあろうとなかろうとおかまいなしです。
しかも、省略すれば「イベントの手続き内であれば「自動」」になるわけですし。
共通変数&社名などの値が処理中に必要になったりする場合はだめなんですが。

22195 Re:知りませんでした 悲しげ 2003/09/05-21:36
記事番号22193へのコメント
>>変数のONnojiさんと異名をお持ちだとは知りませんでした。
>
>しぼうかんさんと同じく、私も知りませんでした。(^・^)

私も知りませんでした……、なんて云うと石が飛んで来ますね。(^^;)

22196 Re:勘違いから書き間違いにverUP 悲しげ 2003/09/05-21:59
記事番号22194へのコメント
うにんさん wrote

>自動変数を使うと、イベントの始めで宣言して使い終わったときは
>自動的に消えてくれるというわけですよね。
>既に同名で宣言してあろうとなかろうとおかまいなしです。

確かに、自動変数だけはその辺り便利ですね。
私自身、例えば共通か固有で宣言済みのものと同名の自動変数を使っているところが結構あります。
でもそれは、主に自動変数についてよく知らなかった頃に作ったものを
未整理なまま引き摺っている状態であって、いずれは整理して、
同名にならないようにしよう(共通や固有の方での宣言を抜くようにしよう)とは思っています。

共通vs局所では同名変数で数回痛い目にあっています。
自動ならうっかりやってしまう可能性は、局所とかよりも低いけれども、
無いとも云い切れないので。
でもって、やはり他の人には、たとえ自動変数であっても
同名は避けておくことを勧めたいと思います。

あ、そうそう、イベントの手続き定義が自動的に宣言する自動変数に
ぶつかったこともありました。&表番号とか&フラグとか。(^^;)

22199 同名の変数の避け方についてもう少し教えて下さい。 しぼうかん 2003/09/06-12:28
記事番号22196へのコメント

同名の変数を使う方法としては変数の種別を変えて
使う事は可能だけれど、その場合は同名の変数の管理には
細心の注意が必要な感じがします。

つまりつねに細心の注意を払えない人(つまり自分)は
同名の変数を避ける方が無難見たいです。

ただ今まで変数はわかりやすい様にオブジェクト名と
同じにして居たのでオブジェクト名,変数名共によく
使っていた[社名],[住所],&社名,&住所などは同名に
なる可能性が高い事になります。

これを避けるために全てのファイルの同名に成りそうな
[社名]とか[住所]とかのオブジェクト名や変数名を
[仕入れ伝票の社名],[納品伝票の社名],&仕入れ伝票の社名,
&納品伝票の社名,の様に変えるとすれば結構大変ですね。

それともオブジェクト名と変数名を同じにしないで
納品書.wfmとかのオブジェクト名は[社名]で変数名は
&納品書の社名みたいにすればいいのでしょうか?
22201 Re:同名の変数の避け方についてもう少し教えて下さい。 ド・モ・ONnoji 2003/09/06-13:51
記事番号22160へのコメント
しぼうかんさん、こんにちは。

>同名の変数を使う方法としては変数の種別を変えて
>使う事は可能だけれど、その場合は同名の変数の管理には
>細心の注意が必要な感じがします。
>つまりつねに細心の注意を払えない人(つまり自分)は
>同名の変数を避ける方が無難見たいです。

同名の変数は使わずに、接頭辞によって変数の種別を明確にするのが一般的な方法だと思いますよ。

ただし、自動変数は使い捨てなので、他の手続きの自動変数と同名でも気にする必要はありませんよ。

>ただ今まで変数はわかりやすい様にオブジェクト名と
>同じにして居たのでオブジェクト名,変数名共によく
>使っていた[社名],[住所],&社名,&住所などは同名に
>なる可能性が高い事になります。
>これを避けるために全てのファイルの同名に成りそうな
>[社名]とか[住所]とかのオブジェクト名や変数名を
>[仕入れ伝票の社名],[納品伝票の社名],&仕入れ伝票の社名,
>&納品伝票の社名,の様に変えるとすれば結構大変ですね。
>それともオブジェクト名と変数名を同じにしないで
>納品書.wfmとかのオブジェクト名は[社名]で変数名は
>&納品書の社名みたいにすればいいのでしょうか?

オブジェクト名と変数名を同じにするより、項目名と変数名を同名にする方がいいですよ。

これは、項目に対応する変数という考え方で、一種のバッファです。
この場合にはデータ型も項目と同じにします。
※それぞれの表の同名項目のデータ型がバラバラなのはちょっと論外です。
※その場合には、まずそれぞれの表のデータ型を一致させるべきですよ。

項目に対応しない変数ならば、
オブジェクト名を変数名に合わせるのが見分けがついていいと思います。

変数名にフォームの名前を付けて区別するのは大変なだけですよ。
絶対に止めたほうがいいですよ。

他のフォームと区別して使いたい変数は局所変数にすればいいです。
そうすれば、フォーム毎に同名の変数があっても干渉し合う事はありません。
しかし、「局所変数は使い方が難しいと思う人」が多いので…(T_T)

<蛇足>

例えば…以下は架空のタラレバの例です(^^ゞ

A.kevの[名札 メイン]

変数宣言 共通,整数 {&納品書メイン,&納品書サブ,&納品書メイン多重化,&納品書サブ多重化,&請求書メイン,&請求書サブ},\
共通,数値,{&得意先コード1,&得意先コード2,&締年,&締月,&締日,&納品年,&納品月,&納品月,&納品日,&単価,&請求書番号1,&請求書番号2,&納品書番号,&ok,&ok2,&ok3,&印刷頁,&納品書サブ金額合計},\
共通,長整数,{&行番号},\
共通,文字列{&ok4,&得意先,&お届先,&商品名,&ふりがな,&請求部署,&状態,&説明文,&分割請求,&フォーカス}

b.kevの[フォーム::フォーム開始]

変数宣言 固有,数値{ &ok,&印刷頁,&確認,&印刷用,&請求書発行年,&請求書発行月,&請求書発行日},\
固有 文字列{&状態}

[フォーム開始]イベントで共通変数を宣言してもいいですけれど…
普通は[名札 メイン]で行いますよ。

結局、この例では以下の変数が同名になっています。
上書きされた変数もありますが、ほとんどは固有変数が有効で、共通変数が隠されて使えない状態です。

変数,固有,数値,&ok← こちらが有効 
変数,共通,数値,&ok
変数,固有,数値,&印刷頁← こちらが有効
変数,共通,数値,&印刷頁
変数,固有,数値,&状態← こちらが有効 
変数,共通,文字列,&状態
変数,共通,数値,&納品月← 上書きされた
変数,共通,数値,&納品月

22202 なんだかよくわからなくなってきました しぼうかん 2003/09/06-17:37
記事番号22201へのコメント
ド・モ・ONnojiさん、こんばんは.

ONnojiさんに紹介して頂いた頁にも変数の種別を
接頭文字によって使い分ける方法が書いてありました。

>同名の変数は使わずに、接頭辞によって変数の種別を明確にするのが一般的な方法
>だと思いますよ。

NO.22191の様な場合商品受注台帳.wfmや部品発注書.wfm
の中のいろいろなイベントで&コードや&社名を何度も
使いたいので、何度も宣言しなければならなくなり
自動変数を使うのは結構大変な感じがします。

そこでNO.22191の様な場合で商品受注台帳.wfmでは
&コードや&社名や&数量は、&pコード,&p社名,&p数量
として共通変数で宣言して、部品発注書.wfmでは
&コードや&社名や&数量は&gコード,&g社名,&g数量
とふうにして固有変数で宣言すると言う事なのでしょうか?

もしそうだとしたら部品発注書.wfmで宣言する
&g社名や&gコードや&g数量を共通変数で宣言したい
場合は同名になってしまいますよね?

なんかせっかくの説明をよく理解できてない様な
気がして来ました。

>オブジェクト名と変数名を同じにするより、項目名と変数名を同名にする方がいいですよ。

少し説明不足でした。

今まで変数はほとんど共通変数で宣言して、かつ原則として、オブジェクト名=項目名=変数名としています。


>変数名にフォームの名前を付けて区別するのは大変なだけですよ。
>絶対に止めたほうがいいですよ。


項目名=オブジェクト名=変数名を原則として使っているので
変数だけでなく項目名もオブジェクト名もフォームの名前を付ける事を考えましたが
やはりこれは大変過ぎますね。


すこしまとめると(同じ説明の繰り返しかも?)

1)同名の変数は避けた方が良い。

2)避ける方法としては変数の種別や変数の接頭文字に種別を表す
  文字をつけて区別する方法がある。

3)変数にフォームの名前を付けるのは止めた方が良い。
  

Q.という事は商品受注台帳.wfmの[社名]の値を取得する為に
  共通変数で&社名を宣言した場合は部品発注書.wfmの[社名]の
  値を取得する為には&社名を共通変数で宣言したくても
  固有変数とか共通変数以外で宣言した方が良いという事
  なのでしょうか?

何だかよくわからなくなって来ました。

22204 Re:同名の変数の避け方についてもう少し教えて下さい。 悲しげ 2003/09/06-18:29
記事番号22199へのコメント
しぼうかんさん wrote
>ただ今まで変数はわかりやすい様にオブジェクト名と
>同じにして居たのでオブジェクト名,変数名共によく
>使っていた[社名],[住所],&社名,&住所などは同名に
>なる可能性が高い事になります。
>
>これを避けるために全てのファイルの同名に成りそうな
>[社名]とか[住所]とかのオブジェクト名や変数名を
>[仕入れ伝票の社名],[納品伝票の社名],&仕入れ伝票の社名,
>&納品伝票の社名,の様に変えるとすれば結構大変ですね。

う〜ん、よもや誤解している訳ではないとは思いますが、もしかして次の
ように誤解してはいませんよね?(^^;)
例えば、得意先マスターのフォームから[社名]の値を変数に取得して納品伝票の
フォームにて代入する場合で云えば、同名は「イケナイ」のだから、
得意先フォームで使う変数は例えば「&得意先社名」としなければならず、
この値を納品伝票のフォームで使うには今度は「&納品伝票社名」なる変数に
渡さなければならない……とか云う誤解。
よほど特殊なケースでない限り、このような場合、普通は「&社名」と云う
ひとつの変数で共用してもいいのではないでしょうか?
 ここで云う「ひとつの変数」とは、新たに宣言(または取得)する同名の変数ではなく、
既に宣言(または読み込み取得)済の既存変数を指します。

その意味で、先に私が書いた

>そもそも#配列要素数や#変数関数でチェックするのは、
>同名変数の再宣言を避けることが主な目的であって、

は、ちょっと書き方が悪かったですね。「同名変数の再宣言を避けること」
イコール「別名変数として宣言すべし」と云う訳ではなく、既にその変数が
宣言(または読み込み取得)済みであるならば、それをそのまんま利用する
(新たに変数宣言などを行わない)ため、と云う趣旨です。(^^;)
あ、共通変数とか固有変数については。

以上、誤解している筈はないと思いつつ・・・・(^^;)

22206 またまた大当たりデス しぼうかん 2003/09/06-19:24
記事番号22204へのコメント
悲しげさん、またまた大当たりデス!

まさしくそういう風に誤解していました。

変だな〜と思いつつも自分の首の上にのっかっているMPUでは
そういう風にしか理解できませんでした。

やはり#配列要素数などを使って変数が宣言されているかどうか
確認して宣言済みであればその変数を再利用すると言うことです・・・よね。

と言うことは単独または同時に使用される可能性が有るA.wfmと
B.wfmの2つのフォームで同名の変数(仮に&社名とする)を使用する場合

変数の宣言方法は共通変数を使う場合は#配列要素数などで
&社名が宣言済みかどうかを確認して宣言済みなら宣言せず、
未宣言なら宣言する。

という様なことをA.kevとB.kevの両方のイベントファイルに書いて置けば良いと言う理解で正しいでしょうか?

採点をお待ちしてます。

22207 Re:「共通変数命(いのち)」スタイルで問題はないと思います。DOS桐ではポピュラーな手法ですね。 ド・モ・ONnoji 2003/09/06-21:07
記事番号22202へのコメント
>Q.という事は商品受注台帳.wfmの[社名]の値を取得する為に
>  共通変数で&社名を宣言した場合は部品発注書.wfmの[社名]の
>  値を取得する為には&社名を共通変数で宣言したくても
>  固有変数とか共通変数以外で宣言した方が良いという事
> なのでしょうか?

しぼうかんさん、こんばんは。

ちなみに、No.22204の「共通変数の悲しげ」さんのリプライですでに解決済みと思いますが…

スイマセン、Q.ことはまったく理解していませんが…

しかし、「共通変数命(いのち)」スタイルで問題はないと思います。
これは、DOS桐ではポピュラーな手法ですね。
※しかし、私の場合には「組み込み変数」と「固有変数」しか使いませんでした。(^^ゞ

「共通変数命(いのち)」スタイルの場合には、
「局所変数」と「自動変数」のどちらも「しぼうかん」さんには混乱の元だと思います。

<追伸>

あくまでも私( ONnoji )の場合ですが…

私はフォーム毎に独立した変数を利用するので、「局所変数」を基本にしています。

「自動変数」は、イベントハンドラや一般手続きの使い捨て変数として利用しています。
※必要があれば、「参照渡しの引数」も多用しています。

そして、「共通変数」も「固有変数」のどちらも宣言しません。つまり全く使用していませんのです。
※例外としてだけ、対話操作を必要としない一括処理を使用する場合には「固有変数」を利用します。
※一括処理はバッチ処理とプログラミングの実験の場合にしか使用していません。

なお、共通変数の替わりに一部の「組み込み変数」を必要に応じて使っています。


22208 「共通変数命(いのち)」スタイルでいこうと思います しぼうかん 2003/09/06-21:56
記事番号22207へのコメント
ONnojiさん、こんばんは.

なるほど共通変数も固有変数も宣言しないとは
少し驚きました。

多分ONnojiさんぐらいになると変数一つ宣言するにも
システムの全体像を決定してから決めるんでしょうね。

私は適当に作ってみてダメだったらファイル削除や
変数名や項目名の変更や削除などを繰り返して
いじり回してファイル数やイベントを増やしていったり
する行き当たりばったりの方法を取るのでシステム作成途中
では変数などの細かい制御は難しいなと感じていました。

確かに変数の種別にもいろいろ用意してあるのは
時と場合によって使い分けた方が応用が利くのだろうな
と想像することは出来ます。

しかし私のレベルでは使い分けが難しそうなので
今は共通変数命のスタイルでいこうと思っています。

何度も丁寧なレスありがとうございました。
22211 Re:「共通変数命(いのち)」スタイルでいこうと思います 悲しげ 2003/09/06-23:37
記事番号22208へのコメント
>なるほど共通変数も固有変数も宣言しないとは
>少し驚きました。

同じく。
いえ、「少し」どころか「かなり」驚きました。

ps.
やはり「変数の・・・・」は当たっていたかも。(^^;)

戻る