DELPHI BOOT CAMP / DELPHIでビジュアル開発に挑戦しよう ◆ DAY4: DELPHIモバイルアプリ開発事始め [JAPAN]

Posted by on in Programming


◇◆◇◆ Delphi Boot Camp / Delphiでビジュアル開発に挑戦しよう ◇◆◇◆

Day4: Delphiモバイルアプリ開発事始め

 

2016年9月14日(水) 、Webによるオンラインセミナー 「Delphi Boot Camp / Delphiでビジュアル開発に挑戦しよう」を実施しました。Delphi Boot Campは延べ4日間にわたり実施されているWebセミナーで、当記時はそのセミナー4日目の内容について記載しています。

詳しいBoot Camp説明はこちらのブログに記載があります。 Boot Camp申し込みのページは下記にもあり、内容も記載されていますので、ご興味のある方は覗いてみてください。

Webセミナー「Delphi Boot Camp」:http://forms.embarcadero.com/delphi-boot-camp-2016

このブログでは、Day4にてご紹介した内容のサマリーと、参考資料を掲載いたします。

 

Day4のセミナーの動画はこちらからご覧ください:

 

http://forms.embarcadero.com/delphi-boot-camp-2016

※ページ下部の[オンデマンド視聴]から[登録実行]を行ってご視聴ください。準備ができ次第、順次アップロードされます。

 

■モバイル向け開発には Delphi Professional + Mobile Add-On Pack 以上のエディションが必要です。

モバイル向け開発は Delphi Starter では行えません。RAD Studio 30日トライアル版をダウンロードいただければお試し頂くことができます。

 

また Delphi Professional の価格で Mobile Add-On Pack も入手できるキャンペーンを2016年9月28日まで実施中です。

https://www.embarcadero.com/jp/radoffer

 

■サンプルコードについて

Day4で紹介したアプリのソースコードは、GitHubの以下のリポジトリに上げてあります。

https://github.com/kazinoue/2016_Delphi_bootcamp_day4

 

このリポジトリには4つのプロジェクトのサブディレクトリがあります。

GPS_MapApp 地図表示、現在の住所取得、加速度センサーを使用したアプリです。以下の単機能のアプリを1つにまとめつつ、UIや動作の微調整を行っていますので、こちらを参照するまえに単機能のアプリをお試し頂いた後に参照していただくのがよいでしょう。
TGecoder_demo 緯度経度の情報から住所を取得するサンプルです。TLocationSensorとTGeocoder を使用しています。
TMapView_demo 現在位置の緯度経度を取得して地図表示を行うサンプルです。TLocationSensort と TMapView を使用しています。
TMotionSensor_demo 加速度センサーの値を読み取るサンプルです。TMotionSensor と TTimer を組み合わています。

 

 

■使用したコンポーネントの紹介

TLocationSensor: 現在位置取得のためのコンポーネント

http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.Sensors.Components.TLocationSensor

 

TMotionSensor: 加速度センサーのコンポーネント

http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.Sensors.Components.TMotionSensor

 

TMapView: 地図表示用のコンポーネント

http://docwiki.embarcadero.com/Libraries/Berlin/ja/FMX.Maps.TMapView

 

TTimer: 定期的にタイマーイベントを発生させるコンポーネント(MotionSensor からの値読み込みに使用)

http://docwiki.embarcadero.com/Libraries/Berlin/ja/FMX.Types.TTimer

 

■Day4 の内容に関連する外部記事(Codezine 掲載)

http://codezine.jp/article/detail/8955

 

TMapView_demoの実装

基本的な実装は3つのプロシジャーで行っています。いずれもイベントハンドラです。処理の内容やコードは以下の通りです。

  • 位置情報が更新されたら、現在の位置を中心として地図を書き直す。
  • ボタンを押したら現在位置に切り替える。
  • スライドスイッチでマップ表示を通常地図と衛星画像の切り替えを行う。

 

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 保持されている現在位置の情報で地図表示を行う。
  MapView1.Location := CurrentLocation;
end;

procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
  const OldLocation, NewLocation: TLocationCoord2D);
begin
  // 測位された現在位置情報を private 変数に保存しておく。
  CurrentLocation := TMapCoordinate.Create(NewLocation.Latitude,NewLocation.Longitude);

  // 現在位置の情報で地図表示を行う。
  MapView1.Location := CurrentLocation;
