在下面的通讯录的flash 自定义函数创建函数中能建立通讯录,但不能退出,这是为什么

iOS 通讯录相关 - 简书
iOS 通讯录相关
在简书写了一个月的blog,开始只是简单的将自己之前的笔记进行CCVV模式(command+c/v),渐渐地已经摸索出更多的套路,比如多写些demo,多加些配图,较多的知识点用思维导图做索引,markdown的语法也更加娴熟,每次整理都重新复习了下之前的知识点,也尽量让自己的思路让别人理解,所以觉得写blog还是一个比较好的习惯的,也感谢简书上这么多朋友关注,也是我继续写下去的动力,大家一起努力成为大神!
1.在iOS中,有2个框架可以访问用户的通讯录:
AddressBookUI.framework
提供了联系人列表界面、联系人详情界面、添加联系人界面等一般用于选择联系人
AddressBook.framework
纯C语言的API,仅仅是获得联系人数据,没有提供UI界面展示,需要自己搭建联系人展示界面,里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼
2.逻辑结构
3.授权相关:(1)从iOS6开始,必须得到用户授权访问通讯录才能在AppStore上架(即使不授权也有时候可以访问通讯录)(2)申请通讯录访问授权的代码,通常放在AppDelegate中~!(3)获得通讯录的授权状态函数:ABAddressBookGetAuthorizationStatus()例子:获取授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
(4)用户授权状态有4种:
kABAuthorizationStatusNotDetermined
用户未选择,用户还没有决定是否授权你的程序进行访问
kABAuthorizationStatusRestricted iOS设备上一些许可配置阻止程序与通讯录数据库进行交互
kABAuthorizationStatusDenied
用户明确的拒绝了你的程序对通讯录的访问
kABAuthorizationStatusAuthorized
用户已经授权给你的程序对通讯录进行访问
例子:在 AppDelegate的 didFinishLaunchingWithOptions方法中进行授权
#import &AddressBook/AddressBook.h&
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//1. 获取授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
//2. 创建 AddrssBook
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//3. 没有授权时就授权
if (status == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
//3.1 判断是否出错
if (error) {
//3.2 判断是否授权
if (granted) {
NSLog(@"已经授权");
CFRelease(addressBook);
NSLog(@"没有授权");
CFRelease(addressBook);
return YES;
二、弹出系统通讯录程序
比如充话费时弹出的联系人选择界面(iOS 8 之前的方法,注意版本适配)头文件:#import &AddressBookUI/AddressBookUI.h&
例子:点击弹出联系人控制器界面
弹出联系人控制器界面
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {
//1. 创建联系人选择控制器
ABPeoplePickerNavigationController *picker = [ABPeoplePickerNavigationController new];
//2. 设置代理,注意不是 Delegate
picker.peoplePickerDelegate =
//3. 模态视图弹出
[self presentViewController:picker animated:YES completion:nil];
三、代理方法
有UI交互,即弹出联系人控制器才能获取联系人信息的方法
iOS7和iOS8适配
iOS 8之后如不想自动dismiss可以在弹出联系人控制器方法中加入如下代码:if([[UIDevice currentDevice].systemVersion floatValue] &= 8.0){
picker.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];
设置代理可以获取点击后通讯录里的值,注意代理名不是deleagte@property(nonatomic,assign,nullable) id&ABPeoplePickerNavigationControllerDelegate& peoplePickerD
以下1、2两个代理方法,如果同时实现, 只会运行第一个方法!
1.第一个代理方法:选中某个联系人时调用(iOS8之后实现后再无法调用第2个的方法)
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person NS_AVAILABLE_IOS(8_0);
参数 (ABRecordRef)person 介绍:
一个联系人就是一个ABRecordRef对象,就相当于一条记录,每个联系人都有自己的属性,比如名字、电话、邮件等,使用ABRecordCopyValue函数可以从ABRecordRef中获得联系人的简单属性(参见下面简单属性的介绍)
ABRecordCopyValue 从记录中取值函数:CFTypeRef ABRecordCopyValue(ABRecordRef record, ABPropertyID property)
有2个参数:
第1个参数是ABRecordRef实例
第2个参数ABPropertyID是属性关键字,定义在ABPerson.h中,下面有介绍
注意:使用ABRecordCopyValue可以从一条Person记录中获取到对应的值,但是后续还需要根据值的具体类型再加以处理(比如简单属性取的值不需要再处理,多重属性的值还需要通过其它函数再取值)
ABPropertyID联系人属性介绍
ABPropertyID 就是联系人的属性,所有的属性常量值都定义在了ABPerson.h头文件中联系人属性包括以下类型:(1)简单属性:姓 kABPersonLastNameProperty,名 kABPersonFirstNameProperty 等(2)组合属性:地址等 kABPersonAddressProperty(3)多重属性:电话号码 kABPersonPhoneProperty 、电子邮件 kABPersonEmailProperty 等联系人的有些属性值就没这么简单,一个属性可能会包含多个值,比如邮箱,分为工作邮箱、住宅邮箱、其他邮箱等,比如电话,分为工作电话、住宅电话、其他电话等
如果是多重属性,那么ABRecordCopyValue函数返回的就是ABMultiValueRef类型的数据,例如邮箱或者电话
// 取电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 取记录数量
NSInteger phoneCount = ABMultiValueGetCount(phones);
// 遍历所有的电话号码
for (NSInteger i = 0; i & phoneC i++) {...}
获取多重属性的方法
// 电话标签
CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
// 本地化电话标签
CFStringRef phoneLocalLabel = ABAddressBookCopyLocalizedLabel(phoneLabel);
// 电话号码
CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, i);
4.ABPersonCopyLocalizedPropertyName(ABPropertyID property) 函数可以根据指定的关键字获取对应的标签文本(关于标签,下面案例2有介绍)
下面案例都是在该代理方法中使用,如果打印不出,尝试在AppDelegate中进行授权~!
例子1:从记录中取姓,并转换为NSString类型
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *lastNameStr = (__bridge NSString *)(lastName);
CFRelease(lastName); // 使用__bridge type 方法记得释放!
例子2:获取电话号码, 电话返回的是多数据类型(可以获取到标签和电话号等信息)如:住宅就是标签,下面是电话号
标签和值的概念
如:打印该方式获取到的联系人电话的标签和电话号码
打印查看标签和值
// 获取电话,电话是多数据类型
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 获取电话的个数
CFIndex count = ABMultiValueGetCount(phones);
// 遍历联系人,取出每个电话标签和电话号码,CF框架必须用for i循环
for (CFIndex i = 0 ; i & i++) {
// 获取联系电话的标签,使用__bridge_transfer方法不用释放
NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones,
NSLog(@"label: %@",label);
// 获取联系电话,使用CFBridgingRelease方法和上面功能一样也不需要释放
NSString *value = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones,
NSLog(@"value: %@",value);
//phones 对象需要被释放
CFRelease(phones);
例子3:获取通讯录中所有联系人信息
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person {
// 1. 获取系统通讯录应用
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, nil);
// 2. 获取所有联系人记录
NSArray *array = (__bridge_transfer NSArray *)(ABAddressBookCopyArrayOfAllPeople(addressBook));
for (NSInteger i = 0; i & array. i++) {
// 取出一条记录
ABRecordRef person = (__bridge ABRecordRef)(array[i]);
// 取出个人记录中的详细信息
NSString *firstNameLabel = (__bridge_transfer NSString *)(ABPersonCopyLocalizedPropertyName(kABPersonFirstNameProperty));
NSString *firstName = (__bridge_transfer NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSString *lastNameLabel =(__bridge_transfer NSString *)(ABPersonCopyLocalizedPropertyName(kABPersonLastNameProperty));
NSString *lastName =(__bridge_transfer NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
NSLog(@"%@ %@ - %@ %@", lastNameLabel, lastName, firstNameLabel, firstName);
CFRelease(addressBook);
关于Core Foundation 和 NSFundation 桥接的问题:
注意:无论CF对象是否被引用,只要使用CF函数,就会产生CF对象留在内存中,如:ABMultiValueCopyValueAtIndex(phones,
i)这一句,建议点击静态内存分析工具,可发现没有被释放的CF对象。
桥接有三种方式:
(__bridge type)(expression) : 只是让NSFoundation框架暂时使用CF框架对象,注意需要手动释放 Core Foundation 对象,用CFRelease( )函数。
(__bridge_transfer type)(expression) / CFBridgingRelease(expression) : CF框架移交对象的管理权给NSFoundation框架,不需要手动释放对象
前两种是将CF对象转NSFoundation,最后一个是NSFoundation转 CF对象,不常用(__bridge_retained &#CF type#&)(&#expression#&)
其它知识点
1、添加联系人的步骤通过ABPersonCreate函数创建一个新的联系人(返回ABRecordRef)通过ABRecordSetValue函数设置联系人的属性通过ABAddressBookAddRecord函数将联系人添加到通讯录数据库中通过ABAddressBookSave函数保存刚才所作的修改可以通过ABAddressBookHasUnsavedChanges函数判断是否有未保存的修改当决定是否更改通讯录数据库后,你可以分别使用 AbAddressBookSave 或 ABAddressBookRevert 方式来保存或放弃更改
2、 添加群组的步骤大体和添加联系人一致通过ABPersonCreate函数创建一个新的组(返回ABRecordRef)通过ABRecordSetValue函数设置组名通过ABAddressBookAddRecord函数将组添加到通讯录数据库中通过ABAddressBookSave函数保存刚才所作的修改
3、 想操作联系人的头像,有以下函数BPersonHasImageData判断通讯录中的联系人是否有图片ABPersonCopyImageData取得图片数据(假如有的话)ABPersonSetImageData设置联系人的图片数据
2.第二个代理方法,选中联系人某个属性(详细的信息,如电话号码)的时候调用,注意和上面的方法只能实现一个,如同时实现无法跳转到联系人详情页面,优先上面的方法
该方法可以获取具体的哪个电话号码,例如使用充值话费时不能使用上面方法,因为无法确定具体充值哪个号码
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_AVAILABLE_IOS(8_0);
更详细的属性,联系人详情界面
例子:获取用户点击的,确定的某个电话号码或联系人信息
#pragma mark 选中联系人的某个属性的时候调用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
// 获取该联系人多重属性--电话号
ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 获取该联系人的名字,简单属性,只需ABRecordCopyValue取一次值
ABMutableMultiValueRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *name = (__bridge NSString *)(firstName);
// 获取点击的联系人的电话
NSLog(@"联系人名字 : %@",name);
// 点击某个联系人电话后dismiss联系人控制器,并回调点击的数据
[self dismissViewControllerAnimated:YES completion:^{
// 从多重属性——电话号中取值,参数2是取点击的索引
NSString *aPhone =
(__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneMulti, ABMultiValueGetIndexForIdentifier(phoneMulti,identifier)) ;
// 获取点击的联系人的电话,也可以取标签等
NSLog(@"联系人电话 : %@",aPhone);
// 去掉电话号中的 "-"
aPhone = [aPhone stringByReplacingOccurrencesOfString:@"-" withString:@"" ];
NSLog(@"去掉-号 : %@",aPhone);
3.第三个代理方法:取消选中联系人的时候调用
注意:在iOS 7 下必须实现此方法,否则会崩溃!
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peopleP
4.下面两个是iOS7选择联系人代理方法,iOS 8之前才会调用,适配iOS 7时实现,适配iOS 8之后使用上面两个方法
1.返回YES,则会跳转到联系人详情页面,如果返回NO必须手动实现控制器dismiss方法
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_IOS(2_0, 8_0);
2.返回NO不会执行默认的操作,如:打电话,必须手动实现控制器dismiss方法
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0, 8_0);
四、不需要弹出联系人控制器就可以获取联系人信息的方法
#pragma mark - 点击屏幕获取所有联系人信息,记得授权
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {
//1. 判断是否授权成功, 授权成功才能获取数据
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
//2. 创建通讯录
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//3. 获取所有联系人
CFArrayRef peosons = ABAddressBookCopyArrayOfAllPeople(addressBook);
//4. 遍历所有联系人来获取数据(姓名和电话)
CFIndex count = CFArrayGetCount(peosons);
for (CFIndex i = 0 ; i & i++) {
//5. 获取单个联系人
ABRecordRef person = CFArrayGetValueAtIndex(peosons, i);
//6. 获取姓名
NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));
NSString *firstName
= CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSLog(@"lastName: %@, firstName: %@", lastName, firstName);
//7. 获取电话
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
//7.1 获取电话的count数
CFIndex phoneCount = ABMultiValueGetCount(phones);
//7.2 遍历所有电话号码
for (CFIndex i = 0; i & phoneC i++) {
NSString *label = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
NSString *value = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));
// 打印标签和电话号
NSLog(@"label: %@, value: %@",label, value);
NSLog(@"\\n\\n");
//8.1 释放 CF 对象
CFRelease(phones);
//8.1 释放 CF 对象
CFRelease(peosons);
CFRelease(addressBook);
五、iOS 9 新出的点击通讯录的获取信息的办法
有UI交互,即需要点击联系人控制器,代理属性为delegate头文件:#import &ContactsUI/ContactsUI.h&
#pragma mark - 先弹出联系人控制器
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event {
// 1. 创建控制器
CNContactPickerViewController * picker = [CNContactPickerViewController new];
// 2. 设置代理
picker.delegate =
// 3. 设置相关属性,谓词筛选email地址是@的联系人
picker.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') AND (value LIKE '*@')"];
/ / 谓词筛选email地址数等于1的联系人
picker.predicateForSelectionOfContact = [NSPredicate predicateWithFormat:@"emailAddresses.@count == 1"];
// 4. 弹出
[self presentViewController: picker
animated:YES completion:nil];
#pragma mark - 取消选中联系人的时候调用,点击右上角的cancel时候触发,而不是picker的所有dismiss动作中都会触发。在多选模式下,cancel在done的左侧。
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker {
其他四个代理方法只要实现其中一个就行了。分别为单选和多选两组,都实现的时候,多选优先执行,单选不执行。特别要注意的是predicateForEnablingContact,predicateForSelectionOfContact,predicateForSelectionOfProperty这三组属性会影响它们的动作。predicateForEnablingContact返回YES的联系人才是可交互的,默认联系人都是可交互的。
#pragma mark - 选择联系人的时候调用 (如果predicateForSelectionOfContact属性没被设置或符合筛选条件,如不符合则不会触发该方法并进入联系人详情页)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact {
//1. 获取姓名 ,givenName == firstName
NSLog(@"givenName: %@, familyName: %@", contact.givenName, contact.familyName);
//2. 获取电话,泛型,会在数组遍历时帮很大的忙
for (CNLabeledValue *labeledValue in contact.phoneNumbers) {
NSLog(@"label: %@",labeledValue.label);
CNPhoneNumber *phoneNumber = labeledValue.
NSLog(@"phoneNumber: %@",phoneNumber.stringValue);
#pragma mark - 实现了此方法, 就可以选择多个联系人,该方法在点击done按钮时触发,注意:该方法不受predicateForSelectionOfContact属性影响!
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray&CNContact *& *)contacts {
for (CNContact *contact in contacts) {
NSLog(@"givenName: %@, familyName: %@", contact.givenName, contact.familyName);
//2. 获取电话,泛型,会在数组遍历是帮很大的忙
for (CNLabeledValue *labeledValue in contact.phoneNumbers) {
NSLog(@"label: %@",labeledValue.label);
CNPhoneNumber *phoneNumber = labeledValue.
NSLog(@"phoneNumber: %@",phoneNumber.stringValue);
#pragma mark - 点击某个联系人的某个属性(property)时触发并返回该联系人属性(contactProperty)。
只实现该方法时,可以进入到联系人详情页面(如果predicateForSelectionOfProperty属性没被设置或符合筛选条件,如不符合会触发默认操作,即打电话,发邮件等)。
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty {
#pragma mark - 只实现该方法时,停留在多选模式下的联系人列表页面(如果predicateForSelectionOfProperty属性没被设置或符合筛选条件,该联系人才能被选中),在点击done按钮的时候触发,返回的contactProperties中只包含选中的contactProperties,没选中的话返回空。
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray&CNContactProperty *& *)contactProperties {
// 循环打印出所有选中的联系人名字
for (CNContactProperty *contactProperty in contactProperties) {
NSLog(@"%@",contactProperty.contact.givenName);
不卑不亢 不慌不忙&>&&>&&>&正文
《实况足球2016(PES2016)》创建通讯跳出解决办法 无法创建通讯
15:18:26 来源:完全实况11论坛 作者:亻桀其斤
  《实况足球2016》很多玩家在界面显示创建通讯之后游戏就跳出了,那应该怎么办呢?下面小编就为大家带来实况足球2016创建通讯跳出解决办法,希望对各位玩家解决无法创建通讯的问题有所帮助。
  在游戏目录下找到名为:Settings.exe的图标打开。
  在在线标签中取消自动前面的√,把下面的数字改为0
《实况足球2016》精华文章推荐
更多相关内容请关注:
责任编辑:Shy夏夏
本文是否解决了您的问题
用手机访问
扫一扫,手机浏览
相关攻略:
游戏制作:Konami
游戏发行:Konami
游戏平台:PC/Xbox360/XboxOne/PS3/PS4
上市时间:
游戏特色:
单机游戏下载
综合热点资讯
游民星空联运游戏自定义outlook”联系人“窗体的具体方法 - 专业创造价值!--旅程无限
- 畅享博客
|收藏博客|加入友情链接|给博主留言
自定义outlook”联系人“窗体的具体方法
自定义outlook”联系人“窗体的具体方法
昨天分享了&&,有网友留言介绍说&在字段选择器中新建一个人脉层次,然后拉到排序标题横条上,就可以进行设置并快速进行分类了。&,这确实是个很实用的方法,刚才在网络上搜索了一下,刚好有这方面的文章可以借鉴,我按图索骥地设置了一下,完全成功了。以下是我现在的新建联系人窗体截图。
与默认的窗体相比显得很阳春,但却实用多了,重要的是学到了一种自定义的方法,只要灵活运用还可以继续修改与完善。
出处:微软中国 作者:微软中国 时间: 22:56:00
Outlook中的&联系人&为市场和销售人员带来了极大的方便,利用&联系人&功能可将客户的资料保存在Outlook中,可以通过查找、字段选择、分组等方法快速的查找到所需要的联系人,并能够将与客户的业务往来一目了然。
设计Outlook联系人窗体
默认情况下,Outlook&联系人&对话框中提供了大量的有用信息,如姓名、地址、公司、邮箱、生日等等。但是实际工作中我们所遇到的信息包罗万象,常常会遇到这样的情况:当登记联系人的一条重要信息时找不到相应的选项,怎么办?其实Outlook提供了简单快捷的窗体设计功能,用它就可以解决这样的问题。
例如,很多企业都会为客户资料上添加一个&客户行业&的信息,但是在Outlook联系人中并没有&客户行业&这项,下面就来看看如何在&联系人&中添加客户行业的:
(1)打开Outlook然后在菜单栏上选择【工具】|【窗体】|【设计窗体】命令,打开&设计窗体&对话框,如图4所示。
图4 &设计窗体&对话框
(2)在&设计窗体&对话框中选择&联系人&选项,然后单击【打开】按钮。这时Outlook会自动打开&联系人(设计)&窗口和&字段选择器&面板,如图5所示。
图5 可编辑的窗口和字段选择器
(3)单击&字段选择器&面板上方的下拉列表,选择&文件夹中用户定义的字段&选项;再单击【新建】按钮打开&新建字段&对话框,如图6所示。
图6 新建字段
(4)在&名称&输入框中输入新建字段的名称,如&客户行业&;在&类型&下拉列表中选择数据类型,这里选择为&文本&,单击【确定】按钮关闭对话框。这样在&字段选择器&面板就会多出&客户行业&这个字段。
(5)从&字段选择器&面板中拖动&客户行业&字段到&联系人-设计&窗口中,并调整到合适的位置。
(6)选中&客户行业&或它后面的输入框,然后单击工具栏上的【属性】按钮,打开&属性&对话框,在其中对该控件的属性作调整,例如更改标题文字、颜色等信息。
提示:不同的控件的属性不同,可更改的项目也不同。
(7)操作完成后,单击&联系人-设计&窗口工具栏上的【发布窗体】按钮,打开&将窗体发布为&对话框。在&显示名称&输入框中输入显示名称,在&窗体名称&输入框中输入窗体的名称。
(8)发布完成后,保存并关闭&联系人-设计&窗口。
提示:设计窗体不仅仅限于&联系人&,用户可以创建更多属于自己的窗体。在创建过程中,还可以单击工具栏上的【控件工具箱】按钮,打开&控件工具箱&面板,使用更多的控件。用户可以创建出更丰富的窗体,如下拉列表、复选框等等,如图7所示。另外用户还可以为窗体编写程序,得到更高级的功能。关于控件的使用和编程的方法可以参阅有关书籍。
图7 下拉列表
在创建完成自己的窗体后,如何使用呢?并且我们希望将自己定义的&联系人&窗体作为默认的&联系人&填写方式,这样无论是填写还是数据导入都很方便。将自定义窗体设置为默认窗体的方法很简单,操作步骤如下:
(1)在Outlook快捷栏中用鼠标右键单击【联系人】图标,在快捷菜单中选择【属性】命令,打开&属性&对话框。
(2)在&常规&选项卡中,有一个&投递到此文件夹,使用&下拉列表,这里面有可供选择的所有窗体,选择刚刚定义好的窗体,然后单击【确定】按钮即可,如图8所示。
图8 选择默认窗体
(3)现在再新建联系人时,Outlook就会自动启用带有&客户行业&的联系人窗口了,如图9所示。
提示:在新建联系人时,可在联系人视图双击空白区域,就会打开&新建联系人&的窗口。另外还可以利用联系人&属性&对话框中的&窗体&选项卡将自己创建的窗体保存为一个文件,这样别人也可以使用这个窗体。同样也可以使用别人编辑的窗体。
图9 使用自定义的窗体填写客户信息<div class="votes" id="Score
查阅更多相关主题的帖子:
下一篇:上一篇:
您还未登录,不能对文章发表评论!请先

我要回帖

更多关于 flash 自定义函数 的文章

 

随机推荐