Delphi - Автозаполнение

Мне требуется памятка с функцией автозаполнения. В конечном счете, мне бы хотелось иметь возможность отображать пользовательский список автозаполнения, когда пользователь нажимает горячую клавишу (Ctrl-пробел), аналогичную автозаполнению Delphi IDE.

У меня есть TMS AdvMemo, но, честно говоря, помощь для этого конкретного компонента отсутствует. Похоже, AdvMemo поддерживает пользовательское автоматическое завершение, но я не могу понять, как отобразить список.

Так что, если у кого-то есть какие-либо предложения по достижению автозаполнения на заметке или для ознакомления меня с использованием AdvMemo, было бы полезно

2 ответа

Решение

Я решил написать несколько обработчиков для TMemo, используя TPopupmenu в качестве списка автозаполнения.

Для тех, кто читает это, пожалуйста, обратитесь к моему другому посту: Delphi - Получите полное слово, где каретка находится в заметке (спасибо RRUZ)

И следующий код: OnPopup для автозаполнения TPopupMenu: (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. Это бесплатно, с открытым исходным кодом и имеет активное сообщество, чтобы помочь вам, когда вы застряли.

Другие вопросы по тегам