前回は、 現在位置から近隣を検索する機能を作成し、とりあえず一番近い場所を返すようにしました。今回は検索結果の一覧から選択する機能を作成します。
エージェントの微調整
この先エージェントが少しずつ大きくなってきますので、コーディング量が減るよう、共通利用が想定されるオブジェクトを Private 変数化します。
以下が、前回のプログラムからの変更箇所です。
Option Declare Use "lsGoogleMAP" Private xnuiw As NotesUIWorkspace Private xns As NotesSession Private xndb As NotesDatabase Sub Initialize Dim nuid As NotesUIDocument Dim nd As NotesDocument Dim oLoc As Location Dim oSch As NearBySearch Dim oPlace As Place 'Private変数初期化 Set xns = New NotesSession Set xndb = xns.CurrentDatabase Set xnuiw = New NotesUIWorkspace Set nuid = xnuiw.CurrentDocument Set nd = nuid.Document ・・・ |
前回の掲載コードをシンプルにするためであったのですが、逆にわかりにくくなってしまいました。申し訳ありません...
この修正が終わったのちに、以下のプログラムをエージェントに反映します。
選択画面の表示
まずは、選択画面を表示、選択した結果を返す関数 xSelectPlace を作成します。
Function xSelectPlace(voSch As NearBySearch) As Integer Dim vLst As Variant '選択肢を取得 vLst = xGetKeyword(voSch) '選択画面表示して結果を変える vLst = xnuiw.Prompt(PROMPT_OKCANCELLIST, xndb.Title, "選択してください。", "", vLst) vLst = Split(CStr(vLst), ")") If IsNumeric(vLst(0)) Then xSelectPlace = CInt(vLst(0)) End If End Function |
選択画面は NotesUIWorkspace クラスの Prompt メソッドを使用しています。今回は Nomad からの操作を前提としています。Prompt メソッドはデバイスの OS が持つ機能で選択画面を表示するので、仕上がりが美しいので採用しました。
選択肢は文字列型の配列 vLst で与えています。この選択肢を作成しているのが xGetKeyword 関数です(後述)。選択肢の各要素は次のようなフォーマットとします。
1) 15m 自動販売機 |
現在位置からの距離と場所の名称の左に voSch 内の要素番号を配置しています。
選択結果は、この ”)” の左側を取得することで、何番目を選んだかを判定します。
選択肢の作成
現在地点の取得は NearBySearch クラス内に格納されている Location プロパティを使用しています。距離の計算は、連載『クラス化に挑戦』の 第 13 回 で作成した CalcDistance メソッドを使用しています。
この処理を検索結果の件数分ループさせ、選択肢の文字列を生成しています。
Function xGetKeyword(voSch As NearBySearch) As Variant Dim oPlace As Place Dim i As Integer Dim asLst() As String '選択肢 Dim d As Double Dim oLoc As Location Dim oLoc_Sch As Location Set oLoc = voSch.Location '検索座標(現在位置) '検索結果の件数分選択肢を作成 ReDim asLst(voSch.Count-1) For i = 1 To voSch.Count Set oPlace = voSch.GetPlace_Nth(i) '現在位置からの距離を計算 d = oLoc.CalcDistance(oPlace.Location) '選択肢作成 asLst(i-1) = CStr(i) & ") " & Format(d, "#,##0") & "m " & oPlace.PlaceName Next xGetKeyword = asLst End Function |
選択結果の反映
最後にエージェントのメインプログラムを修正します。行う作業は 2 つです。
- 選択機能の有効化
- 選択結果を文書に反映
選択機能の有効化は検索結果が 2 件以上の場合に実行するよう設定します。1 件しかない場合は選択する必要がないので、それを採用とします。また、0 件の場合はヒットしなかった旨を表示し終了します。
選択結果の反映は、場所の名称にスペースが含まれる場合に、最後の部分を Branch フィールドにセットしています。GoogleMAP では支店名はスペースで区切られていることが多いからです。
Sub Initialize ・・・ Dim iIdx As Integer Dim v As Variant ・・・ Call oSch.Search() '検索機能の有効化 If oSch.Count = 0 Then MsgBox "検索結果は 0 件でした。", 64, xndb.Title Exit Sub ElseIf oSch.Count = 1 Then iIdx = 1 Else '2 件以上なので選択 iIdx = xSelectPlace(oSch) End If '選択結果を文書に反映 If iIdx > 0 Then Set oPlace = oSch.GetPlace_Nth(iIdx) v = Split(oPlace.PlaceName, " ") If UBound(v) > 0 Then 'スペースで区切られた最後を支店とする nd.Branch = v(UBound(v)) ReDim Preserve v(UBound(v)-1) nd.Vendor = Join(v, " ") Else nd.Branch = "" nd.Vendor = v(0) End If End If End Sub |
実行結果
ここまで完成したら、選択機能の動作確認を行います。
[近隣]ボタンを押すと、現在位置から近隣の場所情報が近い順に表示されます。
そして、リストから選択し[完了]をタップします。その場所の名称が文書に反映されれば成功です。
次回の予告
今回作成しているのは『お小遣い帳』アプリです。選択肢に買い物や飲食に関係ないものが多くヒットしています。そこで、次回は場所情報を限定する機能を作成します。
前回 | 作ってみよう | 次回 |
0 件のコメント:
コメントを投稿