0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UWSCRAdvent Calendar 2023

Day 21

UWSCRの組み込み関数:GUI系

Last updated at Posted at 2023-12-20

ダイアログ等を表示する組み込み関数の変更点についての解説です。

クラス名

各ウィンドウのクラス名がUWSCとは異なります。また、それぞれ定数が定義されています。

関数 クラス名 定数
msgbox UWSCR.MsgBox CLASS_MSGBOX
input UWSCR.Input CLASS_INPUTBOX
slctbox UWSCR.SlctBox CLASS_SLCTBOX
balloon UWSCR.Balloon CLASS_BALLOON
logprint UWSCR.LogPrintWin CLASS_LOGPRINTWIN
createform UWSCR.Form CLASS_FORM

print文/logprint

UWSCRがコンソールアプリケーションとなったことから、print文の出力は原則コンソール上で行われるようになりました。UWSCのようにウィンドウ表示をする場合は以下のいずれかを行ってください。

  • スクリプト内でOPTION GUIPRINTを設定する
  • 設定ファイルのoptions.gui_printをtrueにする
  • uwscr --windowで実行する
  • GUIビルドのUWSCRを使う

GUIビルドのUWSCRは提供されていません。利用者自身でソースコードからビルドする必要があります。またGUIビルド版は十分なテストが行われていないため予期せぬ動作を起こす可能性があります。

input

複数入力

入力欄を複数指定できるようになりました。第一引数に配列を渡すことで入力欄を複数にできます。配列の内訳は[メッセージ, ラベル1, ラベル2, ...]となっており、0番目がダイアログのメッセージ、1番目以降が各入力欄のラベルとなります。

sample.uws
input(["0番目はメッセージ", "ラベル1", "ラベル2"])

複数入力欄

入力欄が複数ある場合はinput関数の戻り値が配列となり、各入力欄に入力された値が返ります。キャンセル時は空配列です。

第二引数のデフォルト値、第三引数のマスクフラグもラベル数に合わせた配列を渡すことで個別に指定できます。

sample.uws
// 二箇所入力
labels = ["ログイン認証", "ユーザー名", "パスワード"]
// デフォルト値、ユーザー名にデフォルト値を入れる
default = ["user1", EMPTY]
// マスクフラグ、パスワードをマスクする
mask = [FALSE, TRUE]

user = input(labels, default, mask)
if length(user) > 0 then
    print 'ユーザー名: ' + user[0]
    print 'パスワード: ' + user[1]
else
    print 'キャンセルされました'
endif

パスワード欄にマスクが適用されている

ファイルのドラッグアンドドロップについて

Explorer等からファイルをドラッグアンドドロップすると入力欄にそのファイルパスが自動入力されます。また、入力欄が複数ある場合は入力したい欄にドロップすることでその入力欄に自動入力されます。

slctbox

以下の破壊的変更が行われています。既存のスクリプトを実行する場合はご注意ください。

戻り値のタブ文字連結を廃止

UWSCではSLCT_CHKSLCT_LSTで複数項目を選んだ場合にタブ文字連結された文字列を返していましたが、UWSCRでは配列を返します。

uwsc
items = slctbox(SLCT_LST or SLCT_STR, 0, "えらぶ", "foo", "bar", "baz")
for item in split(items, "<#TAB>")
    print item
next
uwscr
items = slctbox(SLCT_LST or SLCT_STR, 0, "えらぶ", "foo", "bar", "baz")
for item in items
    print item
next

表示項目が連想配列の場合

連想配列の値ではなくキーを表示するようになりました。

hash list
    hoge = "ほげほげ"
    fuga = "ふがふが"
    piyo = "ぴよぴよ"
endhash

selected = slctbox(SLCT_BTN or SLCT_STR, 0, "えらぶ", list)
if selected != -1 then
    print list[selected]
else
    print "キャンセルされました"
endif

タイムアウト時の戻り値

0ではなく-1を返すようになりました。

popupmenu

以下の破壊的変更が行われています。既存のスクリプトを実行する場合はご注意ください。

戻り値の変更

戻り値がインデックス値ではなく、選んだ項目に表示される文字列になりました。枠外を選択した場合はEMPTYが返ります。

サブメニュー指定方法の変更

メニューの要素を配列にするとそれらの項目がサブメニューになります。従来の波括弧{}表記は無視され通常の文字列要素として扱われます。

// 要素を配列にすると直前の項目のサブメニューになる
list = ["項目1", "項目2", "サブメニュー", ["サブ項目1", "サブ項目2"], "項目3"]
popupmenu(list)

サブメニュー指定時の表示

連想配列を渡した場合

メニュー項目として連想配列を渡した場合は値ではなくキー一覧が表示されるようになりました。

