DecimalSeparator — Переменная Delphi

Клуб программистов

Delphi programming

Подписаться на рассылку:

DecimalSeparator

Символ, используемый для отображения разделителя дробной части (точки).

var DecimalSeparator : char;

Описание:

Переменная DecimalSeparator используется в фунциях отображения денежных и вещественных значений.

Значением по умолчанию для DecimalSeparator является ‘.’, в зависимости от локальных настоек Windows.

Пример кода:

var
amount : Currency;
begin
amount := 12.34; // 12 pounds 34 pence

// Display with the default decimal point character
ShowMessage(‘Amount = ‘+FloatToStrF(amount, ffCurrency, 10, 2));

// Display with a new decimal point character
DecimalSeparator := ‘|’;
ShowMessage(‘Amount = ‘+FloatToStrF(amount, ffCurrency, 10, 2));
end;

SysUtils и DecimalSeparator в XE5

*******,Если написать «SysUtils.» в выпадающем списке переменная видна?

Deprecated не запрещает использования.

приложение в x64, если оно использует 32-разрядные сторонние компоненты?

Сейчас мне нужно перекомилить все это счастье в x64.

На кой? 32-битные приложения отлично работают на х64.

не могу проверить, вдруг это оно?

На кой? 32-битные приложения отлично работают на х64.

This capability (Server Core installation) appeared in Windows Server 2008. Yet in Windows Server 2008 R2 there is another innovation that brings closer the 64-bit future.Support of 32-bit applications is now optional and you may enable or disable it when installing Windows Server 2008 R2 (Server Core). Moreover, this option is disabled by default. So when trying to launch a 32-bit application in Server Core mode, you will get a message telling you that it is impossible. Of course you may add 32-bit application support:start /w ocsetup ServerCore-WOW64In the usual (Full Installation) mode, execution of 32-bit applications is enabled by default, but not in Server Core.

DecimalSeparator — Переменная Delphi

Здравствуйте, F1aSh, Вы писали:

FS>Региональные настройки винды могут быть у всех разные. Например разделитель дробной части — в Дельфях установить этот разделитель — изменить глобальную переменную DecimalSeparator, например так:
FS>
FS>Как это же сделать в билдере?

От: F1aSh
Дата: 27.05.06 19:16
Оценка:

Региональные настройки винды могут быть у всех разные. Например разделитель дробной части — в Дельфях установить этот разделитель — изменить глобальную переменную DecimalSeparator, например так:

Как это же сделать в билдере?

От: Horatio
Дата: 28.05.06 09:22
Оценка:

Здравствуйте, F1aSh, Вы писали:

FS>Региональные настройки винды могут быть у всех разные. Например разделитель дробной части — в Дельфях установить этот разделитель — изменить глобальную переменную DecimalSeparator, например так:
FS>
FS>Как это же сделать в билдере?

Невижу смысла подобной смены настроек. Помоему проще позволить пользователю использовать разделитель дробной части по его собственному усмотрению — поверь твой код это не сильно утяжелит. Или это просто личные престрастия?

От: Flamer http://users.livejournal.com/_flamer_/
Дата: 28.05.06 09:43
Оценка:

Здравствуйте, Anton Batenev, Вы писали:

AB>Ты не поверишь:

AB>

Блин, хотел написать такой-же ответ, с точностью до знака

От: Аноним
Дата: 28.05.06 12:03
Оценка:

AB>Ты не поверишь:

AB>

Type name expexted

windows.h подключил. А где же эта переменная лежит то? Я думал что она всегда видна.
Ламер я

От: Anton Batenev https://github.com/abbat
Дата: 28.05.06 13:05
Оценка:

Здравствуйте, , Вы писали:

AB>>Ты не поверишь:
AB>>
А>Type name expexted
А>windows.h подключил. А где же эта переменная лежит то? Я думал что она всегда видна.
А>Ламер я

Вероятно, в sysutils.hpp.

От: alex_mah www.elsy.ru
Дата: 29.05.06 10:57
Оценка:

Здравствуйте, F1aSh, Вы писали:

FS>Региональные настройки винды могут быть у всех разные. Например разделитель дробной части — в Дельфях установить этот разделитель — изменить глобальную переменную DecimalSeparator, например так:
FS>
FS>Как это же сделать в билдере?

