Подтвердить что ты не робот

Google, как редактировать/комбо-контроль для Delphi?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Вы можете использовать стандартную библиотеку 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

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

SHAutoComplete(GetWindow(eb_MyComboBox->Handle, GW_CHILD), SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYS_DIRS);

Ответ 4

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

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