f5

Similar documents
PowerPoint プレゼンテーション

「基礎から学ぶビジュアルAndroidアプリ開発 今日からあなたもAndroidデベロッパー」

25th Developer Camp

Windows開発者のためのFireMonkeyモバイル開発入門

「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」

25th Developer Camp

新バージョンDelphi/400 XE7ご紹介 - マルチデバイスデザイナ機能で開発効率アップ! -

CodeGear Developer Camp

24th Embarcadero Developer Camp

ios 12, Android 9 時代の 今からでも始められるモバイル開発入門 第 36 回エンバカデロ デベロッパーキャンプ 株式会社シリアルゲームズ取締役 / AppDiv3 マネージャー細川淳 本文書の一部または全部の転載を禁止します 本文書の著作権は 著作者に帰属します

t1

初 めての ios アプリケーション iphone Form TLabel TButton. 図. コントロールの 配 置 Button OnClick Button. 00

Microsoft PowerPoint - はじめてのDataSnapアプリケーション_

CodeGear Developer Camp

25th Developer Camp

Microsoft PowerPoint - visualprogram.ppt

ステップアップ! モバイルアプリケーション開発

1 シミュレーションとは何か?

C#の基本

PowerPoint プレゼンテーション

Delphi/400でFlash動画の実装

21st Embarcadero Developer Camp

28th Embarcadero Developer Camp

Embarcadero Developer Camp

10th Developer Camp - B5

SmartBrowser_document_build30_update.pptx

20th Embarcadero Developer Camp

24th Developer Camp A4

テクニカルセミナーベストセレクション

V-Client for Mac ユーザーズガイド

VB.NET解説

Prog2_15th

第 8 回の内容 クライアントサイド処理 JavaScript の基礎

Android Layout SDK プログラミング マニュアル

Prog2_12th

SHOFU SureFile for DentalX Manual

7th CodeGear Developer Camp

22nd Embarcadero Developer Camp G6

「DataSnapユースケース研究」 多層技術の概要と最適化、実践テクニック

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

ixpand Transfer クイックガイド ixpand Transfer は サンディスク ixpand フラッシュドライブ専用の Android アプリケーションです 本アプリケーションは Android スマートフォンやタブレットに接続したサンディスク ixpand フラッシュドライブを使

Developer Camp

知って得する!現役ヘルプデスクが答えるDelphiテクニカルエッセンス 8.0

MVP for VB が語る C# 入門

WebReportCafe

21st Embarcadero Developer Camp T8

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

開発者が知りたい実践プログラミングテクニック! ~明日から使えるテクニック集~

スライド 1

Windows10の標準機能だけでデータを完全バックアップする方法 | 【ぱそちき】パソコン初心者に教えたい仕事に役立つPC知識

MultiLABELISTOCX と MultiLABELISTV4 MLOCX は MLV4 のレイアウト発行機能を継承しています したがって MLV4 の振分発行やプ リセット発行を使用するための登録情報は使用できません MLV4 のレイアウト管理でレイアウトを作成すると 拡張子が m lay

PowerPoint プレゼンテーション

e3

ゲームプログラミング講習 第0章 導入

実習を行う上での心構えについて

スライド 1

FastReportへの効率的な帳票レイアウトコンバート

Webコンポーネントのカスタマイズ入門

スライド 1

28th Embarcadero Developer Camp

クライアント証明書導入マニュアル

Windows XP から Windows 7 へのアップグレード

PowerPoint プレゼンテーション

ミガロ.製品 最新情報

JavaScript 演習 2 1

Oracleセキュア・エンタープライズ・サーチ

BizBrowser SmartDevice Android開発用スタートアップガイド

mazec テクニカルガイド第5版(Android版)

PowerPoint プレゼンテーション

2. 生田仮想デスクトップ PC の接続方法 生田仮想デスクトップ PC に接続する方法は 次の 2 通りです 1. HTML アクセス Internet Explorer や Safari などのブラウザを用います PC に特別なソフトウェアをインストールす る必要が無いので 管理者権限をもってい

Dropbox にファイルを追加する Dropbox フォルダの場所を決め 使い始める準備が整いま した さあ ファイルを Dropbox フォルダに入れましょう ステップ 1 ファイルを Dropbox へドラッグアンドドロップします ステップ 2 青色のアイコンが表示され ファイルが Dropb

