Google jak edit / combo control dla Delphi?

Wszyscy pewnie wiedzą o co mi chodzi, ale żeby wyjaśnić kontrolę trzeba by było:

  • Uruchom zdarzenie, gdy użytkownik edytuje tekst. Wydarzenie dostarczy listę sugestii: TStrings, którą możesz wypełnić dopasowaniami / sugestiami.
  • Jeśli lista sugestii nie jest pusta, powinna pojawić się lista rozwijana.
  • W przeciwieństwie do combo, Kontrola nie powinna próbować automatycznie wybrać / auto zakończyć lub w inny sposób wpływać na edycję.

Więc, czy istnieje Delphi edycja/combo control to tak działa ?

Author: kapa, 2010-01-06

4 answers

Użyj funkcji autocompletion wbudowanej we wszystkie kontrolki edycji systemu Windows.

Najpierw wypełnij swój TStrings obiekt jak chcesz. Następnie użyj GetOleStrings aby utworzyć TStringsAdapter zapakować. (Adapter nie rości sobie prawa własności obiektu TStrings, więc musisz się upewnić, że go nie zniszczysz, gdy adapter jest nadal aktywny.) Adapter daje interfejs IStrings, który będzie potrzebny, ponieważ funkcja autocompletion wymaga IEnumString interfejs do zapewnij dopasowanie zakończenia. Call _NewEnum za to.

Następny, zadzwoń CoCreateInstance aby utworzyć IAutoComplete obiekt. Call its Init sposób, aby powiązać go z uchwytem okna kontrolki edycji. Jeśli używasz combo box, wyślij go cbem_GetEditControl komunikat, aby znaleźć podstawowe okno edycji.

Możesz zatrzymać się w tym momencie, A Automatyczne uzupełnianie powinno działać automatycznie. Możesz wyłączyć autouzupełnianie, jeśli chcesz, lub możesz ustawić dowolny liczba opcji autouzupełniania .

Mówisz, że nie chcesz autocompletion, ale w terminologii systemu operacyjnego, myślę, że to, czego naprawdę nie chcesz, nazywa się Auto append , gdzie pozostała część łańcucha jest wprowadzana do pola edycji automatycznie jako typy użytkownika, ale wybrana tak, że dalsze pisanie nadpisze go, a użytkownik musi usunąć nadmiar tekstu, jeśli żądana wartość jest krótsza niż jedna z dopasowań.

Istnieje również auto suggest , który wyświetla rozwijaną listę sugestii.

Możesz włączyć jedną lub obie opcje. Nie musisz filtrować listy sugestii samodzielnie; obiekt autouzupełniania sam filtruje listę IEnumString.

 23
Author: Rob Kennedy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-13 16:20:12

Możesz użyć standardowej biblioteki TComboBox i faststrings (dla funkcji 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;
 4
Author: bmeric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 16:52:48

Jeśli chcesz po prostu pokazać plik lub listę url:

SHAutoComplete(GetWindow(eb_MyComboBox->Handle, GW_CHILD), SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYS_DIRS);
 3
Author: pcunite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 14:33:11

Po raz pierwszy zaimplementowałem tę funkcję, tak jak Rob opisał ją w swojej odpowiedzi. Później zobaczyłem, że TComboBoxEx ma właściwość AutoCompleteOptions Gdzie ustawiłem acoAutoSuggest na True i acoAutoAppend na False. ComboBox filtruje teraz swoją listę elementów podczas wykonywania jakiegoś wpisu i pokazuje pasujące elementy.

Używam RAD Studio 10 Seattle i XE2, ale nie wiem, czy ta funkcja jest dostępna w starszych wersjach.

 2
Author: Kerem D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 10:08:14