【C1】D l hi/iOSチ【C1】Delphi/iOSチュートリアルセッション
トリアルセ シ ン

エンバカデロ・テクノロジーズ
エヴァンジェリスト 高橋 智宏

アジェンダ OS X側の準備
 Windows側の準備
 画面の作り方(メインフォ画面の作り方(メインフォームとサブフォーム)
ムとサブフォ ム) デバッグの基礎(ログの出力と確認)
 デバイスの回転に対応するには?
 iPhone, iPad への対応方法
 アプリのローカライズ手順
アプリのロ カライズ手順
 Delphi言語の変更点(モバイル向け)

OS X側の準備

モバイルアプリ実行&デバッグの仕組み

ローカル or リモート

Windows or Mac
実行&デバッグ用ブリッジ(RAD PAServer XE4)

Windows上のIDE

iOS
シミュレータ

iOS実機
iOS5.1以降

Android
エミュレータAndroid実機

Macマシン OS X 10.8
10 8 (Mountain Lion) または 10.7
10 7 (Lion) Xcode 4.6.1

 iOS 6.1
6 1 SDK & シミュレ
シミュレータタ Command Line Tools (実機向けコード署名)

ブリッジ
 RAD PAServer XE4をOS Xにインストール
Xにインスト ル
 …¥RAD Studio¥11.0¥PAServer¥RADPAServerXE4.pkg

をMacにコピーしてインストールを行う
 アプリケーション
プリケ シ– RAD PAServer
SXE4.appをダブルクリックして、Enterキーを押す
 OS X側のファイアウォールは切っておく

実機の準備 iOS 5.1.x
5 1 x〜6
6.1.x
1 x の iPhone 4〜5,4 5, iPod touch 44〜55
 iOS 5.1.x〜6.1.x の iPad 2〜4, iPad mini iOS Developer [Enterprise] Program https://developer.apple.com/jp/support/ios/enrollment.html

 アプリを実機に転送するための証明書
リを実機 転送す証明書 アプリケーション – キーチェーンアクセス.app で作成
 iOS Provisioningg Portal に登録
 アプリケーション – キーチェーンアクセス.app に登録
 実機のUDIDをiOS Provisioningg Portal に登録 実機をXcodeのOrganizerに認識させる

Windows側の準備

Windows OSの準備
 Vista, Windows 7 または Windows 8

 32bit または 64bit
 物理マシン または 仮想OS
 OS X向けのVM製品を使う場合には VMware Fusion 4 または 5○ http://www.vmware.com/jp/products/desktop_virtualization/fusion/

 Parallels
P ll l Desktop
D kt 7 または 8 for
f MacM○ http://www.parallels.com/jp/products/desktop/

 Oracle VirtualBox 4.x
4 x for OS X
○ https://www.virtualbox.org

IDEの[環境オプション]の設定
 [自動保存の設定] – [エディタファイル] を ON [接続プロファイルマネージャ] – [追加...] プラットフォーム: OS X
 [SDKマネージャ] – [追加…] プラットフォーム: iOS デバイス
 接続するプロファイル: 上で作成したもの
 SDKバージョン: iPhoneOS 6.1
 iOSシミュレータ向けのSDK設定は不要!!

モバイルプロジェクト
 プロジェクト名(英数字のみ)

 Project1.dproj
 アプリ名(日本語もOK)

 バージョン情報の CFBundleDisplayName で設定
 タターゲットプラットフォーム
ゲットプラットフォ ム

 iOS デバイス (iOSDevice) iOS シミュレ
シミュレータタ (iOSSimulator)
 ビルド構成 Debug Release画面の作り方(メインフォームとサブフォーム)

フォ ム(TForm)の基礎フォーム(TForm)の基礎
 常にiOSの全領域(ステータスバーを除く)を覆う

 サイズ(Width x Height)は3種類
 フォーム自体にスクロール機能は無い

 ScrollBox系のコンポーネントを利用する
 Fontプロパティは無い

 各コンポーネントはデフォルトで、iOSのシステムフォントを利用

Show/ShowModal メインフォームとは、最初に生成されるTForm

 iPhoneとiPadで別個のフォームを用意するか否か?
 それ以外のフォーム(TForm)を表示するには?

 subform1.Show();  モードレス
 subform1.ShowModal();  モーダル
 やはり、iOSの画面全体を覆ってしまう○ ダイアログボックス的な表示は出来ない○ TFormのTransparencyプロパティは使えない!?
