人気ブログランキング | 話題のタグを見る

[BASIC!] スマホのBASIC言語でツールを作る3(1) [GW_LIB利用サンプル] (11/8)

前回、BASIC!でトースト表示中はタッチ操作不可能なので、メモ連続表示中の中断は出来ないと諦めたが、そういえばGW_LIBを使った音声メモを予定していた事を忘れていた。

なので、GW_LIBを使った画面に、音声入力が出来るサンプルから始めようと思う。

【スマホのBASIC言語でツールを作る】
シーズン1:Android for BASIC
シーズン2:BASIC!
シーズン3:GW for BASIC! ←今ココ
と新シリーズ突入だ。

現在出来上がったサンプルは以下の通り。

% This is a minimalist example of creating a GUI with the GW lib %
INCLUDE "GW.bas"
DIM mm$[2,20]
%DIM rc$[20]
c$=""
m$=""
s$=""
mkey$=""
c$="メモ"
m$="%"+mkey$+"%"
flg=0
gosub SQL

UNDIM rc$[]
DIM rc$[20] %null init
for i=1 to 20
if mm$[1,i]="" then i=i-1:F_N.break
rc$[i]=mm$[1,i]
next
print i
if i=0 then
flg=1
else
flg=0
ARRAY.copy rc$[1,i],record$[]
for j=1 to i
record$[j]="Edit|"+record$[j]+"|Delete"
print using$("","%.0f,%s",j,record$[j])
next
endif

DO
GW_DEFAULT_TRANSITIONS ("page=pop, panel=push, dialog=pop") % by default is: none/push/pop

page = GW_NEW_PAGE()
GW_ADD_TITLEBAR(page, "Welcome to GW")
GW_ADD_TEXT(page, "Here are some controls:")
GW_ADD_BUTTON(page, c$, "duy")
GW_ADD_INPUTLINE(page, "", "This is an input line, modify me!")
GW_ADD_CHECKBOX(page, ">Checkbox")
GW_ADD_FLIPSWITCH(page, "Flip switch:", "Off", "On")
ARRAY.LOAD files$[], "Edit|File #1|Delete", "Edit|File #2|Delete", "Folder #1|Delete", "View|Total Size"
% lv3 = GW_ADD_LISTVIEW (page, files$[])
if flg=1 then
else
lv3 = GW_ADD_LISTVIEW (page, record$[])
endif
GW_ADD_BUTTON (page, "Back", "BACK")

GW_RENDER(page)

r$ = GW_WAIT_ACTION$()
popup r$
if r$="duy" then
HTML.CLOSE
LIST.create S,Li_talk
STT.listen "🎤命令してください⇒" %音声入力
%HTML.OPEN

STT.results Li_talk %認識結果をリスト型変数へ格納
HTML.OPEN
LIST.get Li_talk,1,c$ %1パターン目を取り出す
%if r$="BACK" then GOTO ED_PRG
%goto LOOP

%LIST.clear Li_talk
endif
UNTIL r$ = "BACK"

end
%------------------------
% データベース
% GOSUB SQL
SQL:
%POPUP m$
SQL.open DP,"memo.db" %Database Pointer
%初回起動時有効化 SQL.new_table DP,"tmemo","memo","systime"
SW.begin c$
SW.case "メモ"
%検索キーが空なら
if mkey$="" then
SQL.query CP,DP,"tmemo","memo,systime" %Cursor Pointer,"table_name","search item1,item2"
else
SQL.query CP,DP,"tmemo","memo,systime","memo LIKE "+"'"+m$+"'" %select * from tmemo where memo LIKE '%m$%'
endif
SQL.next fe,CP,m1$,m2$ %flag of end record, memo string, systime string
for i=1 to 20
if (!fe) then
mm$[1,i]=m1$
mm$[2,i]=m2$
%print using$("","%.0f,%s,%13.0f",i,m1$,val(m2$)) %Standard BASIC! numbers are floating point.
SQL.next fe,CP,m1$,m2$
else
mm$[1,i]=""
mm$[2,i]=""
endif
next
SW.break
SW.case "追加"
SQL.insert DP,"tmemo","memo",m$,"systime",s$
SW.break
SW.case "削除"
SQL.delete DP,"tmemo","memo="+"'"+m$+"'" %where memo='m$'
SW.break
SW.case "クリア"
SQL.delete DP,"tmemo"
SW.break
SW.default
SW.end
SQL.close DP
return
%------------------------


これはGW_sample.basをベースに、STT(音声入力)追加とリストビュー追加、前回までのソース(mytest13.bas)からSQLサブルーチンをまるごと移植してきたものだ。

まず、STTの呼び出しはlistenはOKだがresultsを呼び出すとGW_LIB画面が真っ白になってしまうか、元の画面に戻ってもボタンで遷移しないという不具合が起きた。

マニュアルを調べたり、実験してみたりした結果、真っ白なのはBASIC!のテキスト画面らしく、元の画面に戻ったように見えても実は表示が残っているだけで、プログラム的には別の処理へ移っているらしい。

これを解決するのに、HTML.closeというBASIC!のコマンドを叩くとうまくいった。

つまり、GW_LIBはHTMLモードで動いていると、GWマニュアルには書いてあってBASIC!の画面とは違うので、HTMLを終了させてから音声入力を行うと、resultsまできちんと動いた。

なので、HTML.close>STT関係実行>HTML.open>GW_NEW_PAGEへ戻るという流れになる。

またGW_ADD_LISTVIEWでリストビューを表示しこれにメモ内容を表示する。
このリストビューは有能で、アイテムを左右スラッシュすると、EditやDeleteを選ぶことができる。
しかし、このリストビューに値を与えるためには、可変配列(例:record$[])を使う必要があり、定義前にSQL内容のアイテム数を知ってそれを配列定義時に与えなくてはならなかった。可変配列のサイズを定義するためARRAY.copyというコマンドで配列サイズを決める方法を見出し、そのために少し回り道をしている。iがNULLを含まない必要な配列のサイズでrc$とrecord$配列は1次元で、rc$[1,i]は1番目からi番目を使ってrecord$[]を定義している。大きすぎればNULL文字のリストビューが出来上がってしまい、見た目が良くない。

またDO-UNTILループはGW_WAIT_ACTIONS関数の周辺だけではなく、GW_NEW_PAGEも含む大きさへ拡張している。
今は回り道である、SQLからのデータをARRAY.copyに渡す処理を行なってからループ開始しているが、本チャンではこの回り道処理もDO-UNTILループに含むことになる。

SQLサブルーチンをそのまま生かす形で、各種変数は切ってある。

使い方は、一番上の「メモ」というボタンを押すと、音声入力STT関数が呼ばれ、デバッグ表示でデータベースの内容をBASIC!画面にトレースし、その値をリストボックスに反映している。音声入力した文字は、「メモ」ボタンのタイトルを変化させて表示し、確かにBASIC!ステートメントで変更・表示できることを確認した。最後に末尾のBACKボタンでプログラムが終了する。今のところデータベースは表示だけしかできない。
[BASIC!] スマホのBASIC言語でツールを作る3(1) [GW_LIB利用サンプル] (11/8)_a0034780_03304080.jpg

画面の様子はこのようになっている。右スラッシュでEditというコントロールが見えているのが分かる。左なら赤いDeleteが出現する。

P.S.
今のところ、データベースはmytest13.basで作ったものを流用しており、データベース=0アイテムの場合の処理(flg=1)は入っていない。







by k1segawa | 2021-11-08 03:40 | BASIC | Comments(0)