Delphi - 自动完成备忘录

时间:2011-06-14 02:16:13

标签: delphi autocomplete memo

我需要一个具有自动完成功能的备忘录。 最终,当用户按下类似于Delphi IDE自动完成的热键(Ctrl-space)时,我希望能够显示自定义自动完成列表。

我有TMS AdvMemo,但说实话,缺少对这个特定组件的帮助。似乎AdvMemo支持自定义自动完成,但我似乎无法找到如何显示列表。

所以,如果有人有任何关于在备忘录上实现自动完成的建议,或者为了启发我使用AdvMemo,我们将不胜感激

2 个答案:

答案 0 :(得分:6)

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

对于那些阅读此内容的人,请参阅我的其他帖子: Delphi - Get the whole word where the caret is in a 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;

答案 1 :(得分:4)

您可以查看SynEdit。它是免费的,开源的,并且有一个活跃的社区可以帮助您解决问题。