○ TPanelやフレーム(TFrame)を使う!!

InputQuery/ShowMesage
 InputQuery  ユーザーに入力を求める
 ShowMessage  メッセージを表示する
procedure TForm1.Button1Click(Sender: TObject);var
result: string;begin
if InputQuery('タイトル', 'メッセージ', result) then
begin
ShowMessage(result);
end;
end;

 iOS標準のダイアログボックスを使用

デバッグの基礎(ログの出力と確認)

ログの出力 iOS APIを使用すると…
APIを使用するとuses iOSapi.Foundation;pprocedure
TForm1.Button1Click(Sender:(TObject);j);var
i: Integer;
f: Single;
e: Extended; // Double
begin
i := Random(100);f := 123.456;
e := Random;
NSLog(TNSString.OCClass.stringWithString(NSSTR('%@:%d:%f:%f')),
TNSString.OCClass.stringWithString(NSSTR('これはログメッセージ!')),
i, f, e);end;

ログの出力 Delphiのライブラリを使用しましょう!!
uses FMX.Platform;
procedure TForm1
TForm1.Button1Click(Sender:
Button1Click(Sender: TObject);var
i: Integer;
f: Single;
e: Extended; // Double
llog:
IFMXLoggingService;ii
begin
i := Random(100);f := 123.456;
e := Random;;
log := TPlatformServices.Current.GetPlatformService(IFMXLoggingService)as IFMXLoggingService;
log.Log('%s:%d:%f:%f', ['これはログメッセージ!', i, f, e]);end;iOSシミュレ タ
iOSシミュレータ
 アプリケ
アプリケーション
ション – ユユーティリティ
ティリティ – コンソ
コンソール
ル.app
app

iOS実機 Xcode – Window – Organizer – DEVICES – 実機 –Console

デバイスの回転に対応するには?

デバイスの向き(縦 横)とイ ント
デバイスの向き(縦・横)とイベント
 表示される前にTForm.OnResizeイ
表示される前にTForm OnResizeイベントが発生
ントが発生

 ただし、Screen.ActiveFormのみ
 TForm.Width/Height が縦が縦・横に応じて変化
横に応じて変化 Screen.Size.Width/Height は縦向きで固定
 向きは4種類
uses FMX.Platform, System.TypInfo;
procedure TForm1.FormResize(Sender: TObject);Varscreen: IFMXScreenService;ori: TScreenOrientation;
begin
screen := TPlatformServices.Current.GetPlatformService(IFMXScreenService) as
IFMXScreenService;ori := screen.GetScreenOrientation;
log.Log('%s', [GetEnumName(TypeInfo(TScreenOrientation), Integer(ori))]);
end;デバイスの向きを固定するには?
 [プロジェクトオプション] – [アプリケ[アプリケーション]
ション] – [向き] カスタムの向きを ON にして、4種類から選択iPhone, iPad への対応方法

ユニバ サルアプリ
ユニバーサルアプリ
 単体で、iPhone(iPod touch)とiPadの両方に対応しているアプリのこと
 iPhone(iPod(touch)のみ対応のアプリも可)○ iPadにインストールすると、等倍または2倍で表示される

 iPadのみ対応のアプリも可 [プロジェクトオプション] – [バージョン情報]で指定

 UIDeviceFamily○ iPhone & iPad

デバイス情報を取得
 モデル名とバージョン番号
デ 名
ジョ 番号 – Delphi
p RTL版
版
uses FMX.Platform;
procedure TForm1.Button1Click(Sender: TObject);var
device: IFMXDeviceService;
os: TOSVersion;
begin
device := TPlatformServices.Current.GetPlatformService(IFMXDeviceService)as IFMXDeviceService;
ShowMessage(device.GetModel +':’+ IntToStr(os.Major)+'.'+IntToStr(os.Minor));end; バージョン番号は２つの整数値(メジャー&マイナー)
バ ジョン番号は２つの整数値(メジャ &マイナ ) 例: iPhone:6.1

デバイス情報を取得(続き) モデル名とバージョン番号
デ 名
ジョ 番号 – iOS API版
版
uses iOSapi.UIKit;
procedure TForm1.Button1Click(Sender: TObject);var
device: UIDevice;model: string;version: string;
begin
device := TUIDevice.Wrap(TUIDevice.OCClass.currentDevice);model := UTF8ToString(device.model.UTF8String);
version := UTF8ToString(device.systemVersion.UTF8String);
ShowMessage(model + ':' + version);end; バージョン番号は文字列

 例
例: iPad:5.1.1

メインフオ ムを切り替える
メインフオームを切り替える メインフォメインフォームはムは Project名.dpr
Project名 dpr のコのコードで決定される
ドで決定される
 FormFamilyでFireMonkeyに自動選択させる方法もあり
program Project1;
uses
System.StartUpCopy,FMX.Forms, FMX.Platform,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};{$R *.res}vardevice: IFMXDeviceService;
begin
Application Initialize;
Application.Initialize;
device := TPlatformServices.Current.GetPlatformService(IFMXDeviceService)as IFMXDeviceService;
if Pos('iPad', device.GetModel) > 0 thenApplication.CreateForm(TForm2, Form2)// iPadelsel
Application.CreateForm(TForm1, Form1); // iPhone,iPod touch
Application.Run;end.

アプリのローカライズ手順

TLangコンポ ネント
TLangコンポーネント
 各言語向けの翻訳リストを管理
 GUIの文字列プロパティなどを動的に自動置換

procedure TForm1.Button1Click(Sender: TObject);var
msg: string;
begin
msg := 'test';
ShowMessage(msg); // てすと(ja)end;ロケ ルの取得
ロケールの取得
 iOSのロケ
iOSのロケール一覧(ja,ル 覧(ja, en など)
uses iOSapi.Foundation, iOSapi.UIKit;
var
la: NSArray;i: Integer;ilname: NSString;
begin
la := TNSLocale.OCClass.preferredLanguages;
for i := 0 to la.count-1 do
beginlname := TNSString.Wrap(la.objectAtIndex(i));
ListBox1.Items.Add(UTF8ToString(lname.UTF8String));
end;
end;

 選択されている言語(ja,選択されている言語(ja en など)
uses FMX.Platform;
var
locale: IFMXLocaleService;
begin
locale := TPlatformServices.Current.GetPlatformService(IFMXLocaleService) as IFMXLocaleService;
ShowMessage(locale.GetCurrentLangID);end;Delphi言語の変更点 (モバイル向け)

文字列
 型

 UTF-16のstring(UnicodeString)のみ
 ポインタ PChar(PWideChar)のみ
 文字へのアクセス インデックスは 0 から始まる
var
device: string;
begin
device := 'My iPhone Simulator';
ShowMessage(device[4]);// P(iOS)
ShowMessage(device[Pos('iPhone'
ShowMessage(device[Pos(iPhone , device)]);// P(iOS)
ShowMessage(device[3]);// i(iOS)
ShowMessage(device[device.IndexOf('iPhone')]); // i(iOS)end;

ARC(Automatic Reference Counting) NSAutoRelasePoolのGCでもなく、Objective-CのARCでもない、Delphi独自のARC

 Delphi言語のオブジェクトの解放は不要
type
TMyClass = classpublicconstructor Create;ddestructor
Destroy; override;
id
end;
…
…
procedure TForm1.Button1Click(Sender:p(TObject);j);var
obj: TMyClass;begin
obj := TMyClass.Create;// obj.Free;obj Free;// FreeAndNil(obj);// obj := nil;
end;

ヘルプ
ルプ & 資料
 多くのサンプルプロジェクト
 C:¥Users¥Public¥Documents¥RAD Studio¥11.0¥Samples¥FireMonkeyMobile 日本語のヘルプ&チュートリアル
 製品付属のヘルプ & オンラインのdocwiki

 ホワイトペーパー
 「The Delphi Language for Mobile Development」○ マルコ・カントゥ著

 参考書籍 「DelphiでかんたんiOSアプリプログラミング」○ 著者: 細川 淳(ほそかわ・じゅん)○ 出版: カットシステム http://www.cutt.co.jp/book/978
http://www cutt co jp/book/978-4-87783-310-7
4 87783 310 7.html
html