Подсказка при вводе в Edit

Материал из DRKB

Подсказка при вводе в Edit[править | править код]

Сегодня поговорим о том, как помочь пользователю ввести в поле ввода текст. Для этого компьютер должен по первым буквам вводимого слова догадаться, что хочет написать пользователь, и предложить ему этот вариант. Один из способов это сделать - дописывать не хватающие буквы к слову, но выделять их.

Edit subst.gif

Нужно решить три задачи:

  1. определить вводимые символы,
  2. найти слово, начинающееся с этих символов,
  3. добавить не хватающие символы и выделить их.

Для решения первой задачи достаточно найти первый символ, не являющийся буквой. Для решения второй задачи можно использовать поиск в StringList. Вставить недостающие символы удобно в специальной переменной типа String.

В этом примере словарь состоит из названий чисел (на английском): от 1 до 10. Иногда словарь можно пополнять, добавляя туда незнакомые слова, вводимые пользователем.


var
  words: TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
  words := TStringList.Create;
  words.Sorted := True;
  words.Add('one');
  words.Add('two');
  words.Add('four');
  words.Add('five');
  words.Add('six');
  words.Add('seven');
  words.Add('eight');
  words.Add('nine');
  words.Add('ten');
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
const
  chars: set of char = ['A'..'Z', 'a'..'z', 'А'..'Я', 'а'..'я'];
var
  w: string;
  i: Integer;
  s: string;
  full: string;
  SelSt: Integer;
begin
  if Key = 13 then
  begin
    Edit1.SelStart := Edit1.SelStart + Edit1.SelLength;
    Edit1.SelLength := 0;
    Exit;
  end;
  s := Edit1.Text;
  SelSt := Edit1.SelStart;
  i := SelSt;
  if (Length(s) > i) and (s[i+1] in chars) then Exit;
  w := '';
  while (i >= 1) and (s[i] in chars) do
  begin
    w := s[i] + w;
    Dec(i);
  end;
  if Length(w) <= 0 then Exit;
  words.Find(w, i);
  if (i >= 0) and (UpperCase(Copy(words[i], 1, Length(w))) = UpperCase(w)) then
  begin
    full := words[i];
    Insert(Copy(full, Length(w) + 1, Length(full)), s, SelSt + 1);
    Edit1.Text := s;
    Edit1.SelStart := SelSt;
    Edit1.SelLength := Length(full) - Length(w);
  end;
end;


Source: http://delphiworld.narod.ru/
ID: 00542

См. также[править | править код]