Delphi - 自动完成备忘录

5
我需要一个带有自动完成功能的备忘录。最终,我希望能够在用户按下热键(Ctrl-space)时显示自定义自动完成列表,类似于Delphi IDE自动完成。
我有TMS的AdvMemo组件,但说实话,这个特定组件的帮助文档不足。看起来AdvMemo支持自定义自动完成,但我似乎找不到如何显示列表的方法。
因此,如果有人有关于备忘录上实现自动完成的建议,或者能够解释一下如何使用AdvMemo,我将不胜感激。

也许获取某个组件的帮助最好的方式是联系组件供应商,而不是公开表示它(或其文档)很糟糕? - Ken White
1
我必须详细说明,其他 TMS 文档都很好,只是这个特定的组件不足。 - Simon
2个回答

7

我决定为TMemo编写一些处理程序,使用TPopupmenu作为自动完成列表。

对于那些阅读此文的人,请参考我的另一篇文章: Delphi - 获取光标所在Memo中的整个单词(感谢RRUZ)

以下是自动完成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;

4
你可以看一下 SynEdit。它是免费的、开源的,并有一个活跃的社区,当你遇到问题时可以得到帮助。

这个组件有文档吗?我在页面上没有看到任何文档。 - Simon
我在网站上找不到文档。我会安装它并尝试使用其功能。如果遇到困难,请浏览支持新闻组和论坛。 - Birger
放置一个TSynCompletionProposal组件。设置建议关键字的字符串列表。设置热键和触发字符。选择目标组件为synedit/synmemo,自动完成功能即可使用。 - user30478

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接