IAutoComplete2接口引入了两种新的方法,这两种方法使用同样的标识组合作为参数,下表列出了可用的标识及其意义。
标 识说 明
ACO_NONE不使用自动完成
ACO_AUTOSUGGEST使用下拉列表
ACO_AUTOAPPEND允许自动附加在init方法中pwszQuickComplete参数所代表的字符串
ACO_SEARCH在下拉列表最后添加\"查找\"文本
ACO_FILTERPREFIXES防止自动完成匹配常用前缀比如\"www.\", \"http://\"等
ACO_USETABTAB键可以用来选择下拉列表项
ACF_UPDOWNKEYDROPSLIST上下按键可以用来调出下拉列表框
ACO_RTLREADING按由右到左的顺序读
显示的IAutoComplete2同IAutoComplete的显示方式有一点不同,就是因为IAutoComplete2支持不同的显示模式,这些模式可以通过SetOptions 方法来设定。
3. 实现自动完成
自动完成功能是通过COM对象来实现的,下面代码用As操作符来获得IAutoComplete2接口:
FAutoComplete :=
CreateComObject(CLSID_AutoComplete) as IAutoComplete2;
获得接口后我们就可以实现自动完成功能了,下面代码是一个简单的例子:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, ShlIntf, ActiveX,
ComObj, StdCtrls, StrTools;
type
TAutoCompleteForm = class(TForm)
CompletionEdit: TEdit;
CompletionLabel: TLabel;
SourceGroupBox: TGroupBox;
SourceMemo: TMemo;
procedure FormCreate(Sender: TObject);
private
FAutoComplete: IAutoComplete2;
FStrings: IUnknown;
end;
var
AutoCompleteForm: TAutoCompleteForm;
implementation
{$R *.DFM}
{ TAutoCompleteForm }
procedure TAutoCompleteForm.FormCreate(Sender: TObject);
begin
FAutoComplete := CreateComObject(CLSID_AutoComplete) as IAutoComplete2;
FStrings := TEnumString.Create(SourceMemo.Lines) as IUnknown;
OleCheck(FAutoComplete.SetOptions(ACO_AUTOSUGGESTor ACO_UPDOWNKEYDROPSLIST));
OleCheck(FAutoComplete.Init(CompletionEdit.Handle, FStrings, nil, nil));
end;
end.
上面的例程首先获得IAutoComplete2接口,如果系统不支持IAutoComplete2接口,as操作符将引发 EinvalidCastError异常。接下来的一行代码会创建一个TEnumString类的实例并取得IUnknown接口,这个接口将作为 FAutoComplete的Init方法的punkACL参数,TEnumString类是从TInterfacedObject类继承的,实现在 StrTools单元中,实现它的目的是使TStrings类同IEnumString接口兼容。然后,设定显示选项使自动完成支持下拉列表和自动建议。 最后初始化FAutoComplete并同编辑框相连接,被连接的编辑框就支持自动完成了。
责任编辑:小草