Использовать в тексте программы именно DecimalSeparator, а не ‘,’ Программы пишутся для пользователя, а не пользователь подгоняется под программу.

От: Аноним
Дата: 29.05.06 14:36
Оценка:

А>А где же эта переменная лежит то? Я думал что она всегда видна.

Тут три варианта справиться самому.

1) делаешь модуль на паскале, в котором меняешь переменную. По умолчанию в Паскале она как раз «всегда видна»

2) www.gExperts.org — делаешь поиск (grep) этой переменной по *.h, *.hpp — и находишь где она объявлена

3) Просто нажимаешь F1. Открывается окно Справки, в которой описывается переменная, в т.ч. в каком модуле онa объявлена

От: F1aSh
Дата: 29.05.06 16:21
Оценка:

AB>Вероятно, в sysutils.hpp.

#include
опять тайп нейм экспектед, хотя DelimalSeparator там описан (в sysutils). Ну, думаю — чего делать? Отключил sysutils.hpp (закомментил инклюд), описал

Так он мне сказал что это переопределение DecimalSeparator. (Ambiguity between ‘DecimalSeparator’ and ‘Susutils::DecimalSeparator’). Включаю не работает, выключаю — не работает, прописываю экстерн — не работает.

К стати, тут вопрос был — зачем это мне. Ну, блин, интересно как в билдере сделать. На самом деле применение этой переменной можно найти. Ну так чтобы найти применение, надо как то её выдрать и / или модифицировать (а откуда?).

От: F1aSh
Дата: 29.05.06 16:26
Оценка:

_>Использовать в тексте программы именно DecimalSeparator, а не ‘,’ Программы пишутся для пользователя, а не пользователь подгоняется под программу.

Если я позволю и то и то использовать произойдет несовпадение с грамматикой (она у меня задает вид числа с фиксированной точкой. в смысле запятой)

Хотя можно описать
G->A,B | A.B

но мне прийдется анализатор переделывать, чем сейчас я очень не хочу заниматься Тем более писал его не я.

От: Anton Batenev https://github.com/abbat
Дата: 29.05.06 19:30
Оценка:

Здравствуйте, F1aSh, Вы писали:

AB>>Вероятно, в sysutils.hpp.
FS>#include
FS>опять тайп нейм экспектед, хотя DelimalSeparator там описан (в sysutils). Ну, думаю — чего делать? Отключил sysutils.hpp (закомментил инклюд), описал

[skip]

FS>Кто в курсе?

Слушай, ты чего там творишь? Если создать пустой Win32 Application проект, то все требуемые инклуды и либы там подключены по умолчанию для того, чтобы эту переменную можно было использовать.

От: -Вячеслав-
Дата: 12.06.06 13:00
Оценка:

Здравствуйте, F1aSh, Вы писали:

_>>Использовать в тексте программы именно DecimalSeparator, а не ‘,’ Программы пишутся для пользователя, а не пользователь подгоняется под программу.

FS>Если я позволю и то и то использовать произойдет несовпадение с грамматикой (она у меня задает вид числа с фиксированной точкой. в смысле запятой)

Полностью поддерживаю вариант использования «своих» привычных форматов внутри свой же программы.

(я достаточно натрахался с поддержной программ Made in . когда программисты и не задумываются о том, что есть еще страны кроме их страны проживания/работы, соответственно такие программы корректно работают только при определенных настройках в Regional settings.)

Из дельных советов:

Пред установкой «своих» региональный установок обязательно установи

иначе гарантированы проблемы при запуске из автозагрузки, а также при длительной работе программы (в течении часов, дней, месяцев), т.к. windows все равно когда нибудь пришлет сообщение WM_WININICHANGE

DecimalSeparator в SysUtils и System.SysUtils

Мне нужно найти DecimalSeparator var SysUtils Delphi 7, в Delphi XE6 я попытался найти в System.SysUtils, но безуспешно. Кто-то может сказать мне, где ее найти в Delphi XE6?

Илон Маск рекомендует:  Rookee и оптимизация поведенческих факторов - новое в SEO

