Последние новости от Microsoft: Билл Гейтс привезет 10 октября в Москву последнюю разработку своей компании - партию картриджей для Dendy и Super Nintendo с новой версией операционной системы Windows и пакета MSOffice на русском языке, и лично будет продавать их на Митинском радиорынке (место G9) под усиленной охраной ОМОН.
var
words: TStringList;
procedure TForm1.FormCreate(Sender: TObject);
begin
words := TStringList.Create;
words.Sorted := true;
words.Add('one');
words.Add('two');
words.Add('four');
words.Add('five');
words.Add('six');
words.Add('seven');
words.Add('eight');
words.Add('nine');
words.Add('ten');
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
const
chars: setof char = ['A'..'Z', 'a'..'z', 'А'..'Я', 'а'..'я'];
var
w: string;
i: integer;
s: string;
full: string;
SelSt: integer;
begincase Key of
VK_RETURN, VK_TAB:
begin
Edit1.SelStart := Edit1.SelStart + Edit1.SelLength;
Edit1.SelLength := 0;
Exit;
end;
VK_DELETE, VK_BACK:
begin
Edit1.ClearSelection;
Exit;
end;
end;
s := Edit1.Text;
SelSt := Edit1.SelStart;
i := SelSt;
if (length(s) > i) and (s[i+1] in chars) then
Exit;
w := '';
while (i >= 1) and (s[i] in chars) dobegin
w := s[i] + w;
dec(i);
end;
if length(w) <= 0 then
Exit;
words.Find(w, i);
if (i >= 0) and (UpperCase(copy(words[i], 1,
length(w))) = UpperCase(w)) thenbegin
full := words[i];
insert(copy(full, length(w) + 1, length(full)), s, SelSt + 1);
Edit1.Text := s;
Edit1.SelStart := SelSt;
Edit1.SelLength := length(full) - length(w);
end;
end;
Код, который вы предоставили, это приложение на Delphi, использующее компонент TEdit для имитации автодополнения слов на основе предопределенного списка слов.
Вот как работает код:
Когда форма создается, TStringList, называемый words, инициализируется 10 английскими словами (от одного до десяти). Свойство Sorted установлено в True, что означает, что список будет отсортирован алфавитно.
В процедуре Edit1KeyUp код проверяет, нажата ли клавиша Enter или Tab. Если так, то курсор перемещается к концу выбранного текста и выбор очищается.
Если пользователь нажимает клавишу Delete или Backspace, код очищает выбор и выходит.
Для других клавиш код извлекает текущий символ в позиции курсора и проверяет, является ли он буквой (либо заглавной, либо строчной). Если нет, то код выходит.
Если символ является буквой, код конструирует слово, перемещаясь назад от позиции курсора до тех пор, пока не найдет не-буквенный символ или не дойдет до начала текста.
Затем код ищет это слово в списке words и, если его находит, вставляет соответствующее полное слово в позицию курсора.
Альтернативное решение:
Вместо ручного конструирования слова и поиска его в списке можно использовать встроенную функциональность автодополнения Delphi, предоставляемую компонентом TAutoComplete. Это сделает ваш код более эффективным и проще для поддержки.
Вы также можете добавить дополнительные функции к вашему системе автодополнения, такие как:
Независимость от регистра
Поддержка нескольких языков
Возможность фильтровать слова, не совпадающие с префиксом
Сuggestions для неоконченных слов
Вот пример реализации этого с помощью TAutoComplete:
В этом коде создается компонент TAutoComplete и устанавливаются его свойства для использования списка words как источника автодополнения и контрола Edit1 как целевого для завершенного текста. Метод DoAutoComplete вызывается для выполнения фактического операции автодополнения. Если пользователь нажимает Enter после выбора предложения автодополнения, код выходит без выполнения дальнейших инструкций.
В статье описывается подстановка текста в поле ввода TEdit, используя список строк и выполняемая обработка на основе вводимых символов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.