2024/07/27

作ってみよう:#8)お小遣い帳 - 現在位置から近隣の情報を取得 ③

前回は、 現在位置から近隣を検索する機能を作成し、とりあえず一番近い場所を返すようにしました。今回は検索結果の一覧から選択する機能を作成します。


エージェントの微調整

この先エージェントが少しずつ大きくなってきますので、コーディング量が減るよう、共通利用が想定されるオブジェクトを Private 変数化します。

以下が、前回のプログラムからの変更箇所です。

Option Declare
Use "lsGoogleMAP"

Private xnuiw As NotesUIWorkspace
Private xns As NotesSession
Private xndb As NotesDatabase


Sub Initialize
   Dim nuiw As New NotesUIWorkspace   '不要になるので削除
   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 件のコメント:

コメントを投稿