Гугл как редактировать / комбо-контроль для Delphi? - PullRequest
17 голосов
/ 06 января 2010

Каждый, наверное, знает, что я имею в виду, но для уточнения контроля понадобится:

  • Запустить событие, когда пользователь редактирует текст. В этом событии будет представлен список OffertionList: TStrings, который вы можете заполнить совпадениями / предложениями.
  • , если OffertionList не пуст, должен появиться выпадающий список.
  • В отличие от комбо, элемент управления не должен пытаться автоматически выбирать / автозаполнение или иным образом влиять на редактирование.

Итак, есть ли элемент управления Delphi для редактирования / комбинирования, который работает таким образом?

Ответы [ 4 ]

24 голосов
/ 12 января 2010

Используйте функцию автозаполнения , встроенную во все элементы управления редактирования Windows.

Сначала заполните объект TStrings, как хотите. Затем используйте GetOleStrings, чтобы создать TStringsAdapter, чтобы обернуть его. (Адаптер не претендует на владение объектом TStrings, поэтому вы должны быть уверены, что не уничтожите его, пока адаптер еще работает.) Адаптер предоставляет вам интерфейс IStrings, который вам понадобится, потому что Функция автозаполнения требует интерфейса IEnumString для обеспечения совпадений завершения. Для этого позвоните _NewEnum.

Затем вызовите CoCreateInstance, чтобы создать объект IAutoComplete. Вызовите метод Init, чтобы связать его с дескриптором окна вашего элемента управления редактирования. Если вы используете поле со списком, отправьте ему сообщение cbem_GetEditControl, чтобы найти основное окно редактирования.

В этот момент вы можете остановиться, и автозаполнение должно работать автоматически. Вы можете отключить автозаполнение, если хотите, или можете установить любое количество параметров автозаполнения .

Вы говорите, что не хотите автозаполнения, но в терминологии ОС, я думаю, что вы действительно не хотите, называется auto append , где оставшаяся часть строки вводится в поле ввода. автоматически по мере того, как пользователь печатает, но выбирается так, что дальнейшая печать будет перезаписывать его, и пользователь должен удалить лишний текст, если желаемое значение короче одного из совпадений.

Существует также автоматическое предложение , в котором отображается раскрывающийся список предложений.

Вы можете включить одну или обе опции. Вам не нужно самостоятельно фильтровать список предложений; объект автозаполнения самостоятельно фильтрует список IEnumString.

4 голосов
/ 06 января 2010

Вы можете использовать стандартную библиотеку TComboBox и faststrings (для функции stringMatches()).

procedure TForm1.cbChange(Sender: TObject);
var
  s:Integer;
  tmpstr:string;
begin
  //suggestions: tstringlist
  cb.AutoComplete:=false;
  tmpstr:=cb.Text;
  cb.Items.Clear;
  for s:=0 to suggestions.Count - 1 do
    if StringMatches(suggestions[s],cb.Text+'*') then
      cb.Items.Add(suggestions[s]);
  cb.DroppedDown:=(cb.Items.Count<>0) and (Length(cb.Text)<>0);
  cb.Text:=tmpstr;
  cb.SelStart:=Length(cb.Text)
end;
3 голосов
/ 30 ноября 2011

Если вы просто хотите показать файл или список URL:

SHAutoComplete(GetWindow(eb_MyComboBox->Handle, GW_CHILD), SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYS_DIRS);
2 голосов
/ 21 июня 2016

Я впервые реализовал эту функцию, как Роб описал ее в своем ответе. Позже я увидел, что TComboBoxEx имеет свойство AutoCompleteOptions, где я устанавливаю acoAutoSuggest на True и acoAutoAppend на False. ComboBox теперь фильтрует свой список элементов при выполнении какой-либо записи и показывает соответствующие элементы.

Я использую RAD Studio 10 Seattle и XE2, но не знаю, доступна ли эта функция в более старых версиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...