Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 540

/ вопрос открыт /

Здравствуйте, эксперты!
Подскажите как мне можно выполнить такие действия:
на форме есть несколько элементов эдит мне нужно провверить значение введенное в эти элементы и если есть ошибка (несоответствие условию) то выдать сообщение об этом и передать фокус в соответствующий элемент эдит. спасибо

sirakuz Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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

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

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

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

sirakuz (статус: Посетитель), 1 мая 2008, 20:02 [#7]:

глобальные переменныеубрал все работает вот только не знаю как показать в лабеле первые 6 знаков ответа floatToStr(z)
округливал так
z:=round(z*100+0.5)/100;
и мне выдает 15-20 значущих цифр
Вадим К

Вадим К (статус: Академик), 1 мая 2008, 20:15 [#8]:

посмотрите на это http://www.delphisources.ru/pages/faq/faq_delphi_basics/FormatFloat.php.html
Галочка "подтверждения прочтения" - вселенское зло.
sirakuz

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 ;

ОГРОМНОЕ спасибо Вадиму К.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 марта 2023, 17:35
Выполнено за 0.02 сек.
Рейтинг@Mail.ru