将文本文件自动附加/完成到编辑框delphi
我正在尝试创建一个编辑框,我希望它能够自动追加键入时输入的文本。文本将附加文本文件中的“建议” 假设我的建议文件中有: 玛丽莲·梦露 马龙白兰度 迈克·迈尔斯 当我开始在编辑框中键入“M”时,剩余的将显示为高亮显示(或不高亮显示): “阿里莲·梦露”将文本文件自动附加/完成到编辑框delphi,delphi,autocomplete,Delphi,Autocomplete,我正在尝试创建一个编辑框,我希望它能够自动追加键入时输入的文本。文本将附加文本文件中的“建议” 假设我的建议文件中有: 玛丽莲·梦露 马龙白兰度 迈克·迈尔斯 当我开始在编辑框中键入“M”时,剩余的将显示为高亮显示(或不高亮显示): “阿里莲·梦露” 当我不断输入“Mi”时,结尾就会出现“ke Myers”。我希望我能让你们明白这一点!谢谢你的帮助 您可以使用 遵循以下步骤: 在表单中放置一个组合框 将autocomplete属性设置为true 将sorted属性设置为true 将style属
当我不断输入“Mi”时,结尾就会出现“ke Myers”。我希望我能让你们明白这一点!谢谢你的帮助 您可以使用 遵循以下步骤:
- 在表单中放置一个组合框
- 将
属性设置为trueautocomplete
- 将
属性设置为truesorted
- 将
属性设置为style
csDropDown
- 在组合框的
事件中添加如下代码OnExit
- 在表单的Oncreate事件中,可以加载保存的项目
您可以使用一个工具轻松地实现此功能 遵循以下步骤:
- 在表单中放置一个组合框
- 将
属性设置为trueautocomplete
- 将
属性设置为truesorted
- 将
属性设置为style
csDropDown
- 在组合框的
事件中添加如下代码OnExit
- 在表单的Oncreate事件中,可以加载保存的项目
您需要实现并注册 下面是使用TEdit(安德烈亚斯的阴影:)时的样子: 更多信息,包括实现上述所有功能的示例代码 编辑:发布更新以提供TAutoCompleteEdit组件、注册单元、包源和快速示例应用程序的源。(上面链接的站点似乎已关闭或已消失。)在Delphi XE中编译和测试。复制上面的图像,除了使用ACStrings属性而不是TMemo来提供用于自动完成的项目 组成部分:
unit uAutoComplete;
interface
uses
Windows, SysUtils, Controls, Classes, ActiveX, ComObj, stdctrls, Forms,
Messages;
const
IID_IAutoComplete: TGUID = '{00bb2762-6a77-11d0-a535-00c04fd7d062}';
IID_IAutoComplete2: TGUID = '{EAC04BC0-3791-11d2-BB95-0060977B464C}';
CLSID_IAutoComplete: TGUID = '{00BB2763-6A77-11D0-A535-00C04FD7D062}';
IID_IACList: TGUID = '{77A130B0-94FD-11D0-A544-00C04FD7d062}';
IID_IACList2: TGUID = '{470141a0-5186-11d2-bbb6-0060977b464c}';
CLSID_ACLHistory: TGUID = '{00BB2764-6A77-11D0-A535-00C04FD7D062}';
CLSID_ACListISF: TGUID = '{03C036F1-A186-11D0-824A-00AA005B4383}';
CLSID_ACLMRU: TGUID = '{6756a641-de71-11d0-831b-00aa005b4383}';
type
IACList = interface(IUnknown)
['{77A130B0-94FD-11D0-A544-00C04FD7d062}']
function Expand(pszExpand : POLESTR) : HResult; stdcall;
end;
const
//options for IACList2
ACLO_NONE = 0; // don't enumerate anything
ACLO_CURRENTDIR = 1; // enumerate current directory
ACLO_MYCOMPUTER = 2; // enumerate MyComputer
ACLO_DESKTOP = 4; // enumerate Desktop Folder
ACLO_FAVORITES = 8; // enumerate Favorites Folder
ACLO_FILESYSONLY = 16; // enumerate only the file system
type
IACList2 = interface(IACList)
['{470141a0-5186-11d2-bbb6-0060977b464c}']
function SetOptions(dwFlag: DWORD): HResult; stdcall;
function GetOptions(var pdwFlag: DWORD): HResult; stdcall;
end;
IAutoComplete = interface(IUnknown)
['{00bb2762-6a77-11d0-a535-00c04fd7d062}']
function Init(hwndEdit: HWND; const punkACL: IUnknown;
pwszRegKeyPath, pwszQuickComplete: POLESTR): HResult; stdcall;
function Enable(fEnable: BOOL): HResult; stdcall;
end;
const
//options for IAutoComplete2
ACO_NONE = 0;
ACO_AUTOSUGGEST = $1;
ACO_AUTOAPPEND = $2;
ACO_SEARCH = $4;
ACO_FILTERPREFIXES = $8;
ACO_USETAB = $10;
ACO_UPDOWNKEYDROPSLIST = $20;
ACO_RTLREADING = $40;
type
IAutoComplete2 = interface(IAutoComplete)
['{EAC04BC0-3791-11d2-BB95-0060977B464C}']
function SetOptions(dwFlag: DWORD): HResult; stdcall;
function GetOptions(out pdwFlag: DWORD): HResult; stdcall;
end;
TEnumString = class(TInterfacedObject, IEnumString)
private
FStrings: TStringList;
FCurrIndex: integer;
public
//IEnumString
function Next(celt: Longint; out elt;
pceltFetched: PLongint): HResult; stdcall;
function Skip(celt: Longint): HResult; stdcall;
function Reset: HResult; stdcall;
function Clone(out enm: IEnumString): HResult; stdcall;
//VCL
constructor Create;
destructor Destroy;override;
end;
TACOption = (acAutoAppend, acAutoSuggest, acUseArrowKey);
TACOptions = set of TACOption;
TACSource = (acsList, acsHistory, acsMRU, acsShell);
TAutoCompleteEdit = class(TEdit)
private
FACList: TEnumString;
FEnumString: IEnumString;
FAutoComplete: IAutoComplete;
FACEnabled: boolean;
FACOptions: TACOptions;
FACSource: TACSource;
function GetACStrings: TStringList;
procedure SetACEnabled(const Value: boolean);
procedure SetACOptions(const Value: TACOptions);
procedure SetACSource(const Value: TACSource);
procedure SetACStrings(const Value: TStringList);
protected
procedure CreateWnd; override;
procedure DestroyWnd; override;
public
constructor Create(AOwner: TComponent); override;
published
property ACEnabled: boolean read FACEnabled write SetACEnabled;
property ACOptions: TACOptions read FACOptions write SetACOptions;
property ACSource: TACSource read FACSource write SetACSource;
property ACStrings: TStringList read GetACStrings write SetACStrings;
end;
implementation
{ IUnknownInt }
function TEnumString.Clone(out enm: IEnumString): HResult;
begin
Result := E_NOTIMPL;
Pointer(enm) := nil;
end;
constructor TEnumString.Create;
begin
inherited Create;
FStrings := TStringList.Create;
FCurrIndex := 0;
end;
destructor TEnumString.Destroy;
begin
FStrings.Free;
inherited;
end;
function TEnumString.Next(celt: Integer; out elt;
pceltFetched: PLongint): HResult;
var
I: Integer;
wStr: WideString;
begin
I := 0;
while (I < celt) and (FCurrIndex < FStrings.Count) do
begin
wStr := FStrings[FCurrIndex];
TPointerList(elt)[I] := Pointer(wStr);
Pointer(wStr) := nil;
Inc(I);
Inc(FCurrIndex);
end;
if pceltFetched <> nil then
pceltFetched^ := I;
if I = celt then
Result := S_OK
else
Result := S_FALSE;
end;
function TEnumString.Reset: HResult;
begin
FCurrIndex := 0;
Result := S_OK;
end;
function TEnumString.Skip(celt: Integer): HResult;
begin
if (FCurrIndex + celt) <= FStrings.Count then
begin
Inc(FCurrIndex, celt);
Result := S_OK;
end
else
begin
FCurrIndex := FStrings.Count;
Result := S_FALSE;
end;
end;
{ TACEdit }
constructor TAutoCompleteEdit.Create(AOwner: TComponent);
begin
inherited;
FACList := TEnumString.Create;
FEnumString := FACList;
FACEnabled := True;
FACOptions := [acAutoAppend, acAutoSuggest, acUseArrowKey];
end;
procedure TAutoCompleteEdit.CreateWnd;
var
Dummy: IUnknown;
Strings: IEnumString;
begin
inherited;
if HandleAllocated then
begin
try
Dummy := CreateComObject(CLSID_IAutoComplete);
if (Dummy <> nil) and
(Dummy.QueryInterface(IID_IAutoComplete, FAutoComplete) = S_OK) then
begin
case FACSource of
acsHistory: Strings := CreateComObject(CLSID_ACLHistory) as
IEnumString;
acsMRU: Strings := CreateComObject(CLSID_ACLMRU) as
IEnumString;
acsShell: Strings := CreateComObject(CLSID_ACListISF) as
IEnumString;
else
Strings := FACList as IEnumString;
end;
if S_OK = FAutoComplete.Init(Handle, Strings, nil, nil) then
begin
SetACEnabled(FACEnabled);
SetACOptions(FACOptions);
end;
end;
except
//CLSID_IAutoComplete is not available
end;
end;
end;
procedure TAutoCompleteEdit.DestroyWnd;
begin
if (FAutoComplete <> nil) then
begin
FAutoComplete.Enable(False);
FAutoComplete := nil;
end;
inherited;
end;
function TAutoCompleteEdit.GetACStrings: TStringList;
begin
Result := FACList.FStrings;
end;
procedure TAutoCompleteEdit.SetACEnabled(const Value: Boolean);
begin
if (FAutoComplete <> nil) then
begin
FAutoComplete.Enable(FACEnabled);
end;
FACEnabled := Value;
end;
procedure TAutoCompleteEdit.SetACOptions(const Value: TACOptions);
const
Options : array[TACOption] of integer = (ACO_AUTOAPPEND,
ACO_AUTOSUGGEST,
ACO_UPDOWNKEYDROPSLIST);
var
Option:TACOption;
Opt: DWORD;
AC2: IAutoComplete2;
begin
if (FAutoComplete <> nil) then
begin
if S_OK = FAutoComplete.QueryInterface(IID_IAutoComplete2, AC2) then
begin
Opt := ACO_NONE;
for Option := Low(Options) to High(Options) do
begin
if (Option in FACOptions) then
Opt := Opt or DWORD(Options[Option]);
end;
AC2.SetOptions(Opt);
end;
end;
FACOptions := Value;
end;
procedure TAutoCompleteEdit.SetACSource(const Value: TACSource);
begin
if FACSource <> Value then
begin
FACSource := Value;
RecreateWnd;
end;
end;
procedure TAutoCompleteEdit.SetACStrings(const Value: TStringList);
begin
if Value <> FACList.FStrings then
FACList.FStrings.Assign(Value);
end;
end.
软件包来源:
package AutoCompleteEditPkg;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$IMPLICITBUILD ON}
requires
rtl;
contains
AutoCompletEditReg in 'AutoCompletEditReg.pas';
end.
一种测试单元和形式。DFM文件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 202
ClientWidth = 447
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object AutoCompleteEdit1: TAutoCompleteEdit
Left = 24
Top = 24
Width = 121
Height = 21
TabOrder = 0
Text = 'AutoCompleteEdit1'
ACEnabled = True
ACOptions = [acAutoAppend, acAutoSuggest, acUseArrowKey]
ACSource = acsList
ACStrings.Strings = (
'and'
'array'
'as'
'asm'
'begin'
'case'
'class'
'const'
'constructor'
'destructor'
'dispinterface'
'div'
'do'
'downto'
'else'
'end'
'except'
'exports'
'file'
'finalization'
'finally'
'for'
'function'
'goto'
'if'
'implementation'
'in'
'inherited'
'initialization'
'inline'
'interface'
'is'
'label'
'library'
'mod'
'nil'
'not'
'object'
'of'
'or'
'out'
'packed'
'procedure'
'program'
'property'
'raise'
'record'
'repeat'
'resourcestring'
'set'
'shl'
'shr'
'string'
'then'
'threadvar'
'to'
'try'
'type'
'unit'
'until'
'uses'
'var'
'while'
'with'
'xor')
end
end
测试单元:
unit ACEditTestUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, uAutoComplete;
type
TForm1 = class(TForm)
AutoCompleteEdit1: TAutoCompleteEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
您需要实现并注册 下面是使用TEdit(安德烈亚斯的阴影:)时的样子: 更多信息,包括实现上述所有功能的示例代码 编辑:发布更新以提供TAutoCompleteEdit组件、注册单元、包源和快速示例应用程序的源。(上面链接的站点似乎已关闭或已消失。)在Delphi XE中编译和测试。复制上面的图像,除了使用ACStrings属性而不是TMemo来提供用于自动完成的项目 组成部分:
unit uAutoComplete;
interface
uses
Windows, SysUtils, Controls, Classes, ActiveX, ComObj, stdctrls, Forms,
Messages;
const
IID_IAutoComplete: TGUID = '{00bb2762-6a77-11d0-a535-00c04fd7d062}';
IID_IAutoComplete2: TGUID = '{EAC04BC0-3791-11d2-BB95-0060977B464C}';
CLSID_IAutoComplete: TGUID = '{00BB2763-6A77-11D0-A535-00C04FD7D062}';
IID_IACList: TGUID = '{77A130B0-94FD-11D0-A544-00C04FD7d062}';
IID_IACList2: TGUID = '{470141a0-5186-11d2-bbb6-0060977b464c}';
CLSID_ACLHistory: TGUID = '{00BB2764-6A77-11D0-A535-00C04FD7D062}';
CLSID_ACListISF: TGUID = '{03C036F1-A186-11D0-824A-00AA005B4383}';
CLSID_ACLMRU: TGUID = '{6756a641-de71-11d0-831b-00aa005b4383}';
type
IACList = interface(IUnknown)
['{77A130B0-94FD-11D0-A544-00C04FD7d062}']
function Expand(pszExpand : POLESTR) : HResult; stdcall;
end;
const
//options for IACList2
ACLO_NONE = 0; // don't enumerate anything
ACLO_CURRENTDIR = 1; // enumerate current directory
ACLO_MYCOMPUTER = 2; // enumerate MyComputer
ACLO_DESKTOP = 4; // enumerate Desktop Folder
ACLO_FAVORITES = 8; // enumerate Favorites Folder
ACLO_FILESYSONLY = 16; // enumerate only the file system
type
IACList2 = interface(IACList)
['{470141a0-5186-11d2-bbb6-0060977b464c}']
function SetOptions(dwFlag: DWORD): HResult; stdcall;
function GetOptions(var pdwFlag: DWORD): HResult; stdcall;
end;
IAutoComplete = interface(IUnknown)
['{00bb2762-6a77-11d0-a535-00c04fd7d062}']
function Init(hwndEdit: HWND; const punkACL: IUnknown;
pwszRegKeyPath, pwszQuickComplete: POLESTR): HResult; stdcall;
function Enable(fEnable: BOOL): HResult; stdcall;
end;
const
//options for IAutoComplete2
ACO_NONE = 0;
ACO_AUTOSUGGEST = $1;
ACO_AUTOAPPEND = $2;
ACO_SEARCH = $4;
ACO_FILTERPREFIXES = $8;
ACO_USETAB = $10;
ACO_UPDOWNKEYDROPSLIST = $20;
ACO_RTLREADING = $40;
type
IAutoComplete2 = interface(IAutoComplete)
['{EAC04BC0-3791-11d2-BB95-0060977B464C}']
function SetOptions(dwFlag: DWORD): HResult; stdcall;
function GetOptions(out pdwFlag: DWORD): HResult; stdcall;
end;
TEnumString = class(TInterfacedObject, IEnumString)
private
FStrings: TStringList;
FCurrIndex: integer;
public
//IEnumString
function Next(celt: Longint; out elt;
pceltFetched: PLongint): HResult; stdcall;
function Skip(celt: Longint): HResult; stdcall;
function Reset: HResult; stdcall;
function Clone(out enm: IEnumString): HResult; stdcall;
//VCL
constructor Create;
destructor Destroy;override;
end;
TACOption = (acAutoAppend, acAutoSuggest, acUseArrowKey);
TACOptions = set of TACOption;
TACSource = (acsList, acsHistory, acsMRU, acsShell);
TAutoCompleteEdit = class(TEdit)
private
FACList: TEnumString;
FEnumString: IEnumString;
FAutoComplete: IAutoComplete;
FACEnabled: boolean;
FACOptions: TACOptions;
FACSource: TACSource;
function GetACStrings: TStringList;
procedure SetACEnabled(const Value: boolean);
procedure SetACOptions(const Value: TACOptions);
procedure SetACSource(const Value: TACSource);
procedure SetACStrings(const Value: TStringList);
protected
procedure CreateWnd; override;
procedure DestroyWnd; override;
public
constructor Create(AOwner: TComponent); override;
published
property ACEnabled: boolean read FACEnabled write SetACEnabled;
property ACOptions: TACOptions read FACOptions write SetACOptions;
property ACSource: TACSource read FACSource write SetACSource;
property ACStrings: TStringList read GetACStrings write SetACStrings;
end;
implementation
{ IUnknownInt }
function TEnumString.Clone(out enm: IEnumString): HResult;
begin
Result := E_NOTIMPL;
Pointer(enm) := nil;
end;
constructor TEnumString.Create;
begin
inherited Create;
FStrings := TStringList.Create;
FCurrIndex := 0;
end;
destructor TEnumString.Destroy;
begin
FStrings.Free;
inherited;
end;
function TEnumString.Next(celt: Integer; out elt;
pceltFetched: PLongint): HResult;
var
I: Integer;
wStr: WideString;
begin
I := 0;
while (I < celt) and (FCurrIndex < FStrings.Count) do
begin
wStr := FStrings[FCurrIndex];
TPointerList(elt)[I] := Pointer(wStr);
Pointer(wStr) := nil;
Inc(I);
Inc(FCurrIndex);
end;
if pceltFetched <> nil then
pceltFetched^ := I;
if I = celt then
Result := S_OK
else
Result := S_FALSE;
end;
function TEnumString.Reset: HResult;
begin
FCurrIndex := 0;
Result := S_OK;
end;
function TEnumString.Skip(celt: Integer): HResult;
begin
if (FCurrIndex + celt) <= FStrings.Count then
begin
Inc(FCurrIndex, celt);
Result := S_OK;
end
else
begin
FCurrIndex := FStrings.Count;
Result := S_FALSE;
end;
end;
{ TACEdit }
constructor TAutoCompleteEdit.Create(AOwner: TComponent);
begin
inherited;
FACList := TEnumString.Create;
FEnumString := FACList;
FACEnabled := True;
FACOptions := [acAutoAppend, acAutoSuggest, acUseArrowKey];
end;
procedure TAutoCompleteEdit.CreateWnd;
var
Dummy: IUnknown;
Strings: IEnumString;
begin
inherited;
if HandleAllocated then
begin
try
Dummy := CreateComObject(CLSID_IAutoComplete);
if (Dummy <> nil) and
(Dummy.QueryInterface(IID_IAutoComplete, FAutoComplete) = S_OK) then
begin
case FACSource of
acsHistory: Strings := CreateComObject(CLSID_ACLHistory) as
IEnumString;
acsMRU: Strings := CreateComObject(CLSID_ACLMRU) as
IEnumString;
acsShell: Strings := CreateComObject(CLSID_ACListISF) as
IEnumString;
else
Strings := FACList as IEnumString;
end;
if S_OK = FAutoComplete.Init(Handle, Strings, nil, nil) then
begin
SetACEnabled(FACEnabled);
SetACOptions(FACOptions);
end;
end;
except
//CLSID_IAutoComplete is not available
end;
end;
end;
procedure TAutoCompleteEdit.DestroyWnd;
begin
if (FAutoComplete <> nil) then
begin
FAutoComplete.Enable(False);
FAutoComplete := nil;
end;
inherited;
end;
function TAutoCompleteEdit.GetACStrings: TStringList;
begin
Result := FACList.FStrings;
end;
procedure TAutoCompleteEdit.SetACEnabled(const Value: Boolean);
begin
if (FAutoComplete <> nil) then
begin
FAutoComplete.Enable(FACEnabled);
end;
FACEnabled := Value;
end;
procedure TAutoCompleteEdit.SetACOptions(const Value: TACOptions);
const
Options : array[TACOption] of integer = (ACO_AUTOAPPEND,
ACO_AUTOSUGGEST,
ACO_UPDOWNKEYDROPSLIST);
var
Option:TACOption;
Opt: DWORD;
AC2: IAutoComplete2;
begin
if (FAutoComplete <> nil) then
begin
if S_OK = FAutoComplete.QueryInterface(IID_IAutoComplete2, AC2) then
begin
Opt := ACO_NONE;
for Option := Low(Options) to High(Options) do
begin
if (Option in FACOptions) then
Opt := Opt or DWORD(Options[Option]);
end;
AC2.SetOptions(Opt);
end;
end;
FACOptions := Value;
end;
procedure TAutoCompleteEdit.SetACSource(const Value: TACSource);
begin
if FACSource <> Value then
begin
FACSource := Value;
RecreateWnd;
end;
end;
procedure TAutoCompleteEdit.SetACStrings(const Value: TStringList);
begin
if Value <> FACList.FStrings then
FACList.FStrings.Assign(Value);
end;
end.
软件包来源:
package AutoCompleteEditPkg;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$IMPLICITBUILD ON}
requires
rtl;
contains
AutoCompletEditReg in 'AutoCompletEditReg.pas';
end.
一种测试单元和形式。DFM文件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 202
ClientWidth = 447
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object AutoCompleteEdit1: TAutoCompleteEdit
Left = 24
Top = 24
Width = 121
Height = 21
TabOrder = 0
Text = 'AutoCompleteEdit1'
ACEnabled = True
ACOptions = [acAutoAppend, acAutoSuggest, acUseArrowKey]
ACSource = acsList
ACStrings.Strings = (
'and'
'array'
'as'
'asm'
'begin'
'case'
'class'
'const'
'constructor'
'destructor'
'dispinterface'
'div'
'do'
'downto'
'else'
'end'
'except'
'exports'
'file'
'finalization'
'finally'
'for'
'function'
'goto'
'if'
'implementation'
'in'
'inherited'
'initialization'
'inline'
'interface'
'is'
'label'
'library'
'mod'
'nil'
'not'
'object'
'of'
'or'
'out'
'packed'
'procedure'
'program'
'property'
'raise'
'record'
'repeat'
'resourcestring'
'set'
'shl'
'shr'
'string'
'then'
'threadvar'
'to'
'try'
'type'
'unit'
'until'
'uses'
'var'
'while'
'with'
'xor')
end
end
测试单元:
unit ACEditTestUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, uAutoComplete;
type
TForm1 = class(TForm)
AutoCompleteEdit1: TAutoCompleteEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
如果你需要定义匹配函数,你自己也可以,如果你需要定义匹配函数,你自己不知道你为什么接受这个答案。肯的答案似乎是正确的。除非你想下拉。@RRUZ:你作弊了。:)问题是关于自动完成TEdit。回答得不错,而且比我的回答快得多+1.@David,答案是使用
TEdit
组件的替代方法。我看不出有什么问题。我只是更喜欢真正的编辑解决方案。你的功能,但编辑有更令人愉快的美学,虽然它需要更多的努力。现在我有了更多的选票,我可以投赞成票了!:-)您还可以将样式设置为csSimple。它不会显示下拉列表,但仍会自动完成。不知道您为什么接受此答案。肯的答案似乎是正确的。除非你想下拉。@RRUZ:你作弊了。:)问题是关于自动完成TEdit。回答得不错,而且比我的回答快得多+1.@David,答案是使用TEdit
组件的替代方法。我看不出有什么问题。我只是更喜欢真正的编辑解决方案。你的功能,但编辑有更令人愉快的美学,虽然它需要更多的努力。现在我有了更多的选票,我可以投赞成票了!:-)您还可以将样式设置为csSimple。它不会显示下拉列表,但仍会自动完成。必须记住这一点以备将来参考此代码未使用DesignIntf
单元或DesignIde
包中的任何功能,因此应删除这些参考,那么就不需要设计时包了。@Eugene:如果TPointerList(elt)[I]
更改为TPointerList(@elt)[I]
,那么在XE2中实现对我来说很好。另外,我建议使用ComObj.StringToLPOLEStr()
将字符串
转换为COM分配的宽字符串:TPointerList(@elt)[I]:=ComObj.StringToLPOLESTR(FStrings[FCurrIndex])
或者,您可以简单地获得WideString
指针的所有权,而不是在WideString
已经创建了一个指针后再创建一个副本:TPointerList(@elt)[I]:=pointer(wStr);指针(wStr):=nil代码>@RemyLebeau:感谢您发表这些评论。我离开编译器有一个长周末了,但当我回到一个编译器时,我会考虑将最后一个建议集成到我的答案中。必须记住这一点,以备将来参考此代码没有使用DesignIntf
单元或DesignIde
包中的任何功能,因此应该删除这些参考,那么就不需要设计时包了。@Eugene:如果TPointerList(elt)[I]
更改为TPointerList(@elt)[I]
,那么在XE2中实现对我来说很好。另外,我建议使用ComObj.StringToLPOLEStr()
将字符串
转换为COM分配的宽字符串:TPointerList(@elt)[I]:=ComObj.StringToLPOLESTR(FStrings[FCurrIndex])
或者,您可以简单地获得WideString