В Delphi 7 он находится в блоке SysUtils.pas, в строке 618:

Мне нужна эта переменная для преобразования компонента Delphi 7 в XE6

delphi vcl components

2 ответа

17 Решение Linces Marques [2014-08-04 01:09:00]

Мне плохо, сначала мне нужно было вызвать FormatSettings, а затем я могу использовать в DecimalSeparator в Delphi XE6,

How to change decimal separator for numeric key in my Delphi application?

In my country the decimal separator is «,«. One of my clients would like to have it as a «.» character. What should I do to change decimal separator to «.«?

But this code helps only partialy. I see the «.» in gird in float fields. However, when user press on numeric keybord a «.» key, the comma is send despite the settings. This is problem not related to the grid, I’ve checked this on KeyPress event on the form.

I am using Delphi 2007, thanks for your help.

2 Answers 2

First of all, you should set UpdateFormatSettings to false ! If this property is true, the DecimalSeparator will be reset to the Windows default one every now and then (for instance, every time you lock the workstation (using Win+L) and then unlock it again). The default value is true , so you need to set it to false when you want to override DecimalSeparator .

Secondly, the DecimalSeparator is used by Delphi routines when formatting floating-point numbers as strings (e.g. when using FloatToStr or FormatFloat ). To make the decimal separator key on the numeric keypad result in a point ( . ) and not the OS default character (which is probably either . or , ), you can handle the OnKeyPress event:

But be cautious — this will replace all , with . , even those inserted by the comma key on the alphabetical part of the keyboard.

A more advanced (and safer) method is to handle the OnKeyDown event like this:

Преобразования типов

Другие преобразования

Иногда, чтобы преобразовать один тип данных в другой, достаточно указать этот тип:

В других случаях, схожие типы данных можно просто присваивать друг другу. Компилятор в этом случае сам произведет нужное преобразование. Например, целый тип данных можно присвоить вещественному числу, компилятор сам подставит ноль. А вот наоборот не получится, ведь вещественное число рассматривается, как два целых числа:

Подстановка значений

Очень часто в языках программирования для элегантности кода подставляют одно значение вместо другого. Сравните два примера:

Все, что мы сделали в данном примере, так это присвоили переменной i число из Edit1 , которое хранилось там в виде строки. Но для этого нам пришлось вначале занести эту строку в строковую переменную s , и уже ее обрабатывать функцией StrToInt() . Такой пример вполне будет работать, однако он слишком громоздок. Гораздо элегантнее выглядит следующий код:

В результате получилось меньше переменных, меньше работы для процессора, меньше занимаемой памяти и короче код! А нередко употребляют гораздо более сложные выражения, например:

В первой строке в целую переменную i мы вывели сумму целых чисел, которые хранились в виде строки в Edit1 и в пятой строке Memo1 .

Вторая строка сложнее. Здесь мы вначале перевели эти же числа в целые числа и суммировали их, затем вновь преобразовали в строку, чтобы записать сумму этих двух чисел в строковую переменную s . Поначалу вам такой код может показаться очень сложным, но попробуйте применять такой подход в своих программах, и вы быстро к нему привыкнете, и сами заметите, что такой код более компактен и элегантен. Возьмите вторую строку. Такой же результат можно было бы добиться упрощенными выражениями:

Все это будет работать, и на первый взгляд, кажется проще. Однако, четыре строки вместо одной! И четыре переменных вместо одной! Любой программист назовет такой код безобразным и дилетантским. Так что привыкайте к хорошему и компактному коду!

Глобальная переменная DecimalSeparator

Это неявная глобальная переменная . Неявная, потому что вы ее нигде не описывали, и в коде модуля ее нет. Однако Delphi самостоятельно создает эту и некоторые другие глобальные переменные для каждого нового проекта, так что вы спокойно можете ей пользоваться.

Что это за переменная ? Она хранит один символ – разделитель между целой и десятичной частью вещественного числа. И разделителем может быть либо точка, либо запятая. В русских версиях Windows чаще всего используется запятая, хотя можно перенастроить операционную систему так, что будет точка. А вот в английских ОС – точка. Если вы делаете программу только для личного использования, то смело можете устраивать проверку на ввод вещественных чисел, и в качестве разделителя указывать запятую. Но если вы делаете программу для клиента, то не можете быть уверены, какой разделитель там стоит. Ведь он может использовать вашу программу и на английской версии Windows ! Тогда программа будет выдавать ошибку сразу, как дело дойдет до ввода вещественного числа.

