В этом примере показывается, как завершить часть строки, напечатанной в ComboBox. Код представляет обработчик события OnKeyPress для ComboBox.
Обратите внимание: Обработчик события OnKeyPress не работает в случае, когда пользователь нажимает клавишу Delete. Это событие должно перехватываться в обработчике событий OnKeyDown.
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char) ;
var
Found: boolean;
j,SelSt: Integer;
TmpStr: string;
begin
{ Сначала нужно обработать нажатие клавиши, чтобы получить текущую строку }
{ Этот код требует, чтобы все элементы в списке были в верхнем регистре}
if Key in ['a'..'z'] then Dec(Key,32) ; { Переводим все в верхний регистр! }
with (Sender as TComboBox) do
begin
SelSt := SelStart;
if (Key = Chr(vk_Back)) and (SelLength <> 0) then
TmpStr := Copy(Text, 1, SelStart) + Copy(Text, SelLength + SelStart + 1, 255)
else if Key = Chr(vk_Back) then {SelLength = 0}
TmpStr := Copy(Text, 1, SelStart - 1) + Copy(Text, SelStart + 1, 255)
else {Key in ['A'..'Z', etc]}
TmpStr := Copy(Text, 1, SelStart) + Key + Copy(Text, SelLength + SelStart + 1, 255) ;
if TmpStr = '' then Exit;
{ Обновить SelSt в текущей позиции }
if (Key = Chr(vk_Back)) and (SelSt > 0) then Dec(SelSt)
else if Key <> Chr(vk_Back) then Inc(SelSt) ;
Key := #0; { указать, что клавиша была обработана }
if SelSt = 0 then
begin
Text:= '';
Exit;
end;
{ Теперь, когда TmpStr напечатан в текущей позиции
ищем соответствие }
Found := False;
for j := 1 to Items.Count do
if Copy(Items[j - 1], 1,Length(TmpStr)) = TmpStr then
begin
Text := Items[j - 1]; { Обновить соответствие, если найдено }
ItemIndex := j - 1;
Found := True;
Break;
end;
if Found then { Выделить конец строки }
begin
SelStart := SelSt;
SelLength := Length(Text) - SelSt;
end
else Beep;
end;
end;
|