end;

procedure TForm1.Switch1Switch(Sender: TObject);
begin
  // マップ表示を通常の地図と衛星画像の切り替えを行う。
  if (Switch1.isChecked) then
    MapView1.Maptype := TMapType.Satellite
  else
    MapView1.MapType := TMapType.Normal;
end;

 

なお、この実装のままですと、位置情報がほんの少しだけ変わっただけでも地図表示が再描画されてしまいますので、実際に地図表示のアプリを作る場合は要件に合わせて実装を調整する必要があります。

 

TGecoder_demo を使用した実装

TGeocoderはコンポーネントではなく、クラスだけが提供されています。TGeocoderを使用するアプリは必要な初期設定を自前のコードで行うことになります。

今回の実装では、TLocationSensor の OnLocationChanged イベントを処理する際に、TGeocoderの初期化と逆ジオコーディング(緯度経度から住所を取得する処理)を行っています。逆ジオコーディングの結果はイベントハンドラ経由で返されますので、イベントハンドラも併せて実装します。

procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
  const OldLocation, NewLocation: TLocationCoord2D);
begin
    // FGeocoder が未割当の場合は TGeocoder を新規に生成してイベントハンドラを割り当てる
    if not Assigned(FGeocoder) then
    begin
      if Assigned(TGeocoder.Current) then
        FGeocoder := TGeocoder.Current.Create;
      if Assigned(FGeocoder) then
        FGeocoder.OnGeocodeReverse := OnGeocodeReverseEvent;
    end;

    // FGeocoder が割り当て済みならば、現在の緯度経度情報から住所情報の取得を行う。
    if Assigned(FGeocoder) and not FGeocoder.Geocoding then
      FGeocoder.GeocodeReverse(NewLocation);
end;

// 逆ジオコーディング実行時の処理
procedure TForm1.OnGeocodeReverseEvent( const Address: TCivicAddress );
begin
  // 緯度経度から現在位置の住所が取得できた場合は表示を更新する。
  Memo1.Lines.Insert(0,Address.AdminArea);
  Memo1.Lines.Insert(0,Address.CountryCode);
  Memo1.Lines.Insert(0,Address.CountryName);
  Memo1.Lines.Insert(0,Address.FeatureName);
  Memo1.Lines.Insert(0,Address.Locality);
  Memo1.Lines.Insert(0,Address.PostalCode);
  Memo1.Lines.Insert(0,Address.SubAdminArea);
  Memo1.Lines.Insert(0,Address.SubLocality);
  Memo1.Lines.Insert(0,Address.SubThoroughfare);
  Memo1.Lines.Insert(0,Address.Thoroughfare);
  Memo1.Lines.Insert(0,'----------');
end;

この実装では取得できた住所の情報を TMemo に出力しています。このアプリを移動中に実行すると、住所情報が移動に合わせて更新さrていくことが分かります。

 

■TMotionSensir_demo

TMotionSensor は、これ自体で値の変化をイベントとして処理できません。このため、TTimer で定期的に発生させたイベントの中で TMotionSensor の値読み取りを行うことにします。

値を読み取って TMemo に出力するだけなら実質1行で終わってしまうのですが、これは視覚的に見づらいので TChart で値の変化を可視化することにします。しかしこのような処理を行っても3行の処理が増えるだけです。

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // 加速度センサーの測定値を TMemo に書き出す。
  Memo1.Lines.Insert(0,
    Format('X:%1.4f Y:%1.4f, Z:%1.4f',
      [
        MotionSensor1.Sensor.AccelerationX,
        MotionSensor1.Sensor.AccelerationY,
        MotionSensor1.Sensor.AccelerationZ
      ]
    )
  );

  // 加速度センサーの測定値を TChart でグラフ描画する。
  Chart1.Series[0].AddY(MotionSensor1.Sensor.AccelerationX);
  Chart1.Series[1].AddY(MotionSensor1.Sensor.AccelerationY);
  Chart1.Series[2].AddY(MotionSensor1.Sensor.AccelerationZ);
end;


About
Gold User, No rank,
Sales Consultant at Embarcadero Technologies, in Japan.

Comments

Check out more tips and tricks in this development video: