| 
| 
 | Вопрос # 1 540/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Подскажите как мне можно выполнить такие действия:
 на форме есть несколько элементов эдит мне нужно провверить значение введенное в эти элементы и если есть ошибка (несоответствие условию) то выдать сообщение об этом и передать фокус в соответствующий элемент эдит. спасибо
 
|  |   Вопрос задал: sirakuz (статус: Посетитель)Вопрос отправлен: 1 мая 2008, 15:35
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, sirakuz!Ну так в чём проблема?
 "Поставить курсор" в нужный компонент это "компонент.SetFocus;"
 Выдать сообщение - ShowMessage('Сообщение');
 Проверить данные - ну это интересная задача. Для начала нужно знать формат данных, знать, что правильно, а что нет.
 например, контролировать длину
 
 if length(edit1.text)<5 then ...Если надо убедиться, что в эдит введено целове число, то пользуемся такой конструкцией 
 var x:integer;
begin
...
if not TryStrToInt(Edit1.text, x) then 
begin
Showmessage('Не целое число');
exit;
end;кстати, в x будет результат преобразования. Также есть функция TryStrToFloatВ некоторых ситуациях лучше использовать try except - тоесть пробовать сделать преобразование и если не получиться - обработать ситуацию.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 1 мая 2008, 16:07
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо за ответ. Я начинаю только программировать и ваши коментарии очень кстати. Очень вам признателен :-) |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 1 мая 2008, 20:24; участников в обсуждении: 2. 
|   | sirakuz (статус: Посетитель), 1 мая 2008, 16:52 [#1]:В тех эдитах вводятся целые и действительные числа. Меня еще интересует как мне производить математические операции с данными числами не в обработчике событий кнопки, а на лету (по ходу введения даных) чтобы сразу же отображать их в лабэле. при компиляции выдало:
 
 [Ошибка] Unit1.pas (60): Существует не перегружены Версия 'TryStrToFloat ", которые могут быть вызваны с этими аргументами
 что это значит?
 |  
|   | Вадим К (статус: Академик), 1 мая 2008, 17:18 [#2]:производить налету? можно. надо лишь воспользоваться обработчиком OnChange. Он вызывается каждый раз при изменение содержимого едита. Так как едитов много и обработчики у них одинаковы, то можно создать только для одного, а к другим "подвязать". Это просто - выделяем нужный элемент, переходим в инспектор объектов на вкладку Events к нужному событию, выбираем его и там появиться выпадающий список. Там выбираем нужное событие. Естественно, вы захотите узнать, какой из едитов вызвал событие в данный момент. Это тоже просто. просто обращайтесь к нему так TEdit(Sender) вместо Edit1. То есть, узнать содержимое - TEdit(Sender).text
 
 по поводу ошибки компилятора.
 у вас руссифицированная версия? выкиньте пока не позно.
 
 Функция 'TryStrToFloat есть перегруженной - то есть имеет несколько сигнатур (форматов входных данных). Компилятор просто не смог выбрать нужный. приведите вашу 60 строку и обявление параметров, а лучше всю функцию, посмотрим.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | sirakuz (статус: Посетитель), 1 мая 2008, 17:53 [#3]:нет это я так неправильно вгугле перевел версия английская 7, ошибка была такая:
 [Error] Unit1.pas(60): There is no overloaded version of 'TryStrToFloat' that can be called with these arguments
 
 procedure TForm1.Button1Click(Sender: TObject);
 var  depo: real;
 begin
 if not TryStrToFloat(Edit1.text, depo) then
 begin
 Showmessage(' введено не действительное число');
 exit;
 end;
 |  
|   | sirakuz (статус: Посетитель), 1 мая 2008, 18:27 [#4]:обьявил переменные как глобальные и все начало работать: var depo :real;
 procedure TForm1.Edit1Change(Sender: TObject);
 begin
 
 if not TryStrToInt(Edit1.text, depo) then
 begin
 Showmessage('не действительное число ');
 exit;
 end;
 depo := StrToInt(Edit1.text);
 if depo <= 0 then
 begin
 Showmessage('введите число больше  0');
 exit;
 TEdit(Sender).SetFocus;
 end;
 end;
 одно не нравится если исправляешь - выделил и ввел другое число все ОК, но если нажал бекспейс то ошибка выскакивает повторно до того как ввел значения, но с этим, в принципе, можно миерится
 |  
|   | sirakuz (статус: Посетитель), 1 мая 2008, 18:35 [#5]:извините за бардак но увидел что TryStrToInt(Edit1.text, depo)
 работает, а
 TryStrToFloat(Edit1.text, depo)
 вызывает ту же ошибку
 |  
|   | Вадим К (статус: Академик), 1 мая 2008, 18:56 [#6]:Странно, что с глобальными переменными заработало но и глобальные переменные - это не слишком хорошо. Странно и то, как оно скомпилировалось. функция TryStrToInt в качестве второго параметра требует var параметр целого типа. а вы ему подсовываете вещественное. Дале по тексту я вижу, что вы хотите вещиственное. Тогда может применитьTryStrToFloat? Только вместо real используйте Extended, Double или Single. Это тоже типы вещественного типа и отличаются точностью. Для обычных расчётов Single будет достаточно. Эти типы ещё хороши тем, что они соответствуют стандартам. и бинарно совместимы с типами в других языках.
 
 Теперь по поводу последнего. Это тоже легко лечиться
  наиболее оптимально так 
 if trim(Edit1.text)='' then ShowMessage('едит пуст или содержит пробелы')замечу, там две одинарные кавычки, а не одна двойная. и между ними нет пробела.функция trim обрезает пробелы вначале и в конце строки.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | sirakuz (статус: Посетитель), 1 мая 2008, 20:02 [#7]:глобальные переменныеубрал все работает вот только не знаю как показать в лабеле первые 6 знаков ответа  floatToStr(z) округливал так
 z:=round(z*100+0.5)/100;
 и мне выдает 15-20 значущих цифр
 |  
|   | sirakuz (статус: Посетитель), 1 мая 2008, 20:24 [#9]:выкрутился: procedure TForm1.Button2Click(Sender: TObject);
 var s :string;
 x :Single;
 a:string;
 begin
 x:= 5*x;
 x:=round(x*100+0.5)/100;
 s:= floatToStr (x);
 delete(s,6,length(s)) ;
 Label16.Caption:= s ;
 
 ОГРОМНОЕ спасибо Вадиму К.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |