Bazaprogram.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Decimalseparator delphi xe10

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

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

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

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

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

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

Все, что мы сделали в данном примере, так это присвоили переменной 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() , либо просто после символа «#»:

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

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

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

Читать еще:  Как понизить пинг в css

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

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

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

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

Decimalseparator delphi xe10

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

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

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

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

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

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

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

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

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

От: Flamerhttp://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 Batenevhttps://github.com/abbat
Дата:28.05.06 13:05
Оценка:

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

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

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

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

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

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

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

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

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

Читать еще:  Delphi экспорт базы в xml

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

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 Batenevhttps://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

Ссылка на основную публикацию
Adblock
detector