モバイル チュートリアル:アドレス帳コンポーネントを使用する(iOS および Android)
モバイル チュートリアル:モバイル アプリケーション開発(iOS および Android) への移動
このチュートリアルを開始する前に、次のチュートリアルを読んで実行することをお勧めします。
- モバイル チュートリアル:マルチビュー コンポーネントを使用して情報の代替ビューを表示する(iOS および Android)
- モバイル チュートリアル:リスト ボックス コンポーネントを使用してテーブル ビューを表示する(iOS および Android)
FireMonkey では、iOS デバイスおよび Android デバイスでアドレス帳を扱うための TAddressBook コンポーネントを提供しています。
このチュートリアルでは、TAddressBook コンポーネントを使った簡単な FireMonkey アプリケーションの作成方法を説明します。
iOS | Android |
---|---|
目次
TAddressBook コンポーネントの基本機能
モバイル プラットフォーム(Android と iOS)では、FireMonkey は、TAddressBook コンポーネントをサポートしており、アプリケーションはデバイスのアドレス帳にアクセスすることができます。このコンポーネントの基本機能は、次の通りです:
- デバイスのアドレス帳にアクセスするリクエストを送信し、アクセス ステータスを取得します。
- デバイスのアドレス帳で定義されているすべてのソースにアクセスします。
- 指定されたソースから、すべてまたは個々のコンタクトをフェッチします。
- 指定されたグループからすべてのコンタクトをフェッチします。
- 既存の連絡先やグループを編集または削除できる。
- 連絡先を新規作成できる。
- 新しいグループの作成。
サンプル アプリケーションの作成
このセクションでは、TAddressBook コンポーネントの使い方を示すために、Android および iOS ターゲット プラットフォーム向けのサンプル アプリケーションを作成します。このアプリケーションを使って次の方法を説明します。
- アドレス帳に対するアクセス権を要求する
- デバイスのアドレス帳におけるデフォルトのソースから、すべてのコンタクトを取得します。
- 新しい連絡先をアドレス帳に追加する
- 選択した連絡先をアドレス帳から削除する
ユーザー インターフェイスの設計
- 以下を選択して、空のマルチデバイス アプリケーションを作成します。
- Delphi の場合: [ファイル|新規作成|マルチデバイス アプリケーション - Delphi|空のアプリケーション]
- C++ の場合: [ファイル|新規作成|マルチデバイス アプリケーション - C++Builder|空のアプリケーション]
- プロジェクト マネージャで、ターゲット プラットフォームを Android または iOS に設定します。
- [ツール パレット]で、TToolBar、TAddressBook、および TListBox の各コンポーネントを選択し、フォーム デザイナにドロップします。
- [オブジェクト インスペクタ]で、TListBox の Align プロパティを
Client
に設定します。 - フォーム デザイナで TListBox を右クリックし、ショートカット メニューから[項目の追加|TSearchBox]を選択します。
- [ツール パレット]で TMultiView コンポーネントを選択し、フォーム デザイナにドロップします。
アプリケーション ツールバーとマスタ ペインを設計する
コントロール要素はすべてツールバーとマスタ ペインに配置します。
- ツールバーには次の 3 つのスピード ボタンを含めます。
- マスタ ペインには、新しい連絡先を指定し、それをアドレス帳に追加するためのフォームを含めます。
アプリケーション ツールバーを設計するには:
- トップ ツールバーで、これら 3 つの TSpeedButton コンポーネントをドロップします。
- フォーム デザイナで以下の手順を実施します。
- SpeedButton1 を選択し、Name プロパティを「
btnRemove
」に、StyleLookup プロパティをtrashtoolbuttonordered
に設定します。 - SpeedButton2 を選択し、Name プロパティを「
btnRefresh
」に、StyleLookup プロパティをrefreshtoolbuttonordered
に設定します。 - SpeedButton3 を選択し、Name プロパティを「
btnAdd
」に、StyleLookup プロパティをaddtoolbuttonordered
に設定します。
- SpeedButton1 を選択し、Name プロパティを「
上記の手順を実施すると、フォーム デザイナは次の図のようになります。
マスタ ペインを設計するには:
- [構造]ビューで MultiView1 を選択し、[オブジェクト インスペクタ]で次のプロパティを指定します。
- MasterButton プロパティを
btnAdd
に設定します。 - Mode プロパティを
Drawer
に設定します。 - MultiView1 が表示されるよう Visible プロパティを
True
に設定します。
- MasterButton プロパティを
- [ツール パレット]から、3 つの TLabel コンポーネント、3 つの TEdit コンポーネント、および 2 つの TButton コンポーネントを Multiview1 にドロップします。
- [オブジェクト インスペクタ]で、MultiView1 に配置したコントロール要素のプロパティを次のように指定します。
- Label1、Label2、Label3 の Text プロパティを、それぞれ「
First name
」、「Last name
」、「Work mail
」に設定します。 - Edit1、Edit2、Edit3 に対して:
- Name プロパティを
edtFirstName
、edtLastName
、edtWorkMail
にそれぞれ設定します。 - KillFocusByReturn プロパティを
true
に設定します。 - ReturnKeyType プロパティを
Go
に設定します。
- Name プロパティを
- Button1、Button2 に対して:
- Text プロパティを
Add
およびCancel
に設定します。 - Name プロパティを
btnOK
およびbtnCancel
にそれぞれ設定します。
- Text プロパティを
- Label1、Label2、Label3 の Text プロパティを、それぞれ「
マスタ ペインのコントロール要素は、次のように配置することをお勧めします。
連絡先リストの取得
このセクションでは、デバイスのアドレス帳において、デフォルト ソースから連絡先リストを取得する方法を説明します。
アプリケーションでは、次の private メソッドを定義します:
FillContactsList
: デバイスのアドレス帳からデフォルトのソースの連絡先リストを取得します。AddListBoxItem
: 新しい項目を ListBox に追加します。
アプリケーション コードの private セクションを次のように変更します。
private
{ Private declarations }
procedure FillContactList;
procedure AddListBoxItem(Contact: TAddressBookContact);
private: // User declarations
void __fastcall FillContactsList();
void __fastcall AddListBoxItem(TAddressBookContact *Contact);
FillContactslist
および AddListBoxItem
のメソッドを、次のように実装します:
// Fill the contact list
procedure TForm1.FillContactList;
var
I: Integer;
Contacts: TAddressBookContacts;
begin
Contacts := TAddressBookContacts.Create;
try
AddressBook1.AllContacts(AddressBook1.DefaultSource, Contacts);
ListBox1.BeginUpdate;
try
ListBox1.Clear;
for I := 0 to Contacts.Count - 1 do
AddListBoxItem(Contacts.Items[I]);
finally
ListBox1.EndUpdate;
end;
finally
Contacts.Free;
end;
end;
// --------------------------------------------------------------------
// Add a new contact to List box
procedure TForm1.AddListBoxItem(Contact: TAddressBookContact);
var
ListBoxItem: TListBoxItem;
begin
try
ListBoxItem := TListBoxItem.Create(nil);
ListBoxItem.Text := Contact.DisplayName;
ListBoxItem.Tag := Contact.ID;
ListBox1.AddObject(ListBoxItem);
finally
ListBoxItem.Free;
end;
end;
// Fill the List box with existed contact display names.
void __fastcall TForm1::FillContactsList() {
int i;
TAddressBookContacts *Contacts = new TAddressBookContacts();
__try {
AddressBook1->AllContacts(AddressBook1->DefaultSource(), Contacts);
__try {
ListBox1->BeginUpdate();
ListBox1->Clear();
for (i = 0; i < Contacts->Count; i++)
AddListBoxItem(Contacts->Items[i]);
}
__finally {
ListBox1->EndUpdate();
}
}
__finally {
Contacts->Free();
}
}
// ---------------------------------------------------------------------------
// Add a new contact to List box
void __fastcall TForm1::AddListBoxItem(TAddressBookContact *Contact) {
TListBoxItem *ListBoxItem = new TListBoxItem(ListBox1);
__try {
ListBoxItem->Text = Contact->DisplayName;
ListBoxItem->Tag = Contact->ID;
ListBox1->AddObject(ListBoxItem);
}
__finally {
ListBoxItem->Free();
}
}
コントロール要素の機能の実装
アプリケーション開発の最後に、アプリケーション フォームにドロップしたすべてのコントロール要素のイベント ハンドラを実装しなければなりません。
スピード ボタンの OnClick イベント ハンドラを実装するには:
//-------------------For Remove button -----------------------------------------
procedure TForm1.btnRemoveClick(Sender: TObject);
var
ContactIndex, ContactID: Integer;
Contact: TAddressBookContact;
begin
ContactIndex := ListBox1.ItemIndex;
if (ContactIndex > -1) Then
begin
ContactID := ListBox1.ListItems[ContactIndex].Tag;
Contact := AddressBook1.ContactByID(ContactID);
if Contact <> nil then
try
AddressBook1.RemoveContact(Contact);
ListBox1.BeginUpdate;
ListBox1.Items.Delete(ContactIndex);
finally
ListBox1.EndUpdate;
Contact.Free;
end;
end;
end;
// -------------------For Refresh button---------------------------------------
procedure TForm1.btnRefreshClick(Sender: TObject);
begin
FillContactsList;
end;
//-------------------For Remove button -----------------------------------------
// Remove the contact currently selected from the List box
void __fastcall TForm1::btnRemoveClick(TObject *Sender) {
int ContactIndex = ListBox1->ItemIndex;
if (ContactIndex > -1) {
int ContactID = ListBox1->ListItems[ContactIndex]->Tag;
TAddressBookContact *Contact = AddressBook1->ContactByID(ContactID);
if (Contact != NULL) {
__try {
AddressBook1->RemoveContact(Contact);
ListBox1->BeginUpdate();
ListBox1->Items->Delete(ContactIndex);
}
__finally {
ListBox1->EndUpdate();
Contact->Free();
}
}
}
}
// --------------------------For Refresh button-------------------------------------
void __fastcall TForm1::btnRefreshClick(TObject *Sender) {
FillContactsList();
}
マスタ ペインのボタンの onClick イベント ハンドラを実装するには:
- [構造]ビューで MultiView1 を選択します。
- [オブジェクト インスペクタ]で Visible プロパティを
True
に設定します。
これでマスタ ペインが表示されます。 - マスタ ペインで[Add]ボタンをダブルクリックし、イベント ハンドラを次のように実装します。
- Delphi の場合:
// -------------------------------------------------------------------- // Add a newly created contact to Address Book procedure TForm1.btnOKClick(Sender: TObject); var Contact: TAddressBookContact; eMails: TContactEmails; Addresses: TContactAddresses; begin Contact := AddressBook1.CreateContact(AddressBook1.DefaultSource); try Contact.FirstName := edtFirstName.Text; Contact.LastName := edtLastName.Text; // Add the work mail eMails := TContactEmails.Create; try eMails.AddEmail(TContactEmail.TLabelKind.Work, edtWorkMail.Text); Contact.eMails := eMails; finally eMails.Free; end; AddressBook1.SaveContact(Contact); try ListBox1.BeginUpdate; AddListBoxItem(Contact); finally ListBox1.EndUpdate; end; finally Contact.Free; end; MultiView1.HideMaster; end;
- C++ の場合:
// Add a newly created contact to Address Book void __fastcall TForm1::btnOKClick(TObject *Sender) { TContactEmails *eMails; TAddressBookContact *Contact = AddressBook1->CreateContact(AddressBook1->DefaultSource()); __try { Contact->FirstName = edtFirstName->Text; Contact->LastName = edtLastName->Text; // Add the work mail eMails = new TContactEmails(); __try { eMails->AddEmail(TContactEmail::TLabelKind::Work, edtWorkMail->Text); Contact->EMails = eMails; } __finally { eMails->Free(); } AddressBook1->SaveContact(Contact); __try { ListBox1->BeginUpdate(); AddListBoxItem(Contact); } __finally { ListBox1->EndUpdate(); } } __finally { Contact->Free(); } MultiView1->HideMaster(); }
- マスタ ペインで[Cancel]ボタンをダブルクリックし、イベント ハンドラを次のように実装します。
- Delphi の場合:
// Clear and close the Add New Contact form procedure TForm1.btnCancelClick(Sender: TObject); begin edtFirstName.Text := ''; edtLastName.Text := ''; edtWorkMail.Text := ''; MultiView1.HideMaster; end;
- C++ の場合:
// Clear and close the Add New Contact form void __fastcall TForm1::btnCancelClick(TObject *Sender) { edtFirstName->Text = ""; edtLastName->Text = ""; edtWorkMail->Text = ""; MultiView1->HideMaster(); }
アドレス帳の同期を維持する
アプリケーション実行中に、サードパーティ ツールがデバイスのアドレス帳に変更を加えることもあるでしょう。そのような状況では、デバイスの連絡帳と、アプリケーションが直接作業している連絡帳のインスタンスの間で、情報の同期がとれていることが重要になってきます。この用途のために、FireMonkey は TAddressBook.RevertCurrentChangesAndUpdate メソッドを提供しています。
アドレス帳の同期を維持するには:
- [オブジェクト インスペクタ]で AddressBook1 を選択し、[イベント]タブを開きます。
- OnExternalChange の隣をダブルクリックし、次のイベント ハンドラを実装します。
- Delphi の場合:
procedure TForm1.AddressBook1ExternalChange(ASender: TObject); begin AddressBook1.RevertCurrentChangesAndUpdate; FillContactsList; end;
- C++ の場合:
void __fastcall TForm1::AddressBook1ExternalChange(TObject *ASender) { AddressBook1->RevertCurrentChangesAndUpdate(); FillContactsList(); }
アドレス帳に対するアクセス権の構成
TAddressBook を使用するには、アプリケーションがターゲットのモバイル デバイス上のアドレス帳にアクセスする権限を要求しなければなりません。
このセクションでは、ターゲットのモバイル デバイス上のアドレス帳にアクセスできるよう Android および iOS アプリケーションを構成する手順を説明します。
アドレス帳に対するアクセス権を要求するには:
- [オブジェクト インスペクタ]で Form1 を選択し、[イベント]タブを開きます。
- onShow の隣をダブルクリックし、イベント ハンドラを次のように実装します。
- Delphi の場合:
procedure TForm1.FormShow(Sender: TObject); begin // Display this information box while loading the contacts if AddressBook1.Supported then begin TDialogService.ShowMessage('Loading contacts...'); AddressBook1.RequestPermission; end else ShowMessage('This platform does not support the Address Book service'); end;
- C++ の場合:
void __fastcall TForm1::FormShow(TObject *Sender) { if (AddressBook1->Supported()) { // Display this information box while loading the contacts TDialogService::ShowMessage("Loading contacts..."); AddressBook1->RequestPermission(); } else { TDialogService::ShowMessage ("This platform does not support the Address Book service."); } }
Note - TDialogService.ShowMessage メソッドを使用するには、自分のコードで次の手順が行われているか確認してください:
Delphi:uses FMX.DialogService;
C++:
#include <FMX.DialogService.hpp>
- [オブジェクト インスペクタ]で AddressBook1 を選択し、[イベント]タブを開きます。
- OnPermissionRequest の隣をダブルクリックし、イベント ハンドラを次のように実装します。
- Delphi の場合:
procedure TForm1.AddressBook1PermissionRequest(ASender: TObject; const AMessage: string; const AAccessGranted: Boolean); begin if AAccessGranted then Begin FillContactlist; End else ShowMessage('You cannot access Address Book. Reason: ' + AMessage); end;
- C++ の場合:
void __fastcall TForm1::AddressBook1PermissionRequest(TObject *ASender, const UnicodeString AMessage, const bool AAccessGranted) { if (AAccessGranted) { FillContactsList(); } else { ShowMessage("You cannot access Address Book. Reason: " + AMessage); } }
アドレス帳にアクセスできるよう Android アプリケーションを構成する
TAddressBook コンポーネントを使用する Android アプリケーションを実行するには、プロジェクトの[使用する権限]をいくらか構成する必要があります。
[使用する権限]を構成するには:
- RAD Studio IDE で、[プロジェクト|オプション...|使用する権限]を開きます。
-
次の権限を有効にします:
- アカウントの取得
- 連絡先の読み込み
- 連絡先の書き込み
サンプル アプリケーションの実行
このアプリケーションを以下のようにして実行します。
- [プロジェクト マネージャ]でターゲット プラットフォームを選択します(サポートされているプラットフォームは Android と iOS です)。
重要: このアプリケーションを Android デバイスで実行するには、「アドレス帳にアクセスできるよう Android アプリケーションを構成する」の作業を事前に必ず行ってください。
-
Shift+Ctrl+F9
を押して、デバッガを使わずにアプリケーションを実行します。
以下のシナリオを使ってアプリケーションをテストします。
アドレス帳に新しい連絡先を追加するには:
- アプリケーション ツールバーで をタップします。
これでマスタ ペインが開きます。 -
マスタ ペインで、[First name]、[Last name]、[Work mail]のテキスト ボックスに適切な情報を入力します。それが終わったら、[Add]をタップして、新しく作成した連絡先をアドレス帳に追加します。
連絡先を削除するには:
関連項目
- TAddressBook
- モバイル チュートリアル:マルチビュー コンポーネントを使用して情報の代替ビューを表示する(iOS および Android)
- モバイル チュートリアル:リスト ボックス コンポーネントを使用してテーブル ビューを表示する(iOS および Android)