Выход : во время проверки использовать не запятую или точку, а глобальную переменную DecimalSeparator , которая хранит нужный разделитель.

Создайте новый проект, и установите на него компонент Edit для ввода вещественного числа. Ниже поместите Memo , сюда мы будем выводить это число, отформатированное разными способами с помощью FormatFloat() . Еще ниже – кнопку для того, чтобы начать заполнять Memo . Первым делом мы с вами установим «защиту от дураков» — проверку компонента Edit , чтобы пользователь не смог ввести туда ничего, кроме целого или вещественного числа. При этом мы будем в качестве разделителя использовать переменную DecimalSeparator , и кроме того, проверим, чтобы она не встречалась более одного раза. Затем эту же проверку без изменений вы сможете применять в любых последующих ваших проектах, где потребуется необходимая проверка. Для Edit1 создаем обработчик события OnKeyPress , которое вызывается всякий раз, когда пользователь нажимает любую клавишу при вводе текста в компонент Edit . Впишем следующий код:

Этот код требует некоторых пояснений. Событие OnKeyPress компонента Edit самостоятельно создает параметр Key , это переменная типа Char , то есть, символ. В этой переменной содержится символ, введенный пользователем. Поскольку символ – перечисляемое значение (то есть, он может быть от 0 до 255), можно использовать конструкцию case . В качестве селектора указываем переменную Key , а в качестве значения указываем то значение , которое там может находиться. Строка

показывает, что если были введены символы от 0 до 9, то ничего не происходит (после знака «:» нет действующих операторов). Здесь мы можем извлечь новое правило: можно показывать диапазон числовых или символьных значений через знак «..», например, ‘a’..’z’; 1..9. Далее идут строки:

Этот код дает нам новое правило: через запятую можно указать возможные значения. То есть, блок кода будет выполняться, если пользователь ввел либо запятую, либо точку. В самом блоке кода мы проверяем: нет ли уже в строке нужного разделителя? Если нет ( Pos() вернула ноль), то мы записываем в переменную Key нужный разделитель, иначе присваиваем ей нулевой символ (то есть пользователь ничего не ввел). При этом неважно, точку или запятую ввел пользователь – разделитель все равно будет правильным.

Далее, если пользователь ввел символ #8 (нажал ), то ничего не делаем – то есть, разрешаем этот символ. Надо же оставить ему возможность редактировать свой текст, исправлять ошибки. И снова правило: можно указать номер символа, используя функцию Chr() , либо просто после символа «#»:

Илон Маск рекомендует:  Что такое код fbsql_list_dbs

В обоих случаях, в переменную Key попадет символ, который в таблице символов идет под номером 8.

Далее мы смотрим, не минус ли ввел пользователь ? Если да, то смотрим, какова длина строки. Ведь если длина строки больше нуля, значит, в ней уже есть символы, и минус разрешать нельзя. В случае же, если строка еще не содержит ничего, то минус допустим, и блок кода if не выполнится.

Если пользователь нажал Enter >, Key будет содержать символ #13. Обычно пользователь нажимает Enter >, когда он закончил ввод текста. Строка

передает фокус (то есть, выделение компонента ) на кнопку, если нажата клавиша Enter >.

Ну и в конце мы указываем, что в любом другом случае ( пользователь набрал букву или какой либо другой недопустимый знак) переменной Key присваивается нулевой символ. Компьютер отреагирует так, будто пользователь ничего и не вводил.

В процедуре нажатия кнопки пишем такой код:

Тут все понятно – сначала преобразуем полученное число в виде строки, в вещественное число . Затем это число выведем в Memo , придав ему различные форматы. Сохраните пример, скомпилируйте его и посмотрите, как работает программа . В дальнейшей практике вам не раз придется ставить подобную «защиту от дураков», данный пример события OnKeyPress можно будет просто копировать в любую программу.

Глобальная переменная DecimalSeparator

