Problem z ComboBox

0

Piszę aplikację, w której musi być pole edycyjne, które w trakcie pisania tekstu podpowiada jego dalszą część (coś jak w pasku adresu IE). Poza tym nie może być możliwe wpisanie innego tekstu, niż słowo z listy, z której są czerpane podpowiedzi.

Rozwiązałem to używając ComboBox. Jego wartości Items służą za podpowiedzi jeżeli zostanie ustawiona właściwość Style na csDropDown lub csSimple. Jednak takie ustawienie pozwala wpisać dowolne słowo - nawet nie znajdujące się w items. Natomiast jeżeli ustawię Style w inny sposób sytuacja się odwraca - można wybrać tylko słowo z listy, ale nie ma autouzupełniania.

Próbowałem też kilku komponentów podobnych do ComboBox z projektu Jedi, ale wychodzi praktycznie to samo.

Czy ma ktoś może pomysł? A może należałoby użyć innego komponentu? (zazwyczaj rozwiązanie jest banalne).

Prosze o pomoc (oczywiście jeżeli tylko ktoś zrozumie z tej gmatwaniny o co mi chodzi :))

0

Style:=csDropDownList;

Idea wpisywania ręcznego jest przeciwstawna idei ograniczenia dostepnych możliwości.

0

Niestety tak też próbowałem, ale nie sprecyzowałem może dokładnie o co mi chodzi.

Chodzi o to, żeby nie było konieczności rozwijania listy, a podpowiedzi automatycznie muszą się pojawiać w trakcie wpisywania. Np jeżeli w liście będzie 500 wpisów to ciężko by było przewinąć do tego odpowiedniego.

0

Używałeś kiedyś ComboBoxa z csDropDownList w ogóle? Jak jest zaznaczony i napiszesz wyraz, to zostanie on wybrany na liście - nie ma potrzeby rozwijania listy i wybierania go.

0

Mistrzu, ComboBox z csDropDownList mam obecnie wstawiony w programie i - uwierz mi - gdyby pozwalał w ogóle wpisać jakieś słowo to by było ok. Wyszukuje tylko po piwerszej literze wyrazu. Spróbuj wpisać w Items 2 wyrazy zaczynające się od tej samej litery... Nic z tego nie będzie.

0

Mistrzu :P - mam przed sobą właśnie aplikację i nie ma problemów z wpisaniem całych wyrazów, by je znalazł - musisz tylko pisać wyraz w miarę szybkim tempie (no, może powiedzmy, że w tempie normalnym, ale jednym ciągiem).

0

No ok, da się... Tylko teraz trzeba użytkownikowi wtłuc do głowy, że musi wpisać wyraz jednym ciągiem nie zastanawiając się co to ma być... Nie taka jest idea - to ma być podpowiedź, a nie poganiacz użytkownika mówiący: pisz szybciej...

Wyobraź sobie (tak jak podałem w pierwszym przykładzie) pasek adresu w IE (albo Mozilli). Zastanawiasz się nad jakimś adresem, który się zaczna od litery "a", ale nie pamiętasz czy to jest "abraham" czy "algida", wpiszesz więc to całe "a" i będziesz czekał co Ci program podpowie a on podpowie "aaaby.pl"- jak widzisz to nie tak.

0
masterinfo napisał(a)

No ok, da się... Tylko teraz trzeba użytkownikowi wtłuc do głowy, że musi wpisać wyraz jednym ciągiem nie zastanawiając się co to ma być... Nie taka jest idea - to ma być podpowiedź, a nie poganiacz użytkownika mówiący: pisz szybciej...

Wyobraź sobie (tak jak podałem w pierwszym przykładzie) pasek adresu w IE (albo Mozilli). Zastanawiasz się nad jakimś adresem, który się zaczna od litery "a", ale nie pamiętasz czy to jest "abraham" czy "algida", wpiszesz więc to całe "a" i będziesz czekał co Ci program podpowie a on podpowie "aaaby.pl"- jak widzisz to nie tak.

