Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > combobox запрет редактирования


Автор: MrDmitry 4.4.2014, 14:19
Помогите написать процедурку которая бы проверяла текст введенный в комбобкс и если у комбобкс.items нет совпадений с текстом то запрещала бы ввод. Попробовал реализовать так.

Код

//Заполняем комбобоксы(или не заполняем)
procedure Tmain.FilterComboList(Combo: TComboBox);
 var
 list:TStringList;
 i, p:integer;
 p_select:word;
 str:string;
begin
 str:=Combo.text;
 p_select:=Combo.SelStart;
 try
  list:=TStringList.Create;
  for i:= 0 to Combo.Items.Count do
   begin
    p:=Pos(str, Combo.Items.Strings[i]);
     if p>0 then
    list.Add(Combo.Items.Strings[i]);
   end;
 finally
  list.Free;
 end;
 if list.Count<=0 then
  Delete(str, length(str), 1);
  Combo.text:=str;
  Combo.SelStart:=p_select;
 end;


Вызов
Код

procedure Taddclient.installmentKeyPress(Sender: TObject; var Key: Char);
begin
main.FilterComboList(installment);
end;


Но что то у комбобокса становится странное поведение (

Автор: Poseidon 4.4.2014, 14:45
Ну заполняешь ты свой list совпадениями при каждом нажатии клавиши, и что дальше? Явно не хватает Combo.Items := list.

Добавлено через 2 минуты и 11 секунд
А ввобще я бы сделал через OnKeyDown и блокировкой Key := #0.

Автор: MrDmitry 4.4.2014, 16:07
Вы не поняли что я хочу. Мне не нужно заполнять список combobox мне нужно запретить ввод данных если в списке combobox не нашлось совпадений.

Например у меня есть

Код

combobox.Items.Add('1');
combobox.Items.Add('12');
combobox.Items.Add('113');


Например я ввожу в combobox 
1 - это текст должен ввестись так как 1 в списке есть
12 - это текст должен ввестись так как 12 в списке есть
112 - символ 2 после 11 не должен ввестись так как совпадений в тексте нет при этом если ввести 113 то 3 введется

Автор: Poseidon 4.4.2014, 21:38
Цитата(MrDmitry @  4.4.2014,  16:07 Найти цитируемый пост)
Вы не поняли что я хочу.
Я понял что ты хочешь. Еще я вижу что ты уже написал. Даже если допустить, что я не разобрался, тогда объясни мне что делает с твоем коде list?

Код

procedure TForm1.ComboBoxKeyPress(Sender: TObject; var Key: Char);
var
  i: Integer;
  Found: Boolean;
begin
  Found := False;
  for i := 0 to ComboBox.Items.Count-1 do
    if ComboBox.Items[i].StartsWith(ComboBox.Text + Key) then
      begin
        Found := True;
        Break;
      end;

  if not Found then
    Key := #0;
end;

Только не забудь предусмотреть дополнительную обработку нужных клавиш (BackSpace и т.п.)

Автор: MrDmitry 4.4.2014, 23:35
Цитата(Poseidon @ 4.4.2014,  21:38)
Цитата(MrDmitry @  4.4.2014,  16:07 Найти цитируемый пост)
Вы не поняли что я хочу.
Я понял что ты хочешь. Еще я вижу что ты уже написал. Даже если допустить, что я не разобрался, тогда объясни мне что делает с твоем коде list?

Код

procedure TForm1.ComboBoxKeyPress(Sender: TObject; var Key: Char);
var
  i: Integer;
  Found: Boolean;
begin
  Found := False;
  for i := 0 to ComboBox.Items.Count-1 do
    if ComboBox.Items[i].StartsWith(ComboBox.Text + Key) then
      begin
        Found := True;
        Break;
      end;

  if not Found then
    Key := #0;
end;

Только не забудь предусмотреть дополнительную обработку нужных клавиш (BackSpace и т.п.)

У меня была не удачная реализация )) По моей логике должно было происходить так. 
В list заносятся все значения от комбобокса в которых нашлись совпадения с введенной стройкой, соответственно если list не пустой, то продолжаем ввод, если пустой, то затираем  последний введенный символ(не позволяем вводить новый) но вот логика компилятора(да и вообще логика) со мной не согласились ))

Ваш код работает, но наверное после того как я его не много переделал под себя появился не больший глюк, 1 символ вводится нормально, а во последующие приходится вводить 2 раза. Например я ввел "П" потом ввожу"р" и ни чего, ввожу еще раз "р" вводится.

Код

Function Tmain.FilterComboList(Combo: TComboBox; Key: Char):boolean;
 var
  i: Integer;
begin
 result := False;

  for i := 0 to Combo.Items.Count-1 do
    if Combo.Items[i].StartsWith(Combo.Text + Key) then
      begin
        result := True;
        Break;
      end;
 end;


вызов

Код

procedure Taddclient.installmentKeyPress(Sender: TObject; var Key: Char);
begin
if not FilterComboList(installment, Key) then
 Key := #0;
end;

Автор: Poseidon 5.4.2014, 01:41
Цитата(MrDmitry @  4.4.2014,  23:35 Найти цитируемый пост)
Ваш код работает, но наверное после того как я его не много переделал под себя появился не больший глюк
Почему у меня чувство, что я должен буду написать весь проект? А самому подумать? Отладчиком пройтись? Тут же 5 строк кода.

Код

function TForm1.FilterComboList(Combo: TComboBox; Key: Char): boolean;
 var
  i: Integer;
  Text: string;
begin
  Text := Combo.Text;

 result := False;
  for i := 0 to Combo.Items.Count-1 do
    if Combo.Items[i].StartsWith(Text.Remove(Combo.SelStart) + Key) then
      begin
        result := True;
        Break;
      end;
 end;

Автор: MrDmitry 5.4.2014, 03:46
Цитата(Poseidon @ 5.4.2014,  01:41)
Цитата(MrDmitry @  4.4.2014,  23:35 Найти цитируемый пост)
Ваш код работает, но наверное после того как я его не много переделал под себя появился не больший глюк
Почему у меня чувство, что я должен буду написать весь проект? А самому подумать? Отладчиком пройтись? Тут же 5 строк кода.

Код

function TForm1.FilterComboList(Combo: TComboBox; Key: Char): boolean;
 var
  i: Integer;
  Text: string;
begin
  Text := Combo.Text;

 result := False;
  for i := 0 to Combo.Items.Count-1 do
    if Combo.Items[i].StartsWith(Text.Remove(Combo.SelStart) + Key) then
      begin
        result := True;
        Break;
      end;
 end;

Чувства вас подвели )
Спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)