hash list
    hoge = "ほげほげ"
    fuga = "ふがふが"
    piyo = "ぴよぴよ"
endhash

selected = popupmenu(list)
if selected != EMPTY then
    print list[selected]
else
    print "キャンセルされました"
endif

balloon/fukidasi

変形方法を示す定数を追加

UWSCでは第四引数でクチバシの向きを数値で指定していましたが、これに該当する定数を追加しました。また、角丸表示ができるようになりました。クチバシの表示位置はUWSCとは異なります。

定数 詳細
FUKI_DEFAULT 変形しない
FUKI_UP 吹き出しに上向きのクチバシを付ける
FUKI_DOWN 吹き出しに下向きのクチバシを付ける
FUKI_LEFT 吹き出しに左向きのクチバシを付ける
FUKI_RIGHT 吹き出しに右向きのクチバシを付ける
FUKI_ROUND 吹き出しの角を丸くする
FUKI_POINT 指定座標をクチバシの先にする

FUKI_POINTのみ他のクチバシ定数と併記でき、その場合はクチバシの先が指定座標となります。

balloon("マウスカーソル位置が吹き出しの左上", G_MOUSE_X, G_MOUSE_Y, FUKI_DOWN)
sleep(2)
balloon("マウスカーソル位置にクチバシ先端", G_MOUSE_X, G_MOUSE_Y, FUKI_DOWN or FUKI_POINT)
sleep(2)

背景色に0を指定した場合

UWSCではデフォルトの黄色になっていましたが、UWSCRでは黒になります。

fukidasi("背景色に0", , , 0, 30, "遊ゴシック", $FF, 0)

uwsc
uwscr

createform

UWSCではIEコンポーネントが使われていましたが、UWSCRではWebView2を利用しています。そのためUWSCとは互換性がありません。

Microsoft Edge WebView2 Runtimeのインストールが必要です。通常はプリインストールされているはずですが、適切にアップデートの行われていないWindows 10には含まれていない場合があります。

戻り値

非同期フラグにより戻り値が変わります。FALSEの場合はForm情報オブジェクトを、TRUEの場合はFormオブジェクトを返します。

Form情報オブジェクト

submitしたformに含まれる情報を示すUObjectです。

Form情報オブジェクトの構成
{
    "submit": string, // 押されたsubmitボタンのname
    "data": [ // form内の各要素のnameとそのvalueの配列
        {"name": string, "value": string},
    ]
}

以下はコード実行例です。

sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Sample.html</title>
</head>
<body>
    <form>
        <div>
            <span>ユーザー名</span>
            <input type="text" name="user">
        </div>
        <div>
            <span>パスワード</span>
            <input type="password" name="pwd">
        </div>
        <div>
            <select name="slct">
                <option value="foo">foo</option>
                <option value="bar">bar</option>
                <option value="baz">baz</option>
            </select>
        </div>
        <div>
            <textarea name="txt" cols="30" rows="10"></textarea>
        </div>
        <div>
            <input type="submit" value="OK" name="OK">
            <input type="submit" value="Cancel" name="Cancel">
        </div>
    </form>
</body>
</html>
sample.uws
r = createform("sample.html", "Sample", FALSE, , 300, 300)
select r.submit
    case "OK"
        print "OKが押されました"
        print "formの値は以下です"
        for data in r.data
            print data.name + ": " + data.value
        next
    case "Cancel"
        print 'キャンセルされました'
    case NULL
        print 'submitされずにウィンドウが閉じられました'
selend

formオブジェクト

formを制御するためのオブジェクトです。waitメソッドでユーザー入力があるまで待機します。waitメソッドはform情報オブジェクトを返します。

UWSCのcreateformが返していたオブジェクトとは異なるものです。UWSCのコードそのままでは動作しません。

  • 例: visibleプロパティが存在しない

formオブジェクトは呼び出されたスレッドでのみ動作します。public変数に入れて別のスレッドから呼び出した場合は動作保証外となります。

sample.uws
f = createform("sample.html", "Sample", TRUE, , 300, 300)

r = f.wait()

select r.submit
    case "OK"
        print "OKが押されました"
        print "formの値は以下です"
        for data in r.data
            print data.name + ": " + data.value
        next
    case "Cancel"
        print 'キャンセルされました'
    case NULL
        print 'submitされずにウィンドウが閉じられました'
selend

DOMの操作

formオブジェクトdocumentプロパティでformページのdocumentオブジェクトが得られます。

sample.uws
f = createform("sample.html", "Sample", TRUE, , 300, 300)

// documentプロパティでdocumentオブジェクトを得られる
doc = f.document

// 初期値を入力
doc.querySelector("input[name=user]").value = "stuncloud"
doc.querySelector("select").value = "bar"

f.wait()
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?