如何在Delphi 11 FMX中使用AddressBook组件存储电话号码?
Delphi 11 FMX AddressBook添加联系人电话号码无法保存的解决方法
问题原因
你的代码中,在将TContactPhones实例赋值给Contact.Phones后立即手动释放了该实例,导致Contact.Phones指向的内存失效。调用AddressBook1.SaveContact(Contact)时,电话号码数据已不存在,因此无法被保存。同理,邮箱部分代码也存在相同问题。
修正后的代码
procedure TForm1.ActionAddContactExecute(Sender: TObject); var Contact: TAddressBookContact; Phones: TContactPhones; eMails: TContactEmails; Photo: TBitmapSurface; begin Contact := AddressBook1.CreateContact(FDefaultSource); try try Contact.FirstName := edtFirstName.Text; Contact.LastName := edtLastName.Text; Phones := TContactPhones.Create; Phones.AddPhone(TContactPhone.TLabelKind.Mobile, '767867679678'); Contact.Phones := Phones; // Contact接管Phones所有权,无需手动释放 if not Image1.Bitmap.Size.IsZero then begin Photo := TBitmapSurface.Create; try Photo.Assign(Image1.Bitmap); Contact.Photo := Photo; Image1.Bitmap.SetSize(0, 0); finally Photo.Free; // Photo所有权未被Contact接管,需手动释放 end; end; // 添加工作邮箱 eMails := TContactEmails.Create; eMails.AddEmail(TContactEmail.TLabelKind.Work, edtWorkMail.Text); Contact.eMails := eMails; // Contact接管eMails所有权,无需手动释放 // 保存新建联系人到通讯录 AddressBook1.SaveContact(Contact); except on E: EAddressBookException do ShowMessage('无法创建联系人。' + E.Message); end; // 若选中分组,将联系人加入分组 try if InRange(ComboBox1.ItemIndex, 0, FGroups.Count - 1) then AddressBook1.AddContactIntoGroup (FGroups.Items[ComboBox1.ItemIndex], Contact); except on E: EAddressBookException do ShowMessage('无法将新建联系人加入分组。' + E.Message); end; ListViewContacts.BeginUpdate; try AddListViewItem(Contact); finally ListViewContacts.EndUpdate; end; TabControl1.ActiveTab := TabItemContacts; finally Contact.Free; // Contact释放时会自动清理Phones和eMails实例 end; // 清空添加联系人表单 ClearAddContactForm; end;
关键说明
TAddressBookContact的Phones、Emails等属性会接管传入对象的所有权,当Contact被释放时,这些对象会被自动清理,因此无需手动调用Free。Photo属性不同,TAddressBookContact不会接管TBitmapSurface的所有权,所以需要在使用完成后手动释放。
内容的提问来源于stack exchange,提问作者zac
相关产品推荐
相关产品推荐

