Potrzebny komponent albo sposób

0

Witajcie,

do programiku potrzebuję pola do wyszukiwania. Chciałbym aby to było coś na kształt pola edit ale działało w sposób taki że wpisując pierwsze znaki pojawiają się następne pobrane z bazy danych.
Co będę pisał, jeden obraz wart jest tysiąca słów więc proszę:
screenshot-20200205200933.png
znacie może jakiś komponent który to potrafi lub sposób aby to sprytnie zrobić?

4

Taką funkcjonalność implementują przede wszystkim kontrolki typu ComboBox, tyle że podpowiadanie skorelowane jest z zawartością listy rozwijalnej i wygląda nieco inaczej – końcowy fragment dopasowania jest zaznaczony (standardowo, jako SelText), więc podczas wpisywania kolejnych liter jest on nadpisywany, po czym zawartość listy walidowana jest ponownie i jeśli zostanie znalezione dopasowanie, to końcowy fragment zostaje dodany i znów zaznaczony. I tak w kółko. Jest to funkcjonalność dodana do systemowej kontrolki, czego ona w standardzie IMO nie obsługuje.

Nie znam komponentu będącego polem edycyjnym z taką funkcjonalnością, ale jeśli niczego nie znajdziesz to możesz taką funkcjonalność sobie dodać do zwykłego pola edycyjnego, na kształt tej z comboboxów. Przykład znajdziesz np. tutaj How to implement autocompletion in a TEdit. Ale nie będzie to tak działać jak wskazuje na to obrazek poglądowy.

Natomiast jeśli chciałbyś napisać swój komponent z taką funkcjonalnością, to możesz co nieco zaczerpnąć z mojego artykułu na temat renderowania dwukolorowego tekstu. Co prawda jest on dla Lazarusa i jego przeznaczenie jest nieco inne, ale łatwo można go zmodyfikować i dopasować do Twoich wymagań. Jedyne co byś potrzebował to zaimplementować zaznaczanie oraz przewijanie tekstu, gdy ten nie będzie się mieścił w kontrolce. Nie będzie to łatwe do zaimplementowania, ale budowa takiej kontrolki nie zajmie więcej niż dniówkę. ;)

0

Kurcze, normalnie nie mam miejsca na comboboxa Aplikacja jest na ekrany o małej rozdzielczości a dodatkowo obsługa dotykowa - klawiatura swoje zabiera.
Ale druga sugestia może się przydać. Już biorę się za testowanie.

0

IMO rozsądnym rozwiązaniem by było dodanie autouzupełniania do standardowego pola edycyjnego, w taki sposób, w jakim implementuje to combobox. Wszystko dlatego, że końcowy tekst dopasowania nie jest jedynie renderowany, a jest integralną częścią tekstu kontrolki.

Jeśli zrobi się to inaczej, czyli domaluje dopasowanie bez modyfikacji tekstu kontrolki, to trzeba będzie w jakiś sposób umożliwić ”akceptację” dopasowania, a tym samym zmianę tekstu komponentu. Może za pomocą klawisza Enter, może inaczej – to zależy od tego, jak masz oprogramowaną obsługę klawiszy i czy w ogóle masz wygenerowane zdarzenia dla wciskania klawiszy. No i pozostanie też kwestia obsługi programu za pomocą klawiatury – mowa o klawiszu Tab i przenoszeniu fokusa.

1

Chyba rozwiązałem problem, użyłem ComboBox, załadowałem do niego w trakcie onShow formy bazę nipów, chwilkę to trwa ale nie jest tak źle biorąc pod uwagę że jest tam teraz 1700 rekordów a jestem podłączony do niej przez Internet. Następnie ustawiłem style ComboBox na csSimple i poza wyszarzeniem tekstu wszystko działa prawidłowo. ComboBox wygląda jak Edit.
Malutka prezentacja (od 11 sekundy):

0

