![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 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; просмотров: 146; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.243.30 (0.007 с.) |