9−7 Palmに名前を覚えてもらおう その2
さて、NextScreenで次の画面に移れるようになりましたので、名前を登録する画面の方の作成に移りましょう。
2つめのフォーム1006は、こんなデザインにしてみました。
(おお、Basic BASICはじめてのVer.2.のスクリーンショットですね。)

フィールド1008に名前を入力して、Registボタンをタップすると登録完了です。
ちなみに、上向き矢印は、Shift Indicatorで、Graffitiの入力モードの状態を表示するお馴染みのものですね。
これ自体に何のイベントも発生しませんが、Graffitiのモードと連動して自動的に表示が変化しますので、文字入力のあるプログラムには置いておくのが親切です。
さて、まず、Registボタンがタップされた時に、フィールド1008に名前が入力されていなければ、登録をしても仕方がありませんので、そのチェック処理を先に行います。
名前が入力されているはずのフィールドに、名前が入っていない状態というのは、その文字列の長さが0の時ですので、フィールドのデータをstrNameという文字変数に代入して調べるようにしましょう。
この時は、もし、前後に余分な空白が入っている場合は、大抵無駄な場合と考えられます。
PalmのGraffiti入力では、それほど余分な空白が入ることはないのですが、キーボード類では、その可能性がありますので、慣例として削除するようにしましょう。
前後の空白を削除する関数は、Trim()です。ちなみに、文字列の前半(左側)を削除するのが LTrim()、後半(右側)を削除するのが、RTrim()です。
Dim strName as String
strName=Trim(Field1008.text)
そして、この余分な空白を除いた文字列の長さが 0だったら、このイベント処理は終了ですので、
If Len(strName)=0 Then
Field1008.SetFocus
Exit Sub
End If
とします。
単に、Exit Subだけにして、ボタンのタップイベントから脱出すれば良いのですが、ここも親切として、フィールド1008にフォーカスを移しておくことにしました。
ソフトの使い勝手は、ちょっとした心遣いで変わってきます。是非是非、使う人のことを考えて作るように心がけましょう。
さて、名前がまともに入力されているようなら、名前の登録処理に進みます。
(本当に、それが「名前」かどうか、という処理は、とっても難しいので、割愛しましょう。)
名前の登録といっても、新規登録する場合と、更新する場合の2通りがありますので、ここでは、そのような状況に対応しなければなりません。
「Regist]ボタンと「Update」ボタンの2つを用意しても良いでしょうが、やっぱりスマートに1つにまとめて処理できるようにしましょう。
今回は、最初に名前を新規登録して、もし、登録エラーが出るようなら、既に名前が存在すると見なして更新の処理を行うようにしました。
少なくとも、Startupでデータベースファイルは作成してありますから、データベースが消えてしまうようなエラーは発生しないであろう、という前提です。
Dim Dbx as Database
Dim res as Integer
res=DbOpen(Dbx,"SampleB09-TeB9",0)
res=DbInsert(Dbx,"username",strName)
If res<>0 Then
res=DbUpdate(Dbx,"username",strName)
End If
res=DbClose(Dbx)
コードは、こうなりますね。
もちろん、はじめに更新をして、ダメなら新規登録するとか、usernameというキーが存在するかどうかを検索して、その結果で処理を変える等等、様々な方法が考えられますので、各自、お試しください。
そして、名前の登録が済めば、元のフォームに戻りたいですので、覚えたてのNextScreenで、フォーム1003へ戻れば登録完了です。
NextScreen "Form1003"
残ったCancelボタンは、フォーム1003に戻るような処理、つまり、NextScreenを使えば良いですね。
仕様になかったのですが、便利そうなので付けてみました。
NextScreenで画面を読み込む場合、そのフォームは新たに描画されることになりますので、起動時と同様に Before()やAfter()といったイベントが発生します。
今回のサンプルでは、フォーム1003のAfter()モジュール内に、データベースから名前を取り出して表示する処理がありましたので、このフォームに戻った時の処理は、ここで特に追加する必要はありません。
ということで、完成です。
ちゃんと、名前が登録されていれば、画面上に表示されているはずです。
そして、名前は、データベース上に保存されていますので、アプリケーションを切り替えても、次回の起動時には、名前が表示されます。
とっても単純なサンプルプログラムですが、基本的な読み込みと、保存、更新の手順は理解できたのではないでしょうか。
要するに、どんな場合でも、結果コードが返されますので、そのコードに基づいた処理を用意しておけば良いことになります。
単純に名前を登録する場合でも、名前が既に登録されている場合と、そうでない場合を考慮して処理を作らなければなりませんので、フローチャートなどを用いて混乱しないようにしましょう。
また、作成するプログラムコードには注釈文を付けておくようにしましょう。
コードウィンドウ内では、 ' (シングルクオーテーション)からその行の最後まで、注釈と見なされ、処理の対象外となります。
IDEが標準の状態であれば、注釈行は、緑色になりますので、区別もついてわかりやすいでしょう。
ま、本当に標準の状態ならフォントが欧文フォントですので、日本語の注釈が化けてしまう、という問題もありますが、それは、本講座のサポート対象外ですね。
完成したサンプルの画面とコード類を以下にまとめておきます。(スンマセンね、このページ重くて)
(クリックすると大きな画像になります) |
Sub Project_Startup()
'変数の宣言
Dim Dbx as Database 'データベース用
Dim res as Integer 'データベース関数の戻り値用
'データベースを開いてみる
res=DbOpen(Dbx,"SampleB09-TeB9",0)
'もし、データベースが開けなかったら、新しくデータベースを作る
'そうでなければ、データベースを閉じる
If res<>0 Then
res=DbCreate(Dbx,"SampleB09-TeB9",0,"TeB9")
Else
res=DbClose(Dbx)
End If
End Sub
|
Sub Form1003_After()
'変数の宣言
Dim Dbx as Database 'データベース用
Dim res as Integer 'データベース関数の戻り値用
Dim sName as String '名前の読み込み・格納用
'データベースを開く
res=DbOpen(Dbx,"SampleB09-TeB9",0)
'usernameキーのデータを読み取る
res=DbRead(DbX,"username",sName)
'res=0:あれば、画面へ表示
'それ以外:ないと見なして、名前登録フォーム1006へ
If res=0 Then
DrawChars "welcome! "+sName,20,50
res=DbClose(Dbx)
Else
res=DbClose(Dbx)
NextScreen "Form1006"
End If
End Sub
|
Sub object1004()
'名前登録フォーム1006へ
NextScreen "Form1006"
End Sub
|
Sub object1011()
'変数の宣言
Dim strName as String '名前の保存用
Dim Dbx as Database 'データベース用
Dim res as Integer 'データベース関数の戻り値用
'フィールド1008のテキストを、前後の空白を取り外して、strNameへ代入
strName=Trim(Field1008.text)
'もし、名前の長さが 0 だったら、フィールド1008へフォーカスを移して、このイベントモジュールを抜けます
If Len(strName)=0 Then
Field1008.SetFocus
Exit Sub
End If
'無事に名前が入っているので、データベースを開きます
res=DbOpen(Dbx,"SampleB09-TeB9",0)
'usernameキーのフィールドに名前を新規登録します
res=DbInsert(Dbx,"username",strName)
'もし結果コードが 0以外だったら、更新にする
If res<>0 Then
res=DbUpdate(Dbx,"username",strName)
End If
'データベースを閉じる
res=DbClose(Dbx)
'名前表示画面へ戻る
NextScreen "Form1003"
End Sub
|
Sub object1012()
'フォーム1003へ戻る
NextScreen "Form1003"
End Sub
|
|