ご利用者向け 共有電話帳 利用者向けマニュアル 電話番号を一件ずつ調べる必要なし! 社内の電話帳をまとめて登録できます 共有電話帳とは 社内で共通で使う電話帳を お客さまの携帯電話にカンタンにダウンロードすることができるサービスです 管理者共有電話帳サーバ利用者の携帯電話 (=S! 電話帳バックアッ

FlashAir TM Tutorial FlashAir のチュートリアル FlashAir でライブ配信 1 用意するもの HLS FlashAir からのブート 環境設定作業 動作確認... 8 FlashAir Developers

SetupVerup_dl_M

Microsoft Word - バーチャルクラス(Blackboard)ログイン方法ガイド.docx

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

画面について メイン画面 メイン画面 Logitec EXtorage Link を起動すると メイン画面が表示されます メイン画面の構成は 次のとおりです 1 メニュー 2 端末から外部ストレージへ 3 外部ストレージから端末へ 4 端末 5 外部ストレージ 6 カメラ機能 スマホやタブレットで使

28th Embarcadero Developer Camp

ResizeKit2 VB/Delphi/C++Builderプログラミングマニュアル

Microsoft PowerPoint - ソフトウェア更新手順書_DAN-W62_mac_ _1.ppt

ギョロモガイガー Ⅱ 操作ガイド ギョロガイガー Ⅱ 操作ガイド 本書では ギョロガイガー Ⅱ の操作方法についてご説明いたします 目次 1. 概要 コンセプト 主な機能 基本仕様 インストール 使い方...

事前準備 1. Visual Studio Community 2013 または Professional 以上のエディションのインストール 2. Android スマートフォンへの任意の QR コードリーダーアプリのインストール 3. アプリ素材のダウンロード

CubePDF ユーザーズマニュアル

Delphi/400開発ノウハウお教えします 情報を守ろう!安全性を高めたWebシステムの構築

PowerPoint プレゼンテーション

Microsoft PowerPoint - DELPHI�礔.ppt

目次 1. AOS ユーザー登録サイト AOS ユーザー登録 AOS ライセンスキー登録 ios 版アプリ インストール 起動と新規登録 初期設定とバックアップ Andro

開発者が知りたい実践プログラミングテクニック!

スライド 1

Microsoft PowerPoint - install_NGSsokushu_windows(ver2.1).pptx

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows 日本語版 : インストール・ガイド

Microsoft Word - Android_仮想デバイスマネージャーの使い方

インストール ダウンロード Download Ignite UI サービスリリースダウンロード リリースノート ID コンポーネント カテゴリ 説明 カスタムビルドで作成された日本語ロケールの js ファイルを使用すると予期しない構文エラー ( 無効または ビルド バグ修

25th Developer Camp

インストール後のアプリケーション実行

14th Developer Camp

SetupVerup_dl_M

PDFオートコンバータEX

PowerPoint プレゼンテーション

Java, Delphi, C++Builderユーザのためのメモリリーク, ボトルネックの検出手順

Transcription:

F5 Delphi/C++ テクニカルセッション RAD Studio で始めるモバイル開発 ~ コンポーネントで簡単入門! 勘所も押さえよう 株式会社シリアルゲームズ取締役細川淳

アジェンダ はじめに はじめての FireMonkey で作るアプリケーション ios アプリの作法 Android アプリの作法 共通の作法 まとめ 2

はじめに 3

Delphi / C++Builder このセッションの対象 Delphi or C++Builder User ただし説明は全て Delphi で行います 初級者 ~ 中級者 これから FireMonkey でアプリを作る方々のための作法を説明します 4

はじめての FireMonkey アプリケーション 5

カメラアプリ Delphi でカメラアプリとか飽きたよお! とか言わない! TTakePhotoAction を使わずに TCameraComponent で TImage にカメラの映像を出します 6

Form デザイン 使用したコンポーネント TCameraComponent TImage TLayout TButton TImage TButton TButton TLayout Form1 7

イベントハンドラ // Button1 を押してカメラを Active に procedure TForm1.Button1Click(Sender: TObject); begin CameraComponent1.Active := True; // Button2 を押してカメラを Deactive に procedure TForm1.Button2Click(Sender: TObject); begin CameraComponent1.Active := False; 8

イベントハンドラ // カメラの映像が取得可能になったとき呼ばれます procedure TForm1.CameraComponent1SampleBufferReady( Sender: TObject; const ATime: TMediaTime); begin // TImage のビットマップサイズを TImage いっぱいまで広げます // BitmapScale は画素密度です たとえば xxdpi(fullhd) では 3 になります // FMX は全て仮想サイズですが 画像 (Bitmap) は仮想では無いので補正が必要になります Image1.Bitmap.SetSize( Trunc(Image1.Width * Image1.Bitmap.BitmapScale), Trunc(Image1.Height * Image1.Bitmap.BitmapScale)); // カメラの映像を TImage.Bitmap に描画します CameraComponent1.SampleBufferToBitmap(Image1.Bitmap, False); 9

FireMonkey の作法 VCL と同じように考えてはダメ! デバイスによって画面解像度も比率も異なる レイアウト! スタイル! 10

レイアウト デバイスごとに違いがある解像度や比率から解放してくれる! Align と Anchor を使いましょう! TLayout は何も描画しない純粋なコンテナ 11

例 たとえば複数のコントロールをセンターに配置する Left Right Center Bottom 12

スタイル スタイル! スタイル! スタイル! コントロールの見た目要素はスタイルで! スタイルの重要性がいまだに伝わってない感! 13

スタイル FW VCL FMX たとえば HTML HTML では Font color プロパティ, Body bgcolor など個々のプロパティで HTML5 + CSS 見た目の要素は HTML ではなく CSS で CSS ではリッチな見た目も定義できる! FMX では エフェクト α( 透明度 ) アニメーションなど見た目は全部スタイルに! テキスト関係のプロパティ (TextSettings) だけ外出しされている これによって混乱が助長されている点も 14

スタイルの罠 これだけスタイル! と言ってるのに スタイルエディタのできが悪い! デベロッパーキャンプで これ以上は 15

スタイルの罠 ビットマップを利用したスタイルを使う方法が解説されていない! しかも コントロールが公開されていない!! TCustomStyleObject 派生コントロールなど DEKO 氏がそれらをレジストするパッケージを ハラヘッ タウェア で公開されています http://ht deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1501 TButtonStyleObject など 追加されていないものもあります 16

ios の作法 17

ios の作法 モバイルプロビジョニングってナニ!!! デベロッパ証明書ってナニ!!! Entitlement plist ってナニ!!! CFBundleID ってナニ!!! 18

ios の作法 っというのを話そうと思っていたのですが XE8 ではあまり考えなくてもよくなりました!! XE7 までの人は 頑張って!! 特に注意してほしいのは モバイル プロビジョニング ファイル が良くわからなくて たくさんダウンロード & インストールしてしまった場合 同名のプロビジョニングファイルがあるとどのプロビジョニングファイルを使っていいか解らないため署名に失敗します 19

ios の作法 自分のフォルダ以外には触れない! Windows のように自由に触ることは不可能!! フォルダには意味がある! 20

ios の作法 フォルダ 意味 バックアップ 自動削除 Documents アプリのデータ保存ディレクトリ Documents/Preferences アプリの設定 Library/Cache 再取得 再生成できるデータを置く所 tmp システムに自動削除されたくない一時データ ( 削除は自分で ) 容量に注意! これを守らないと リジェクトされます! どうしても! という場合 NSURLIsExcludedFromBackupKey を属性として付与すると バックアップされなくなります 21

ios の作法 /StartUp/Documents 配布マネージャを使ってアプリにデータを入れておく場所 ここに入れておくと 自動的に Documents ディレクトリに配 置されます icloud にバックアップされます ここに大量のデータを入れておくと初回起動時に大変重くなるので注意!! 22

Android の作法 23

Android の作法 開発について まずは絶対にログを見るようにしましょう!! ADB や DDMS で見れます SERIALGAMES 製 Android LogViewer でも見れます 現在公開停止中 24

Android の作法 ログには何が出ている? もちろん アプリ個々のログを出せます システムのメッセージ エラーが起きたときのスタックトレース! Java の機能を使っているところでエラーが起きると場所まですぐにわかります! 25

Android の作法 FMX.Types の Log は偽物 Log.d メソッドでなぜか Log.i が出力される仕様 正しい Log Level で出力されるライブラリを用意しました FMX.Log https://github.com/freeonterminate/delphi/tree/master/fmxl og 26

Android の作法 Back キー Delphi 製アプリケーションは Back キーを押されると終わり ます 終わります!! 大切なことなので2 回言いました 終わったように見せない工夫は 共通の作法に記載します 27

Android の作法 Home キー Pause 状態になります 最初に作ったアプリ カメラが Active な状態で Home キーが押されると? 死にます!!!!!!! 解法は 共通の作法に記載します 28

Android の作法 OS のバージョンに注意 Android 4.4 から SD カードに自由にアクセスできなくなりました! アプリ専用ディレクトリ以下のみにアクセスできます Android も ios も 非推奨 API あり とくに ios の場合はリジェクト対象に! 29

Android の作法 TMediaPlayer に注意! TMediaPlayer.Stop メソッドを呼ぶと FileName を再設定 ( 再オープン ) するまで再生できなくなる罠! Android の MediaPlayer#stop メソッドの仕様 play で使用したメモリなどを解放するため 再度鳴らしたい場合は pause を使うようにと API ドキュメントに ただし TMediaPlayer は pause メソッドを公開していない!!» 解法は 共通の作法に記載します 30

Android の作法 ブラックアウト! XE7, XE8 では あまり起こらなくなりました XE6 位をまだ使っている場合に一度試して頂きたいのが次のコードです 31

Android の作法 case iappevent of TApplicationEvent.WillBecomeForeground: begin {$IFDEF ANDROID} // onwindowfocuschanged を呼ぶと TWindowManager.Render が呼ばれて再描画される TThread.Queue( TThread.Current, procedure begin PANativeActivity(System.DelphiActivity)^. callbacks^. onwindowfocuschanged(system.delphiactivity, 1); end ); {$ENDIF} : ; 32

Android の作法 デバッグ手法 設定 開発者向けオプション アクティビティを保持しない これを設定すると裏に回った時に アプリが終了する 適切に非アクティブ処理がされているか? されていない場合はログにエラーが出ているはず バックグラウンドプロセスの上限 バックグラウンドプロセスが走らない設定も可能 33

Android の作法 Delphi だけで実現できないことは Jar ファイルで XE7 からプロジェクトマネージャに Jar ファイルを追加可能に Java2OP を使えばアクセス用クラスも自動的に作成されます 34

共通の作法 35

共通の作法 TPath の使用 TPath を使用すると OS 間のディレクトリ構造の違いを吸収 してくれます ( 意味からディレクトリを返してくれます ) TPath.GetDocumentsPath で Documents TPath.GetCachePath で Library/Cache など Docwiki サポートされているターゲットプラットフォームに適した標準の RTL パス関数 http://docwiki.embarcadero.com/radstudio/xe8/ja/ サポートされているターゲット _ プラットフォームに適した標準の _RTL_ パス関数 36

共通の作法 アプリの状態変化を見るためには? TForm.OnActivate / OnDeactivate はアプリ内のイベント アプリの自身のイベントではない Form1, Form2 があったとき Form2.Show とかで来るイベント IFMXApplicationEventService このインターフェースを使うと状態変化が通知されます 37

IFMXApplicationEventService constructor TLifecycleManager.Create; var AppEventService: IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService) then try AppEventService := IFMXApplicationEventService( TPlatformServices.Current.GetPlatformService(IFMXApplicationEventService) ); except AppEventService := nil; if (AppEventService <> nil) then AppEventService.SetApplicationEventHandler(AppEvent); 38

IFMXApplicationEventService function TLifecycleManager.AppEvent( iappevent: TApplicationEvent; icontext: TObject): Boolean; begin Result := False; case iappevent of TApplicationEvent.FinishedLaunching: begin // 起動完了 TApplicationEvent.BecameActive: begin // フォーカスを取得 TApplicationEvent.WillBecomeInactive: begin // フォーカスを失う TApplicationEvent.EnteredBackground: begin // 裏に回った TApplicationEvent.WillBecomeForeground: begin // 表に回った TApplicationEvent.WillTerminate: begin // アプリが終了する 39

IFMXApplicationEventService TApplicationEvent.LowMemory: begin // メモリが少ない! TApplicationEvent.TimeChange: begin // ios のみ // 時刻に変化あり // 日が変わったり夏時間などで TApplicationEvent.OpenURL: begin // ios のみ // URL が開かれる 40

共通の作法 BecameActive ここでアクティブ化の処理を WillBecomeInactive ここで非アクティブ化の処理を 先のカメラの例でいえば ここで Active を False にします 41

共通の作法 OnSaveState イベントの活用 (XE7 以降 ) Android では Back キーでアプリが終わってしまいますが これを使ってあたかも終わってないように見せることもできます 状態を保存して それを復帰させる 詳しくは DocWiki http://docwiki.embarcadero.com/radstudio/xe8/ja/firem onkey_ の状態保存 42

共通の作法 TMediaPlayer.pause が公開されてない! よしリフレクション ( 拡張 RTTI ) を使おう! FireMonkey では FMX 自身がリフレクションを使いまくっているので 臆することはありません? アニメーションとか 将来のバージョンアップで動作しなくなる可能性があります 43 QualityPortal には報告済み https://quality.embarcadero.com/browse/rsp 10340

TMediaPlayerHelper あとで削除も簡単にできる Class Helper を使って Pause を実装します unit umediaplayerhelper; interface uses FMX.Media; type TMediaPlayerHelper = class helper for TMediaPlayer private function GetPlayer<T: IInterface>(const imedia: TMedia): T; public procedure Pause; implementation uses System.SysUtils, System.Rtti, FMX.Types {$IFDEF ANDROID}, Androidapi.JNI.Media, FMX.Media.Android {$ENDIF} {$IFDEF IOS}, iosapi.avfoundation {$ENDIF} ; 44

TMediaPlayerHelper { TMediaPlayerHelper } function TMediaPlayerHelper.GetPlayer<T>(const imedia: TMedia): T; var RttiType: TRttiType; RttiField: TRttiField; begin Result := nil; if (imedia <> nil) then begin RttiType := SharedContext.GetType(iMedia.ClassType); if (RttiType <> nil) then begin RttiField := RttiType.GetField('FPlayer'); if (RttiField <> nil) then Result := T(RttiField.GetValue(iMedia).AsInterface); 45

TMediaPlayerHelper {$IFDEF ANDROID} procedure TMediaPlayerHelper.Pause; var Player: JMediaPlayer; begin Player := GetPlayer<JMediaPlayer>(Media); if (PLayer <> nil) then Player.Pause; {$ENDIF} {$IFDEF IOS} procedure TMediaPlayerHelper.Pause; var Player: AVPlayer; begin Player := GetPlayer<AVPlayer>(Media); if (PLayer <> nil) then Player.Pause; {$ENDIF} 46 end.

adjustpan / adjustresize TEdit などがフォーカスを受け取ったときソフトキーボードで隠れてしまうのを防ぎたい! 普通の Android アプリでは adjustpan / adjustresize の2つで制御できます AdjustPan 画面全体を上に移動 AdjustResize 47 一部のコントロールをリサイズ

AdjustPan TForm の一番下に TLayer を置きます 入力系コンポーネントがフォーカスを受け取ったら TLayer の Position.Y を変更します TLayer を上にずらします フォーカスを受け取ったコントロールをトップに持ってきます 48

全体を上にずらします 49

サンプルコード procedure TForm1.FormCreate(Sender: TObject); begin FOrgY := Layout1.Position.Y; procedure TForm1. ForcusEnter(Sender: TObject); var Pos: TPointF; begin Layout1.Align := TAlignLayout.None; Layout1.Position.Y := FOrgY - TControl(Sender).Position.Y; procedure TForm1.FocusExit(Sender: TObject); begin Layout1.Align := TAlignLayout.Client; 50

AdjustResize 入力系コンポーネントがフォーカスを受け取ったら大きなコントロールをリサイズします リサイズします 51

ここの Height を狭めます 52

サンプルコード procedure TForm1.FormCreate(Sender: TObject); begin FOrgMemoHeight := Memo1.Height; procedure TForm1.ForcusEnter(Sender: TObject); begin if (TControl(Sender).Position.Y > Memo1.Position.Y) then Memo1.Height := 20 // 適当な値を入れてますが 本当はちゃんと計算してください else Memo1.Height := FOrgMemoHeight; procedure TForm1.FocusExit(Sender: TObject); begin Memo1.Height := FOrgMemoHeight; 53

まとめ 54

まとめ FireMonkey はスタイルとレイアウトが重要 ios は審査があるので注意 Android はデバッグを十分に ログ デバイス非依存になるように考慮して作成しよう モバイルアプリはライフサイクルにも注意! 55

Thank you!