第9回 データベース 「7.Palmに名前を覚えてもらおう その2」

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


前へ     目次へ     次へ

第9回 データベース 「7.Palmに名前を覚えてもらおう その2」