Это неявная глобальная переменная. Неявная, потому что вы ее нигде не описывали, и в коде модуля ее нет. Однако Delphi самостоятельно создает эту и некоторые другие глобальные переменные для каждого нового проекта, так что вы спокойно можете ей пользоваться.

Что это за переменная? Она хранит один символ – разделитель между целой и десятичной частью вещественного числа. И разделителем может быть либо точка, либо запятая. В русских версиях Windows чаще всего используется запятая, хотя можно перенастроить операционную систему так, что будет точка. А вот в английских ОС – точка. Если вы делаете программу только для личного использования, то смело можете устраивать проверку на ввод вещественных чисел, и в качестве разделителя указывать запятую. Но если вы делаете программу для клиента, то не можете быть уверены, какой разделитель там стоит. Ведь он может использовать вашу программу и на английской версии Windows! Тогда программа будет выдавать ошибку сразу, как дело дойдет до ввода вещественного числа.

Выход: во время проверки использовать не запятую или точку, а глобальную переменную DecimalSeparator, которая хранит нужный разделитель.

Создайте новый проект, и установите на него компонент Edit для ввода вещественного числа. Ниже киньте Memo, сюда мы будем выводить это число, отформатированное разными способами с помощью FormatFloat(). Еще ниже – кнопку для того, чтобы начать заполнять Memo. Первым делом мы с вами установим «защиту от дураков» — проверку компонента Edit, чтобы пользователь не смог ввести туда ничего, кроме целого или вещественного числа. При этом мы будем в качестве разделителя использовать переменнуюDecimalSeparator, и кроме того, проверим, чтобы она не встречалась более одного раза. Затем эту же проверку без изменений вы сможете применять в любых последующих ваших проектах, где потребуется необходимая проверка. Для Edit1 создаем обработчик события OnKeyPress, которое вызывается всякий раз, когда пользователь нажимает любую клавишу при вводе текста в компонент Edit. Впишем следующий код:

‘0’..’9′: ; //числа разрешаем

//если разделителя еще нет — выводим правильный разделитель,

//иначе ничего не выводим

‘,’ , ‘.’ : if Pos(DecimalSeparator, Edit1.Text)= 0 then

//разрешаем отрицательное число, если минус идет первым символом

‘-‘: if (Pos(‘-‘, Edit1.Text) = 1) and

(Length(Edit1.Text) >0) then Key := Chr(0);

Этот код требует некоторых пояснений. Событие OnKeyPress компонента Edit самостоятельно создает параметр Key, это переменная типа Char, то есть, символ. В этой переменной содержится символ, введенный пользователем. Поскольку символ – перечисляемое значение (то есть, он может быть от 0 до 255), можно использовать конструкцию case. В качестве селектора указываем переменную Key, а в качестве значения указываем то значение, которое там может находиться. Строка

‘0’..’9′: ; //числа разрешаем

показывает, что если были введены символы от 0 до 9, то ничего не происходит (после знака «:» нет действующих операторов). Здесь мы можем извлечь новое правило: можно показывать диапазон числовых или символьных значений через знак «..», например, ‘a’..’z’; 1..9. Далее идут строки:

‘,’ , ‘.’ : if Pos(DecimalSeparator, Edit1.Text)= 0 then

Этот код дает нам новое правило: через запятую можно указать возможные значения. То есть, блок кода будет выполняться, если пользователь ввел либо запятую, либо точку. В самом блоке кода мы проверяем: нет ли уже в строке нужного разделителя? Если нет (Pos() вернула ноль), то мы записываем в переменную Key нужный разделитель, иначе присваиваем ей нулевой символ (то есть пользователь ничего не ввел). При этом неважно, точку или запятую ввел пользователь – разделитель все равно будет правильным.

Далее, если пользователь ввел символ #8 (нажал ), то ничего не делаем – то есть, разрешаем этот символ. Надо же оставить ему возможность редактировать свой текст, исправлять ошибки. И снова правило: можно указать номер символа, используя функцию Chr(), либо просто после символа «#»:

В обоих случаях, в переменную Key попадет символ, который в таблице символов идет под номером 8.

