UWSC仕様メモ

気づいた仕様または現状動作を書いておく。

目次

token()の第二引数に定数を指定するとエラーになる。

token("\",GET_WIN_DIR)
→ Uスクリプト: GET_WIN_DIR は予約語です
const string="123\abc"; token("\",string)
→ Uスクリプト: STRING:定数は使えません

※定数を変数で受ければ意図した動作が可能。

winDir=GET_WIN_DIR
msgbox(token("\",winDir))

[参考情報] token関数が const 定数を破壊する(2006/6/23)

UWSC 4.2 Pro | WinXP Home SP2 | 2007/4/13(眠)

getstr()の第二引数(コントロールの順番)に0を指定した場合の挙動。

ヘルプでは『1から指定』となっているが、0を指定しても取得できるケースが多い。

id=exec("control desk.cpl ,2")
msgbox(getstr(id,0,STR_EDIT)) // "Windows クラシック スタイル"
sckey(id,VK_ALT,F)
msgbox(getstr(id,0,STR_EDIT)) // "標準"

※選択されている項目が取得される。

UWSC 4.2 Pro | WinXP Home SP2 | 2007/4/30(眠)

EXE生成前後で結果が異なる点

xxxx.uws では正常動作だが、EXE化すると動かない。そんなことがないように、EXE化前後の挙動の違いを常に意識してコーディングすることが望ましい。

内容 スクリプトコード difpoint.uws の結果 difpoint.exe の結果
特殊変数 GET_UWSC_NAME "DIFPOINT.UWS" "DIFPOINT.EXE"
特別な窓のタイトル (注1) status(getid(GET_THISUWSC_WIN),ST_TITLE) "difpoint.uws" "difpoint"
特別な窓のタイトル status(getid(GET_LOGPRINT_WIN),ST_TITLE) "UWSC - difpoint.uws" "difpoint"
入力系の関数の窓のタイトル (注2) status(id,ST_TITLE) "UWSC - difpoint.uws" "difpoint"

(注1) GET_ACTIVE_WIN で実行中のスクリプトの窓のタイトルを取得した場合も同じ。GET_FROMPOINT_WIN でもたぶん同じ。
(注2) input(), msgbox(), slctbox()で確認済み。popupmenu()は確認していない。



確認用スクリプト difpoint.uws.txt   difpoint.exe.txt  ←リンク切れの場合はあきらめて
ダウンロード後にファイル名を変更する。
difpoint.uws.txt → difpoint.uws   difpoint.exe.txt → difpoint.exe
※difpoint.exe は、EXE化してUPXにより圧縮したもの。

UWSC 4.2 | WinXP Home SP2 | 2007/5/4(眠)

option 指定の specialchar

機能説明(uwscヘルプ): 実行時に特殊文字(<#CR><#DBL><#TAB>)の変換をしない
V4.3 の追加機能。機能がわかりにくいのでスクリプトで確認してみる。

// option SPECIALCHAR の仕様確認スクリプト1 スクリプト内で特殊文字を生成(UWSC)
option specialchar

print "--- 直接指定 ---"
print "<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>"
print "--- 変数 ---"
dim strV="<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>"
print strV
print "--- 定数 ---"
const strC="<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>"
print strC
print "--- 配列 ---"
dim strH[]="<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>"
print strH[0]
print "--- テキストブロック ---"
print strTB

acw(getid(GET_LOGPRINT_WIN),0,0,600,300);  sleep(5)

//////////
TEXTBLOCK strTB
<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>
ENDTEXTBLOCK

---------- [結果1−A] テキストブロック -----------------------------
<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>
---------- [結果1−B] 直接指定・変数・定数・配列 -------------------
"1行目−1	"1行目−2"
"2行目"
----------------------------------------------------------------------
// option SPECIALCHAR の仕様確認スクリプト2 スクリプト外の特殊文字を取り込む(UWSC)
// 下の『』内をクリップボードへコピーしてからスクリプト起動
// 『<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>』
option specialchar
ifb 0=pos("行目−",getstr(0))
	msgbox("クリップポードが不正です。<#cr>スクリプトコメントをお読みください。");  exit
endif
print "--- 直接指定 ---"
print getstr(0)
print "--- 変数 ---"
dim strV=getstr(0)
print strV
print "--- 定数 ---"
const strC=getstr(0)
print strC
print "--- 配列 ---"
dim strH[]=getstr(0)
print strH[0]

acw(getid(GET_LOGPRINT_WIN),0,0,600,300);  sleep(5)
---------- [結果2−A] 直接指定・変数・定数・配列 -------------------
<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>
----------------------------------------------------------------------
[備考] [使い方で分かったこと] [特殊文字生成の別解]
小文字の特殊変数の下の性質を利用した方法。option specialchar は不要。

文字定数の解釈時のみに特殊文字化される。
(『うみうみ屋さんの掲示板 Re:FPUTでの出力 【2005/02/15 21:19:59】』より引用)
dim strV="<#DBL>1行目−1<#TAB><#DBL>1行目−2<#DBL><#CR><#DBL>2行目<#DBL>"
print chgStrSpecC(strV)
acw(getid(GET_LOGPRINT_WIN),0,0,600,300);  sleep(5)

//--------------------
// 特殊文字変換
// fput()で特殊文字を書き出せるように変換する。
// (入力値)str		変換前文字列
// (戻り値)result	変換後文字列
// (参考文献)
// うみうみ屋さんの掲示板  FPUTでの出力【2005/02/15 18:54:36】
// http://www.h7.dion.ne.jp/~umiumi/old_bbslog.zip
// 2007/02/19(眠)
//--------------------
function chgStrSpecC(str)
	str=chgmoj(str,"<#dbl>","<@dbl>")
	str=chgmoj(str,"<#tab>","<@tab>")
	str=chgmoj(str,"<#cr>","<@cr>")
	result=chgmoj(str,"@","#")
fend
---------- [結果3−A] 変数 ---------------------------------------
<#dbl>1行目−1<#tab><#dbl>1行目−2<#dbl><#cr><#dbl>2行目<#dbl>
----------------------------------------------------------------------

[参考文献]
旧掲示板 " の文字列定数を文字列として扱う方法 【2004/02/28 12:19:02】
旧掲示板 FPUTでの出力 【2005/02/15 18:54:36】
UWSC 掲示板 ログ235 <#DBL>と<#dbl>は扱いが違う?(2006/9/13)
UWSC 掲示板 ログ738 UWSC の文字列の定数表現は内部表現が<#DBL>という文字列を作り出せない。(2007/4/29)

UWSC 4.3 Pro | WinXP Home SP2 | 2007/06/10,11(眠)

EXE生成前後で共通の『実行中のスクリプト名』を取得する。

特殊変数 GET_UWSC_NAME は、取得される内容がEXE生成前後で異なる。
すなわち、

Test.uws : GET_UWSC_NAME は『TEST.UWS』
Test.exe : GET_UWSC_NAME は『TEST.EXE』

そこでひと工夫が必要となる。

thisUwscName=GET_UWSC_NAME
thisUwscName=token(".",thisUwscName)
msgbox(thisUwscName)

EXE生成前後ともに『TEST』が取得できた。しかしながら、この方法では、常に大文字変換されてしまう。
別の方法が必要。

thisUwscName=token(".",status(getid(GET_THISUWSC_WIN),st_title))
msgbox(thisUwscName)

これなら、大文字小文字に忠実、EXE生成前後で同じ結果が取得できる。


[蛇足]
この結論は、私が初めて『うみうみ屋さんの掲示板』に質問投稿したときにいただいた解答と同じ。
旧掲示板のログ(2003/04/29〜2006/05/28) xxx.uws のファイル名を取得する方法 【2006/05/17 21:38:40】


//////////
(2007/7/21 付記) UWSC 4.3b Pro | Win98 SE
Win9x ではEXE生成すると、上の方法では常に大文字変換されてしまうことが判明。次に示す方法なら、Win98でEXE生成しても大文字小文字を区別して取得できる。

strFileName=status(getid(GET_THISUWSC_WIN), ST_TITLE)
for i=0 to GETDIR(GET_CUR_DIR)-1
	ifb strconv(GET_UWSC_NAME, SC_LOWERCASE)=strconv(GETDIR_FILES[i], SC_LOWERCASE)
		strFileName=GETDIR_FILES[i]
		break
	endif
next
strFileName=token(".",strFileName)
msgbox(strFileName)

[参考文献]
UWSC 掲示板 ログ958 msgboxのタイトルの大文字小文字の区別 (2007/7/20)


(2007/10/14 付記) UWSC 4.3d1 Pro
実行中のスクリプト名の取得で
thisUwscName=token(".",status(getid(GET_THISUWSC_WIN),st_title))
には、バグが判明した。

ファイル名のベース名やディレクトリ名に『.』が含まれている場合に正しい結果にならない。
(誤動作例) 『c:\abc1.01\def.uws』『c:\abc\def.ghi.uws』

下のようにすれば可。
strFile=status(getid(GET_THISUWSC_WIN),st_title)
thisUwscName=copy(strFile, 1, pos(".", strFile, -1)-1)
msgbox(thisUwscName)
UWSC 4.3a Pro | WinXP Home SP2 | 2007/06/21(眠)

Eval()関数で、コレクションの中のエレメントの指定でエラーとなる。

eval("strW1:=IE.document.links(0).href")    // ×::Uスクリプト: 式がおかしい or 型が合っていない

回避方法は下の通り。

eval("strW1:=IE.document.links[0].href")    // ○

UWSC V4.3d1 | WinXP Home SP2 | IE 6.0.2900.2180 SP2 | 2007/10/14(眠)

定数 GET_CUR_DIR の落とし穴

定数 GET_CUR_DIR にパス名やファイル名を連結する処理の留意点。 スクリプトファイル(xxx.uws)と同じ場所のファイルのパス指定は、下の記述を使う。

// test1.uws
msgbox(GET_CUR_DIR+"\outPut.txt")

test1.uws をサブディレクトリ(c:¥ script)に置いて起動すると、

C:\script\outPut.txt

で、意図したとおりだが、ルートディレクトリ(c:¥)に置くと、

C:\\outPut.txt

となり、誤動作する。

対処は自作関数で可能。

// test2.uws
msgbox(getCurDir()+"\outPut.txt")
/////
function getCurDir()
	ifb 3=length(GET_CUR_DIR)
		result=copy(GET_CUR_DIR, 1, 2)
	else
		result=GET_CUR_DIR
	endif
fend

ソースコードを短かくしたければ、下でも良い。

// test3.uws
msgbox(getCurDir()+"\outPut.txt")
/////
function getCurDir()
	result=GET_CUR_DIR
	if 3=length(GET_CUR_DIR) then result=copy(GET_CUR_DIR, 1, 2)
fend

同じ事象が、定数 GET_UWSC_DIR にも当てはまる。 フロッピーディスクやコンパクトフラッシュでスクリプトを持ち歩く場合は、わざわざサブディレクトリを作らないこともありうる。インストール先を指定しないでスクリプトを配布する際には、留意しておきたい。


UWSC V4.41 | WinXP Home SP2 | 2008/04/08(眠)

←トップページのカウンタと共通です。