我需要具有自动完成功能的备忘录。最终,我希望能够在用户按下类似于 Delphi IDE 自动完成的热键(Ctrl-空格)时显示自定义自动完成列表。
我有 TMS AdvMemo
,但老实说,缺乏对这个特定组件的帮助。AdvMemo 似乎支持自定义自动完成,但我似乎无法找到如何显示列表。
因此,如果有人对在备忘录上实现自动完成有任何建议,或者启发我使用 AdvMemo,将不胜感激
我需要具有自动完成功能的备忘录。最终,我希望能够在用户按下类似于 Delphi IDE 自动完成的热键(Ctrl-空格)时显示自定义自动完成列表。
我有 TMS AdvMemo
,但老实说,缺乏对这个特定组件的帮助。AdvMemo 似乎支持自定义自动完成,但我似乎无法找到如何显示列表。
因此,如果有人对在备忘录上实现自动完成有任何建议,或者启发我使用 AdvMemo,将不胜感激
我决定使用 TPopupmenu 作为自动完成列表为 TMemo 编写一些处理程序。
对于那些阅读此内容的人,请参阅我的另一篇文章: Delphi - 获取备忘录中插入符号所在的整个单词(感谢 RRUZ)
以及以下代码: AutoComplete TPopupMenu 的 OnPopup:(memoAutoComplete 保存自动完成项的列表)
procedure AutoCompletePopup(Sender: TObject);
var i : integer;
NewItem : TMenuItem;
AutoCompleteToken: String;
begin
//filter list by token
AutoCompleteToken := SelectWordUnderCaret(edtComment);
AutoComplete.Items.Clear;
for i:=0 to memoAutoComplete.Lines.Count -1 do
begin
if SameText(LeftStr(memoAutoComplete.Lines.Strings[i],Length(AutoCompleteToken)),AutoCompleteToken) then
begin
NewItem := TMenuItem.Create(AutoComplete);
NewItem.Caption := memoAutoComplete.Lines.Strings[i];
NewItem.OnClick := AutoComplete1Click;
NewItem.OnMeasureItem := AutoComplete1MeasureItem;
NewItem.OnAdvancedDrawItem := AutoComplete1AdvancedDrawItem;
AutoComplete.Items.Add(NewItem);
end;
end;
end;
对于 Tmemo:
procedure Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var pt : TPoint;
begin
if (Key = VK_SPACE) and (GetKeyState(VK_CONTROL) < 0) then
begin
pt := Memo1.ClientToScreen(Point(0,Memo1.Height));
AutoComplete.Popup(pt.X,pt.Y);
end;
end;
你可以看看SynEdit。它是免费的、开源的,并且有一个活跃的社区可以在您遇到困难时帮助您。