Далее мы смотрим, не минус ли ввел пользователь? Если да, то смотрим, какова длина строки. Ведь если длина строки больше нуля, значит, в ней уже есть символы, и минус разрешать нельзя. В случае же, если строка еще не содержит ничего, то минус допустим, и блок кода if не выполнится.

Если пользователь нажал , Key будет содержать символ #13. Обычно пользователь нажимает , когда он закончил ввод текста. Строка

передает фокус (то есть, выделение компонента) на кнопку, если нажата клавиша .

Ну и в конце мы указываем, что в любом другом случае (пользователь набрал букву или какой либо другой недопустимый знак) переменной Key присваивается нулевой символ. Компьютер отреагирует так, будто пользователь ничего и не вводил.

В процедуре нажатия кнопки пишем такой код:

Тут все понятно – сначала преобразуем полученное число в виде строки, в вещественное число. Затем это число выведем в Memo, придав ему различные форматы. Сохраните пример, скомпилируйте его и посмотрите, как работает программа. В дальнейшей практике вам не раз придется ставить подобную «защиту от дураков», данный пример события OnKeyPress можно будет просто копировать в любую программу.

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

DecimalSeparator — Переменная Delphi

Совсем обычная проблема, которая может появиться, если вы пишете софт для обработки дробных чисел – это то, что в ОС пользователей в качестве разделителя дробной и целой чисел могут быть как ‘.’ так и ‘,’. Поэтому может возникнуть ситуация, когда вы потратили уйму времени, включая бессонные ночи, живя с выключенным сотовым, и выдали наконец-то нагора буржуйскому заказчику готовый проект и тот у него начал ругаться на его родном языке, показывая эрроры, что ему не нравится формат чисел. Чтобы не ударить в грязь лицом, в любом серьезном проекте нужно настроить глобальную переменную DecimalSeparator, явно присвоив ей необходимый разделитель целой и дробной частей. Настройки ОС в вашем проекте не будут учитываться.

Илон Маск рекомендует:  Блочные и строчные элементы

Также, если это необходимо, по ходу работы программы, можно менять разделитель. К примеру, если вы импортируете текстовый файл, а в нем в качестве разделителя используется точка, можно перед импортом файла сменить разделитель, вернув потом его обратно.

Немаловажный аспект в программировании – уметь правильно отдыхать, а если у тебя есть семья, уделять ей должное внимание, дабы не дупустить следующего:

Свойство Application. ДеЦималсепаратор (Excel) Application.DecimalSeparator property (Excel)

Задает или возвращает символ, используемый для десятичного разделителя в виде строки. Sets or returns the character used for the decimal separator as a String. Для чтения и записи. Read/write.

Синтаксис Syntax

Expression. ДеЦималсепаратор expression.DecimalSeparator

выражение: переменная, представляющая объект Application. expression A variable that represents an Application object.

Пример Example

В этом примере показано, как вставить «1 234 567,89» в ячейку a1, а затем изменить системные разделители на дефисы для десятичных разрядов и разделителей тысяч. This example places «1,234,567.89» in cell A1, and then changes the system separators to dashes for the decimals and thousands separators.

Поддержка и обратная связь Support and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Глобальная переменная DecimalSeparator

Это неявная глобальная переменная. Неявная, потому что вы ее нигде не описывали, и в коде модуля ее нет. Однако Delphi самостоятельно создает эту и некоторые другие глобальные переменные для каждого нового проекта, так что вы спокойно можете ей пользоваться.

Что это за переменная? Она хранит один символ – разделитель между целой и десятичной частью вещественного числа. И разделителем может быть либо точка, либо запятая. В русских версиях Windows чаще всего используется запятая, хотя можно перенастроить операционную систему так, что будет точка. А вот в английских ОС – точка. Если вы делаете программу только для личного использования, то смело можете устраивать проверку на ввод вещественных чисел, и в качестве разделителя указывать запятую. Но если вы делаете программу для клиента, то не можете быть уверены, какой разделитель там стоит. Ведь он может использовать вашу программу и на английской версии Windows! Тогда программа будет выдавать ошибку сразу, как дело дойдет до ввода вещественного числа.

Выход: во время проверки использовать не запятую или точку, а глобальную переменную DecimalSeparator, которая хранит нужный разделитель.