To może Ty się zastanów co chcesz bo jak juz napiszał Szczawik "Idea wpisywania ręcznego jest przeciwstawna idei ograniczenia dostepnych możliwości." Więc albo podpowiedzi albo zamknięta lista możliwości. A co by się miało robić jeśli user wpisze ciąg znaków, na który nie zaczyna się żaden wyraz na liście? Komunikat, że źle wpisał :>

0

Wpisywanie ręczne i ograniczanie możliwości nie są sobie całkiem przeciwstawne, poza tym nie jest to mój wymysł tylko użytkownika i do niego się muszę dostosować.

0

Witam, pokombinowalem troche z tym problemem i wyrzezbilem cos takiego:

var
  Form1: TForm1;
  slownik : array [1..3] of string; // tablica, w ktorej sa trzymane "hasla"
  Sistnieje : boolean;
  Olds : string;
implementation

{$R *.dfm}

procedure SPrawdz (s1, s2 : string; k : integer);
var
 s : string;
begin
   // utworz wyraz na podstawie podanego lancucha w comboboxie
  Delete (s2, 1, length(s1));    // i lancucha z tablicy slownik (s2)
  s := s1 + s2;
  if Pos(s,slownik[k]) > 0 then   // pokaz jakas podpowiedz
  begin
    Sistnieje := true;
    with form1.ComboBox1 do
     begin
      Items.Add(slownik[k]);
      ItemIndex := items.Count - 2;
      SelStart:= length(s1);
      SelLength := length(s2);
     end;
  end;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var s1 : string;
    i : integer;
begin
 Combobox1.Items.Clear;
 s1 := combobox1.Text;
 Sistnieje := false;
 for i := 1 to 3 do   // 10 - dlugosc tablicy slownik
   Sprawdz(s1, slownik[i], i);
 if Sistnieje = false then   // jesli slowko nie istnieje
  with combobox1 do

    begin           // cofnij krok usera
     Items.Clear;
     Text := Olds;
     SelStart := length (olds);
    end;
              
 Olds := combobox1.Text; // OLDs -  poprzedni lancuch usera, wczytywany gdy            //aktualny lancuch nie istnieje w tablicy slownik

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 slownik[1] := 'teest';
 slownik[2] := 'test';
 slownik[3] := 'testt';
 Sistnieje := false;
 OLDs := '';
end;

Nie dziala on do konca poprawnie (potestuj) , ale jesli pokombinujesz to moze cos ci z tego wyjdzie

0
masterinfo napisał(a)

Piszę aplikację, w której musi być pole edycyjne, które w trakcie pisania tekstu podpowiada jego dalszą część (coś jak w pasku adresu IE). Poza tym nie może być możliwe wpisanie innego tekstu, niż słowo z listy, z której są czerpane podpowiedzi.

Rozwiązałem to używając ComboBox. Jego wartości Items służą za podpowiedzi jeżeli zostanie ustawiona właściwość Style na csDropDown lub csSimple. Jednak takie ustawienie pozwala wpisać dowolne słowo - nawet nie znajdujące się w items. Natomiast jeżeli ustawię Style w inny sposób sytuacja się odwraca - można wybrać tylko słowo z listy, ale nie ma autouzupełniania.

Próbowałem też kilku komponentów podobnych do ComboBox z projektu Jedi, ale wychodzi praktycznie to samo.

Czy ma ktoś może pomysł? A może należałoby użyć innego komponentu? (zazwyczaj rozwiązanie jest banalne).

Prosze o pomoc (oczywiście jeżeli tylko ktoś zrozumie z tej gmatwaniny o co mi chodzi :))
Nic nie ustawiaj - zostaw ten komponent z ustawieniami domyślnymi, tylko usuń z niego nazwe. Następnie załaduj liste dynamicznie z pliku tekstowego. Jak to zrobisz to twój komponent zachowa sie tak jak chcesz. Jeśli natomiast nie będzie wpisywanego wyrazu na liście to wówczas nic ci on nie wskaże.

0

Jednak takie ustawienie pozwala wpisać dowolne słowo - nawet nie znajdujące się w items

StatJacek, twoje rozwiazanie tez bedzie obejmowac powyzszy problem

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