PowerBuilderの引用符について
の記事でも少し触れたが、Modifyメソッドに渡すパラメータ文字列を作成する際、チルダを用いた引用符の扱いが非常に面倒くさい。
ls_modify = "r_" + String(ll_i) + ".visible='1~tIF(結果" + String(ll_i) +" = ~~'~~', 1, 0)'"
dw_4.Modify(ls_modify)
↑こういうやたら~が多いやつ
理解するにはなかなか難しいのだが、一つ例を出してこの引用符について説明したい。
例題
①データウィンドウ「dw_1」に下記2つのオブジェクトがあるとする。
- カラム「テキスト1」
- 四角形「r_1」
②前ウィンドウから遷移したときに受け取ったパラメータが"1"の場合は、四角形を常に表示、
パラメータが"1"以外の場合は、
カラム「テキスト1」がブランクであれば表示、何か入力されていれば非表示とする。
正解(の一例)
下記は、Modify関数を使って「r_1」のプロパティ値をコーディング内で変更した例。
IF is_parm = "1" THEN
ls_modify = "r_1.visible=1"
dw_1.Modify(ls_modify)
ELSE
ls_modify = "r_1.visible='1~tIF(テキスト1 = ~~'~~', 1, 0)'"
dw_1.Modify(ls_modify)
END IF
解説
PowerScriptで「文字列である」ことを表すための引用符 "" と、
Datawindow式の中で文字列の引用符として使用される '' の関係に注意。
~はエスケープシーケンスとして使用される。
例)
Messagebox("","This is a 'text'.")
""で囲われたテキストは全て文字列として扱われるため、メッセージボックスには「This a 'text'.」と表示される。
例)
Messagebox("",'This is a ~'text~'.')
''も文字列の引用符として使用できるため、この場合もメッセージボックスには「This a 'text'.」と表示される。内側の~'はチルダが付いているため引用符ではなく文字列として認識される。
例)
Messagebox("",'This is a 'text'.')
これは構文エラーになる。
例)
Messagebox("","This is a "text".")
と同様、引用符の使い方としては不適切だ。
※詳細はPowerScriptリファレンス「リテラルの使い方」を参照。
例題で書いたコードも、
ls_modify = "r_1.visible='1~tIF(テキスト1 = ~~'~~', 1, 0)'"
dw_1.Modify(ls_modify)
Modify関数の引数である文字列
"r_1.visible='1~tIF(テキスト1 = ~~'~~', 1, 0)'"
がdw_1に渡され、そのうちのvisible=に渡される文字列は
'1~tIF(テキスト1 = ~'~', 1, 0)'
であり、これは
IF(テキスト1 = '', 1, 0)
↑というDatawindow式として解釈されてVisibleプロパティにセットされる。
エスケープシーケンスであるチルダが~~'と二重になっているのは、"" に囲われたうえで '' にも囲われているため。
※~tはタブを意味する。
この構造がなかなか理解しづらく、うっかりチルダを抜かしてしまって1時間ぐらい構文エラーに悩まされた記憶がある。
戻り値をチェックしよう
Modify関数はエラーがあった際に戻り値としてエラーメッセージ文字列を返してくれるため、
ls_ErrText = dw_1.Modify(ls_modify)
上記のように書いておけばデバッグが楽になる。
エラーメッセージは「1 行 カラム 17: 不適切な構文です。」といったように問題部分の桁数を出してくれるので、「Modifyしたはずなのに反映されないな?」と思ったら即デバッグして戻り値を見たほうがいい。
コメントする