2010-01-06 11 views
16

Każdy chyba wie, co mam na myśli, ale aby wyjaśnić kontrola musiałaby:Google jak kontrola edycji/combo dla Delphi?

  • ognia zdarzenie, gdy użytkownik edytuje tekst. Wydarzenie będzie zawierało propozycjęList: TStrings, które można wypełnić dopasowaniami/sugestiami.
  • jeśli propozycja nie jest pusta, powinno pojawić się menu rozwijane.
  • W przeciwieństwie do kombi, kontrola nie powinna próbować automatycznie wybierać/automatycznie zakończyć lub w inny sposób wpływać na edycję.

A więc czy istnieje opcja edycji/combo Delphi, która działa w ten sposób?

Odpowiedz

23

Użyj wbudowanego autocompletion feature do wszystkich elementów sterujących edycji w systemie Windows.

Najpierw wypełnij swój obiekt TStrings. Następnie użyj GetOleStrings, aby utworzyć TStringsAdapter, aby go zawinąć. (Adapter nie rości sobie prawa własności do obiektu TStrings, więc należy się upewnić, że nie zostanie zniszczony, gdy adapter jest nadal aktywny). Adapter zapewnia interfejs IStrings, który jest potrzebny, ponieważ funkcja autouzupełniania wymaga Interfejs IEnumString zapewniający ukończenie meczów. Zadzwoń pod numer _NewEnum.

Następnie wywołaj CoCreateInstance, aby utworzyć obiekt IAutoComplete. Wywołaj metodę Init, aby powiązać ją z uchwytem okna kontrolki edycji. Jeśli używasz pola kombi, wyślij mu wiadomość o numerze cbem_GetEditControl, aby znaleźć podstawowe okno edycji.

Możesz zatrzymać w tym momencie, a autouzupełnianie powinno działać automatycznie. Możesz wyłączyć autouzupełnianie, jeśli chcesz, lub możesz ustawić dowolną liczbę autocompletion options.

Mówisz, że nie chcesz autouzupełniania, ale w terminologii OS, myślę, że to, czego naprawdę nie chcesz, nazywa się auto append, gdzie pozostała część łańcucha jest automatycznie wprowadzana do pola edycji jako typy użytkowników, ale wybrane tak, aby dalsze pisanie nadpisało je, a użytkownik musi usunąć nadmiarowy tekst, jeśli pożądana wartość jest krótsza niż jeden z dopasowań.

Istnieje również auto sugeruje, który wyświetla listę rozwijanych sugestii.

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

+0

To nic nie jest doskonałe, dokładnie to, czego chcę, nie wiedziałem o opcjach autouzupełniania, dziękuję. –

+0

Funkcja IAutoComplete nie obsługuje dopasowywania żadnego częściowego ciągu znaków, ale obsługuje tylko dopasowywanie od początku. Mam na myśli, biorąc pod uwagę dwa ciągi, "bcd" i "abcd", jeśli piszę "bc", dopasuje się tylko "bcd", ale chcę też, aby dopasować również "abcd". –

+0

Wtedy "autouzupełnianie" nie jest pożądaną funkcją, @Edwin. To * uzupełnia * to, co już wpisałeś. –

4

Można 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; 
+0

Tak, jest blisko, ale ma kilka problemów. Kiedy wpiszesz pierwszy znak w pustym zestawie, przez ułamek sekundy automatycznie go uzupełni, zanim ustawisz tekst cb.text na to, czym był. Również po przesunięciu fokusu do innej kontrolki, gdy rozwijane menu jest widoczne, będzie ono ponownie autouzupełniane. A jeśli użyjesz klawiszy w górę/w dół, aby poruszać się po rozwijanych pozycjach, tekst ponownie pojawi się w autouzupełnieniu. I na koniec ustawiamy SelStart na ostatni znak, ale powinien on być ustawiony tam, gdzie był, więc SelStart musi być przechowywany na początku metody i przywrócony na końcu. –

3

Jeśli tylko chcesz, aby wyświetlić listę plików lub URL:

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

raz pierwszy realizowany tej funkcji, jak Rob opisano to w jego odpowiedź. Później zobaczyłem, że TComboBoxEx ma właściwość AutoCompleteOptions, w której ustawiam acoAutoSuggest na True i acoAutoAppend na False. ComboBox teraz filtruje listę przedmiotów, gdy robi jakiś wpis 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.