Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 04:30   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию По какой причине сообщение вылетает 2 раза

Здравствуйте.
Процедура отслеживает ввод символов в эдит и если они отличны от цифр или запятой то убирает их.
если ввести 11й - работает нормально й исчезает
если ввести й - работает нормально й исчезает
если ввести 11й - й исчезает появляется окно сообщения о ошибке и курсор кидается в начале эдита и 11 остаются после него и вот если в таком положении ввести букву то собщение об ошибке вылетает 2 раза((
Код:
Procedure ZashitaOtDurna(s:string);
var
   i:Byte;
begin
   for i := 1 to Length(s) do
      if ((ord(s[i])<47)or(ord(s[i])>57))and(ord(s[i])<>44) then
         begin
            Delete(s,i,1);
            FormNedvigimostAdd.All.Text:=s;
            messagedlg('В данное поле вводятся только цифры, для отделения дробной части используйте запятую',mtwarning,[mbOK],3);
         end;
end;
procedure TFormNedvigimostAdd.AllChange(Sender: TObject);
begin
   ZashitaOtDurna(All.Text);
end;
Lokos вне форума Ответить с цитированием
Старый 11.03.2011, 04:49   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)потому что если строку изменяете то цикл for недопустим
2)может просто стоит использовать ONKeyPress?
там можно сделать так что неверная клавиша вообще непропустится.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2011, 04:58   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Переделал вот так
Код:
procedure TFormNedvigimostAdd.AllKeyPress(Sender: TObject; var Key: Char);
var
   s:string;
begin
   s:=All.Text;
    if ((ord(Key)<47)or(ord(Key)>57))and(ord(Key)<>44) then
         begin
            Delete(s,Pos(Key,s),1);
            FormNedvigimostAdd.All.Text:=s;
            messagedlg('В данное поле вводятся только цифры, для отделения дробной части используйте запятую',mtwarning,[mbOK],3);
         end;
end;
не удаляется вообще
Lokos вне форума Ответить с цитированием
Старый 11.03.2011, 05:36   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

а зачем удалять, так разве нельзя?
Код:
procedure TFormNedvigimostAdd.AllKeyPress(Sender: TObject; var Key: Char);
var
   s:string;
begin
   s:=All.Text;
    if ((ord(Key)<47)or(ord(Key)>57))and(ord(Key)<>44) then
         begin
            Key := '';
            FormNedvigimostAdd.All.Text:=s;
            messagedlg('В данное поле вводятся только цифры, для отделения дробной части используйте запятую',mtwarning,[mbOK],3);
         end;
end;
в смысле если нажата не та клавиш то присвоить ее значение в 0
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 11.03.2011, 05:49   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
а зачем удалять, так разве нельзя?
Код:
procedure TFormNedvigimostAdd.AllKeyPress(Sender: TObject; var Key: Char);
var
   s:string;
begin
   s:=All.Text;
    if ((ord(Key)<47)or(ord(Key)>57))and(ord(Key)<>44) then
         begin
            Key := '';
            FormNedvigimostAdd.All.Text:=s;
            messagedlg('В данное поле вводятся только цифры, для отделения дробной части используйте запятую',mtwarning,[mbOK],3);
         end;
end;
в смысле если нажата не та клавиш то присвоить ее значение в 0
нельзя сделать
Код:
Key:='';
несовпадение типов Char и String
Lokos вне форума Ответить с цитированием
Старый 11.03.2011, 08:36   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
нельзя сделать

Код:
Key:='';
но можно сделать
Код:
key:=#0; или key:=0; // нулевой символ
что также означает отсутствие ввода
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.03.2011, 10:00   #7
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Код:
Key:=PChar('');
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 11.03.2011, 10:07   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ArtGrek, нужно именно Key:=#0
PChar это указатель, а присваивать указатель символу по меньшей мере странно
тем более символ, может быть нулем, но ничем он быть не может(так же как в integer '' не присвоишь, какое то, но значение там будет)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2011, 14:59   #9
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Цитата:
Процедура отслеживает ввод символов в эдит и если они отличны от цифр или запятой то убирает их.
Я в своей проге на компонет Edit ставил подобную "защиту". Делал свою процедуру sign (Edit'ов у меня было много):

Код:
procedure TForm1.sign(p:string; var key:char);
begin
 case key of
  '0'..'9', #8: key:=key;
  ',','.': begin
            if pos(decimalseparator,p)<>0 then key:=char(0)
            else key:=decimalseparator;
           end
 else key:=chr(0);
 end;
end;
Она допускает ввод цифр, backspace'а (#8); ввод запятой возможен только один раз (благодаря процедуре Pos); кроме того, вместо конкретного разделителя ("." или ",") используется глобальная переменная decimalseparator (она и хранит нужный знак, принятый в настройках Windows). А если символ отличается, то в Edit ничего не выводится.

Далее запихиваем процедуру в обработчик события OnKeyPress для нужного Edit'а:

Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 sign(edit1.text, key);
end;
Программирую по необходимости

Последний раз редактировалось tsar_; 11.03.2011 в 15:19.
tsar_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать на какой UIN пришло сообщение TICQClient m0dE^ Работа с сетью в Delphi 4 14.02.2011 15:36
надо разобраться в причине проблемы AndreyOrico Безопасность, Шифрование 0 11.02.2011 10:53
Повысить громкость раза в 3. Alex Cones Софт 7 23.10.2009 04:13
Попал какой то вирус adsubscribe вылетает каждые 10 минут в центре экрана реклама leonidka Операционные системы общие вопросы 8 16.07.2009 20:33
Загружается со второго раза Xardas Компьютерное железо 10 10.03.2008 08:51