Autouzupełnianie tekstu w TEdit

Autouzupełnianie tekstu w TEdit
Pepe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 505
0

Mam takie zapotrzebowanie, żeby zrobić autouzupełnianie tekstu w kontrolce TEdit.

Chodzi o to, że mam listę użytkowników, powiedzmy z emailem (lista typu TStringList). Mam też pole z kontrolką TEdit, w której użytkownik ma podać adres email.
Teraz - żeby nie trzeba było wpisywać całego tekstu, tylko w miarę wpisywania - jeśli adres email znajduje się na liście - nastąpiło samoczynne wpisanie (które można jednak cofnąć, jeśli dopasowanie jest nieprawidłowe).

Czy ktoś z Was coś takiego robił? Jak się do tego zabrać?
Może jakiś przykładowy kod(!)?

-Pawel

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
1

Nie robiłem tego nigdy, ale na pierwszy rzut oka jest to bardzo proste w implementacji. Jeśli masz słowniczek w TStringList, to w zdarzeniu TEdit.OnChange (lub którymś podobnym) użyj zawartości pola edycyjnego jako prefiksu i porównuj go liniowo z zawartością słownika. Jeśli znajdziesz dopasowanie, to skopiuj drugą część znalezionego słowa (po prefiksie) i dodaj ją do treści pola edycyjnego, a potem użyj Edit.SelStart i Edit.SelLength aby ją podświetlić i ustawić kursor w odpowiednim miejscu (po prefiksie, czyli na początku bloku zaznaczenia).

Pamiętaj, że dodanie do pola edycyjnego drugiej części dopasowanego słowa również wywoła Edit.OnChange, więc aby nie wpaść w rekurencję, użyj flagi logicznej i wyjdź z Edit.OnChange, jeśli proces dodawania postfiksu trwa. Zwróć też uwagę na to, aby nie dodawać postfiksu, gdy karetka nie jest umieszczona na końcu tekstu kontrolki, bo to może irytować użytkownika. Ale tak ogóle to pobaw się tym i wybadaj co zrobić, aby autouzupełnianie nie było upierdliwe.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

To powinien być gotowy komponent, nie ma sensu tracić czasu na takie bzdury.
Tu jest jakiś https://docwiki.embarcadero.com/CodeExamples/Sydney/en/TComboBox_(Delphi)
ale to jest taka podstawa że nie powinieneś mieć problemu ze znalezieniem tysiąca innych

PD
  • Rejestracja: dni
  • Ostatnio: dni
3

Jak wskazał @obscurity możesz użyć do tego celu TComboBox - poniżej przykład z Lazarusa:
screenshot-20250312220238.gif

screenshot-20250312220047.png

Pepe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 505
0

@obscurity @Paweł Dmitruk
Tyle wiem - ale pytałem konkretnie o TEdit. Ale w sumie nic nie szkodzi. Macie racje.
Może jednak to ma sens... zamiast wymyślać koło na nowo, mogę zaakceptować gotowiec, choć w nieco innej formie niż bym chciał...
Tak jak pisał @flowCRANE można to zrobić, ale może jednak czas poświęcony na pisanie własnej implementacji nie jest tego warty.
Dziękuję.

PD
  • Rejestracja: dni
  • Ostatnio: dni
2

A jak chcesz aby kontrolka wyglądała jak TEdit to ustaw właściwość Style na csSimple i masz:
screenshot-20250313054932.png

Pepe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 505
1

Jeszcze takie pytanko... używając TComboBox ze stylem csSimple mam to co chciałem... Czyli wpisując teks, który jest zgodny z którymś z elementów Combo jest on proponowany.
Ale... Jeśli wcisnę na klawiaturze klawisz "strzałka w dół" albo "strzałka w górę" to następuje automatyczna podmiana tekstu na kolejny z listy - to niepożądane. Jak można by to zablokować? Ma ktoś pomysł?
Pasowałoby zablokować zdarzenia onKeyUp i onKeyDown dla klawiszy (VK_DOWN i VK_UP) - nie mam pojęcia jak to zrobić.
Jakiś pomysł?

PD
  • Rejestracja: dni
  • Ostatnio: dni
3

w Lazarusie działa:

Kopiuj
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_UP, VK_DOWN: Key := 0;
  end;
end;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.