W sumie to nie zdawałem sobie sprawy z tego, że – przynajmniej w Lazarusie – można wizualnie zamienić combobox w edit, ustawiając właściwość Style na csSimple. Będzie wyglądać jak zwykłe pole edycyjne, ale posiadać ukrytą listę (już nierozwijalną) braną pod uwagę podczas filtrowania.

Fajnie – nie znałem tego ficzeru. ;)

1
robertz68 napisał(a):

Chyba rozwiązałem problem, użyłem ComboBox, załadowałem do niego w trakcie onShow formy bazę nipów, chwilkę to trwa ale nie jest tak źle biorąc pod uwagę że jest tam teraz 1700 rekordów a jestem podłączony do niej przez Internet.

Jeżeli chwila to ok. 1,2 do 2s, to może lepiej załaduj dane na starcie aplikacji i oczywiście dane do cache z odświeżaniem po zmianie kartoteki źródłowej.
Dlaczego tak?
Ano skoro to kontrahenci to pewnie są potrzebni praktycznie zawsze, w każdej sesji używania aplikacji.
A więc lepiej poczekać chwilkę raz na starcie niż chwilę za każdym razem.

Następnie ustawiłem style ComboBox na csSimple i poza wyszarzeniem tekstu wszystko działa prawidłowo. ComboBox wygląda jak Edit.

Jeśli to Windows, to może w stronę IAutoComplete?
Szczegóły znajdziesz np tu (druga odpowiedź):
https://stackoverflow.com/questions/5465590/auto-append-complete-from-text-file-to-an-edit-box-delphi

Osobiście wolę, aby wszelkie lookups prezentowały mi listę danych spełniające kryteria wyszukiwania z której mogę wybrać interesujący mnie element.
Tylko Ty masz tam aplikację klasy POS, a te z definicji mają specyficzne wymagania i nie wszystko może tam pasować, prawda?

0

@furious programming: Mój program nie utworzy nipu z kreseczkami czy spacjami ale problemem jest oryginalne Gastro, tam nadal można tak zrobić i ciężko byłoby to zmienić. Poprawiłem to w ten sposób że dynamicznie tworzę nową kolumnę i do niej kopiuję dane o nipach sformatowane w sposób jaki mi odpowiada. Tak więc ja już wyszukuję w ładnie sformatowanych danych.

@wloochacz dzięki za uwagi, zawsze biorę je pod uwagę lub co najmniej rozważam je.
Co do ładowania danych, stanowisk sprzedaży jest kilka i dane są potrzebne zawsze aktualne. Dlatego zdecydowałem się na sposób najbardziej drastyczny czyli ładowanie dynamiczne. Rzeczywiście trwa to mniej więcej tyle co podałeś ale widocznie nie doczytałeś że dane pobieram z bazy do której jestem podłączony przez internet. W środowisku produkcyjnym w sieci lokalnej ten czas spada drastycznie ale z drugiej strony komputery Pos to najczęściej Celerony j1900 a ich wydajność jest delikatnie mówiąc słaba. Dlatego i tak trzeba poczekać około 1 sekundy na załadowanie około 2 tys. rekordów. Na szczęście nie jest to tak dużym problemem ponieważ:

  • po pierwsze ilość faktur do paragonów to jest mniej więcej 1:500 (w moim środowisku produkcyjnym),
  • po drugie, w porównaniu do oryginalnego programu Gastro Pos jestem szybszy kilka tysięcy procent (to nie błąd) więc i tak załoga będzie wniebowzięta :).

Sposób na AutoComlete jest ciekawy, na pewno przyda się w jakimś projekcie - dzięki.

Ostatnia sprawa to rozwijana lista, tak mi też podoba się rozwijana lista ale w obsłudze "palcem" za bardzo to się nie sprawdza. Jak napisałeś - aplikacje tego typu mają swoje prawa a dodatkowo pracownicy je obsługujący nie są informatykami a nawet pracownikami biurowymi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1