Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Глобальная переменная DecimalSeparator↑ ⇐ ПредыдущаяСтр 7 из 7 Содержание книги Поиск на нашем сайте
Это неявная глобальная переменная. Неявная, потому что вы ее нигде не описывали, и в коде модуля ее нет. Однако Delphi самостоятельно создает эту и некоторые другие глобальные переменные для каждого нового проекта, так что вы спокойно можете ей пользоваться. Что это за переменная? Она хранит один символ – разделитель между целой и десятичной частью вещественного числа. И разделителем может быть либо точка, либо запятая. В русских версиях Windows чаще всего используется запятая, хотя можно перенастроить операционную систему так, что будет точка. А вот в английских ОС – точка. Если вы делаете программу только для личного использования, то смело можете устраивать проверку на ввод вещественных чисел, и в качестве разделителя указывать запятую. Но если вы делаете программу для клиента, то не можете быть уверены, какой разделитель там стоит. Ведь он может использовать вашу программу и на английской версии Windows! Тогда программа будет выдавать ошибку сразу, как дело дойдет до ввода вещественного числа. Выход: во время проверки использовать не запятую или точку, а глобальную переменную DecimalSeparator, которая хранит нужный разделитель. Создайте новый проект, и установите на него компонент Edit для ввода вещественного числа. Ниже киньте Memo, сюда мы будем выводить это число, отформатированное разными способами с помощью FormatFloat(). Еще ниже – кнопку для того, чтобы начать заполнять Memo. Первым делом мы с вами установим «защиту от дураков» - проверку компонента Edit, чтобы пользователь не смог ввести туда ничего, кроме целого или вещественного числа. При этом мы будем в качестве разделителя использовать переменную DecimalSeparator, и кроме того, проверим, чтобы она не встречалась более одного раза. Затем эту же проверку без изменений вы сможете применять в любых последующих ваших проектах, где потребуется необходимая проверка. Для Edit1 создаем обработчик события OnKeyPress, которое вызывается всякий раз, когда пользователь нажимает любую клавишу при вводе текста в компонент Edit. Впишем в тело обработчика следующий код: case Key of '0'..'9':; //числа разрешаем //если разделителя еще нет - выводим правильный разделитель, //иначе ничего не выводим ',', '.': if Pos(DecimalSeparator, Edit1.Text)= 0 then Key:= DecimalSeparator else Key:= Chr(0); #8:; //backspace //разрешаем отрицательное число, если минус идет первым символом '-': if (Pos('-', Edit1.Text) = 1) and (Length(Edit1.Text) >0) then Key:= Chr(0); #13: Button1.SetFocus; else Key:= Chr(0); end; //case Этот код требует некоторых пояснений. Событие OnKeyPress компонента Edit самостоятельно создает параметр Key, это переменная типа Char, то есть, символ. В этой переменной содержится символ, введенный пользователем. Поскольку символ – перечисляемое значение (то есть, он может быть от 0 до 255), можно использовать конструкцию case. В качестве селектора указываем переменную Key, а в качестве значения указываем то значение, которое там может находиться. Строка '0'..'9':; //числа разрешаем показывает, что если были введены символы от 0 до 9, то ничего не происходит (после знака «:» нет действующих операторов). Здесь мы можем извлечь новое правило: можно показывать диапазон числовых или символьных значений через знак «..», например, ‘a’..’z’; 1..9. Далее идут строки: ',', '.': if Pos(DecimalSeparator, Edit1.Text)= 0 then Key:= DecimalSeparator else Key:= Chr(0); Этот код дает нам новое правило: через запятую можно указать возможные значения. То есть, блок кода будет выполняться, если пользователь ввел либо запятую, либо точку. В самом блоке кода мы проверяем: нет ли уже в строке нужного разделителя? Если нет (Pos() вернула ноль), то мы записываем в переменную Key нужный разделитель, иначе присваиваем ей нулевой символ (то есть пользователь ничего не ввел). При этом неважно, точку или запятую ввел пользователь – разделитель все равно будет правильным. Далее, если пользователь ввел символ #8 (нажал), то ничего не делаем – то есть, разрешаем этот символ. Надо же оставить ему возможность редактировать свой текст, исправлять ошибки. И снова правило: можно указать номер символа, используя функцию Chr(), либо просто после символа «#»: Key:= Chr(8); Key:= #8; В обоих случаях, в переменную Key попадет символ, который в таблице символов идет под номером 8, то есть. Далее мы смотрим, не минус ли ввел пользователь? Если да, то смотрим, какова длина строки. Ведь если длина строки больше нуля, значит, в ней уже есть символы, и минус разрешать нельзя. В случае же, если строка еще не содержит ничего, то минус допустим, и блок кода if не выполнится. Если пользователь нажал, Key будет содержать символ #13. Обычно пользователь нажимает, когда он закончил ввод текста. Строка #13: Button1.SetFocus; передает фокус (то есть, выделение компонента) на кнопку, если нажата клавиша. Ну и в конце мы указываем, что в любом другом случае (пользователь набрал букву или какой либо другой недопустимый знак) переменной Key присваивается нулевой символ. Компьютер отреагирует так, будто пользователь ничего и не вводил. В процедуре нажатия кнопки пишем такой код: var f: Real; Begin f:= StrToFloat(Edit1.Text); Memo1.Lines.Add(FormatFloat('', f)); Memo1.Lines.Add(FormatFloat('0,000.00', f)); Memo1.Lines.Add(FormatFloat('#,###.##', f)); Memo1.Lines.Add(FormatFloat('#.##', f)); Memo1.Lines.Add(FormatFloat('0.00', f)); Memo1.Lines.Add('---------------'); //разделитель end; Тут все понятно – сначала преобразуем полученное число в виде строки, в вещественное число. Затем это число выведем в Memo, придав ему различные форматы. Сохраните пример, скомпилируйте его и посмотрите, как работает программа. В дальнейшей практике вам не раз придется ставить подобную «защиту от дураков», данный пример события OnKeyPress можно будет просто копировать в любую новую программу.
|
||||
Последнее изменение этой страницы: 2017-01-20; просмотров: 170; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.239.70 (0.006 с.) |