UWSCRの組み込み関数：GUI系

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

# クラス名

各ウィンドウのクラス名が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を使う

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


# input

## 複数入力

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

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

![複数入力欄](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628188/ac1c6f3e-07a8-c0a8-ceef-cfd229024114.png)

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

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

```php: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
```

![パスワード欄にマスクが適用されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628188/363ced9a-0de6-140b-f217-9b6ff177e0b0.png "入力中の様子")

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

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

# slctbox

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

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

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

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

```php:uwscr
items = slctbox(SLCT_LST or SLCT_STR, 0, "えらぶ", "foo", "bar", "baz")
for item in items
    print item
next
```

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

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

```php
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`が返ります。

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

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

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

![サブメニュー指定時の表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628188/a2064254-246d-9ce5-6354-35e19710e905.png)

## 連想配列を渡した場合

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

```php
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`のみ他のクチバシ定数と併記でき、その場合はクチバシの先が指定座標となります。

```php
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では黒になります。

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

![uwsc](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628188/7cb1d21f-4781-bc98-dad1-44a8f219ef22.png "uwsc")
![uwscr](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628188/da2bfd4e-6c1b-1811-a5c1-759b3df57452.png "uwscr")


# createform

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

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

## 戻り値

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

### Form情報オブジェクト

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

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

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

```html: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>
```

```php: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情報オブジェクト`を返します。



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

- 例: `visible`プロパティが存在しない
:::
:::note alert
formオブジェクトは呼び出されたスレッドでのみ動作します。public変数に入れて別のスレッドから呼び出した場合は動作保証外となります。
:::


```php: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`オブジェクトが得られます。

```php: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()
```