You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:35:44