Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> combobox запрет редактирования 
:(
    Опции темы
MrDmitry
Дата 4.4.2014, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Помогите написать процедурку которая бы проверяла текст введенный в комбобкс и если у комбобкс.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;


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

Это сообщение отредактировал(а) MrDmitry - 4.4.2014, 14:42
PM MAIL   Вверх
Poseidon
Дата 4.4.2014, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MrDmitry
Дата 4.4.2014, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



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

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

Код

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


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

Это сообщение отредактировал(а) MrDmitry - 4.4.2014, 16:10
PM MAIL   Вверх
Poseidon
Дата 4.4.2014, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(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 и т.п.)

Это сообщение отредактировал(а) Poseidon - 4.4.2014, 21:47


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MrDmitry
Дата 4.4.2014, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(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;

PM MAIL   Вверх
Poseidon
Дата 5.4.2014, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(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;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MrDmitry
Дата 5.4.2014, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Цитата(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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.