Создайте новый проект, и установите на него компонент Edit для ввода вещественного числа. Ниже киньте Memo, сюда мы будем выводить это число, отформатированное разными способами с помощью FormatFloat(). Еще ниже – кнопку для того, чтобы начать заполнять Memo. Первым делом мы с вами установим «защиту от дураков» — проверку компонента Edit, чтобы пользователь не смог ввести туда ничего, кроме целого или вещественного числа. При этом мы будем в качестве разделителя использовать переменнуюDecimalSeparator, и кроме того, проверим, чтобы она не встречалась более одного раза. Затем эту же проверку без изменений вы сможете применять в любых последующих ваших проектах, где потребуется необходимая проверка. Для Edit1 создаем обработчик события OnKeyPress, которое вызывается всякий раз, когда пользователь нажимает любую клавишу при вводе текста в компонент Edit. Впишем следующий код:

‘0’..’9′: ; //числа разрешаем

//если разделителя еще нет — выводим правильный разделитель,

//иначе ничего не выводим

‘,’ , ‘.’ : if Pos(DecimalSeparator, Edit1.Text)= 0 then

//разрешаем отрицательное число, если минус идет первым символом

‘-‘: if (Pos(‘-‘, Edit1.Text) = 1) and

(Length(Edit1.Text) >0) then Key := Chr(0);

Этот код требует некоторых пояснений. Событие OnKeyPress компонента Edit самостоятельно создает параметр Key, это переменная типа Char, то есть, символ. В этой переменной содержится символ, введенный пользователем. Поскольку символ – перечисляемое значение (то есть, он может быть от 0 до 255), можно использовать конструкцию case. В качестве селектора указываем переменную Key, а в качестве значения указываем то значение, которое там может находиться. Строка

‘0’..’9′: ; //числа разрешаем

показывает, что если были введены символы от 0 до 9, то ничего не происходит (после знака «:» нет действующих операторов). Здесь мы можем извлечь новое правило: можно показывать диапазон числовых или символьных значений через знак «..», например, ‘a’..’z’; 1..9. Далее идут строки:

‘,’ , ‘.’ : if Pos(DecimalSeparator, Edit1.Text)= 0 then

Этот код дает нам новое правило: через запятую можно указать возможные значения. То есть, блок кода будет выполняться, если пользователь ввел либо запятую, либо точку. В самом блоке кода мы проверяем: нет ли уже в строке нужного разделителя? Если нет (Pos() вернула ноль), то мы записываем в переменную Key нужный разделитель, иначе присваиваем ей нулевой символ (то есть пользователь ничего не ввел). При этом неважно, точку или запятую ввел пользователь – разделитель все равно будет правильным.

Далее, если пользователь ввел символ #8 (нажал ), то ничего не делаем – то есть, разрешаем этот символ. Надо же оставить ему возможность редактировать свой текст, исправлять ошибки. И снова правило: можно указать номер символа, используя функцию Chr(), либо просто после символа «#»:

В обоих случаях, в переменную Key попадет символ, который в таблице символов идет под номером 8.

Далее мы смотрим, не минус ли ввел пользователь? Если да, то смотрим, какова длина строки. Ведь если длина строки больше нуля, значит, в ней уже есть символы, и минус разрешать нельзя. В случае же, если строка еще не содержит ничего, то минус допустим, и блок кода if не выполнится.

Если пользователь нажал , Key будет содержать символ #13. Обычно пользователь нажимает , когда он закончил ввод текста. Строка

передает фокус (то есть, выделение компонента) на кнопку, если нажата клавиша .

Ну и в конце мы указываем, что в любом другом случае (пользователь набрал букву или какой либо другой недопустимый знак) переменной Key присваивается нулевой символ. Компьютер отреагирует так, будто пользователь ничего и не вводил.

В процедуре нажатия кнопки пишем такой код:

Тут все понятно – сначала преобразуем полученное число в виде строки, в вещественное число. Затем это число выведем в Memo, придав ему различные форматы. Сохраните пример, скомпилируйте его и посмотрите, как работает программа. В дальнейшей практике вам не раз придется ставить подобную «защиту от дураков», данный пример события OnKeyPress можно будет просто копировать в любую программу.

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL