Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
RAD XE3+

Поток и ф-ции с FormatSettings

02.06.2018, 04:00. Показов 5713. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно вызвать функцию timetostr в потоке.
В фак'е сказано, что нужно вызывать функцию таким образом
Delphi
1
timetostr(time, formatsettings);
Также сказано, что formatsettings должна быть задана перед вызовом функции.
То есть если у меня несколько потоков, мне необходимо в каждом потоке делать следующее?
Delphi
1
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatSettings);
И можно ли вообще не вызывать процедуру GetLocaleFormatSettings?
Ведь по идее formatsettings уже имеет стандартные параметры... я что-то не понимаю, объясните пжлст
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2018, 04:00
Ответы с готовыми решениями:

Передача ф-ции как параметра другой ф-ции
struct pupil{ char surname; int school; int answer; int num; } tmp, a; int usl(int i, pupil a) { }

FormatSettings.DecimalSeparator
Здравствуйте. Не могли бы вы мне объяснить почему в FormatSettings он выдаёт ошибку Код программы: unit Unit1; interface ...

Узнать в ф-ции имя вызвавшей ф-ции
Это возможно? Т.е. есть некая ф-ция debug(msg), передавать имя вызвавшей ее процедуры в параметрах не вариант, можно ли как-то внутри это...

31
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
23.11.2019, 02:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от tsa2016 Посмотреть сообщение
Я не уверен, что я не понял суть. Пока что я убежден, что в мою локальную переменную нужно скопировать все глобальные настройки, и только после этого изменить те, что нужны мне, так как иначе если я задам только нужные мне, то остальные останутся неопределенными.
Не поняли. Ваша "локальная" переменная ни на что не влияет. Она определена только в вашей программе и используется только в функциях/процедурах как параметр. Только если вы хотите преобразовать какое-то строковое значение в двоичное число для записи его в память или наоборот из памяти в строковое значение по своим правилам, отличным от системных. Пример в вашем первом посте.
Цитата Сообщение от qad_quolo Посмотреть сообщение
timetostr(time, formatsettings);
Так что если вас интересует только вывод времени в желаемом формате, то на кой хрен вам все прочие настройки?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
23.11.2019, 08:30
да блин
вы не читаете, чтоль?
вторая ссылка для кого?
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 15
23.11.2019, 14:11
Цитата Сообщение от northener Посмотреть сообщение
Не поняли. Ваша "локальная" переменная ни на что не влияет. Она определена только в вашей программе и используется только в функциях/процедурах как параметр. Только если вы хотите преобразовать какое-то строковое значение в двоичное число для записи его в память или наоборот из памяти в строковое значение по своим правилам, отличным от системных. Пример в вашем первом посте.
Так что если вас интересует только вывод времени в желаемом формате, то на кой хрен вам все прочие настройки?
А вот на кой хрен. Разумеется я не все понимаю, иначе бы я здесь не задавал вопросы. Тем не менее, Ваши слова совершенно точно отражают мое понимание этого вопроса. Однако мне при этом неясен следующий вопрос. - Я ввожу переменную типа TFormatSettings и присваиваю ей ShortDateFormat, оставляя остальные параметры неопределенными. Откуда мне знать, какие еще параметры могут понадобиться при преобразовании даты? А вдруг нужно установить, например, и TimeSeparator? И как отработает функция перевода в этом случае, - вылетит в трубу или использует значение глобального формата? Я не знаю и знать не хочу, как она отработает, хотя это легко проверить, так как через год-два ее поведение может радикально измениться в новой версии Дельфи. А вот если я сначала присвою в локальный формат глобальный и только потом модифицирую его, то это будет полное и корректное решение вопроса.

Добавлено через 7 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
да блин вы не читаете, чтоль? вторая ссылка для кого?
Не знаю для кого. Вы ее сначала неправильно указали, опустив скобку в конце. А теперь хоть скобку и добавили, но сама ссылка осталась битая и пройти по ней невозможно. Когда я на нее заходил, добавляя скобку, никаких примеров занесения глобального формата в локальный я не нашел. Впрочем дело было глубокой ночью и я готов поверить, что просто не заметил. Сейчас я вооружусь терпением, наберу Вашу ссылку вручную, еще раз пройду по ней и еще раз тщательно прочту все, что там написано.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
23.11.2019, 14:12
tsa2016 совершенно верно. Без предварительной инициализации, вы рискуете нарваться на ошибку преобразования данных, причем ошибка не будет появляться на 90% компах, где используется обычная локализация, а вот на 10% пользователь захотел и изменил представление даты через тире, а не слэш или точку или вообще свой вариант использовал. Именно поэтому в Дельфи XE нужно через конструктор обращаться к этой переменной, который гарантированно скопирует из локали все параметры, а уже потом вы делайте с ними что хотите.
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 15
23.11.2019, 14:26
Цитата Сообщение от Пытливый Посмотреть сообщение
tsa2016 совершенно верно. Без предварительной инициализации, вы рискуете нарваться на ошибку преобразования данных, причем ошибка не будет появляться на 90% компах, где используется обычная локализация, а вот на 10% пользователь захотел и изменил представление даты через тире, а не слэш или точку или вообще свой вариант использовал. Именно поэтому в Дельфи XE нужно через конструктор обращаться к этой переменной, который гарантированно скопирует из локали все параметры, а уже потом вы делайте с ними что хотите.
Позвольте уточнить. То есть после выполнения FS:=TFormatSettings.Create; у меня в FS будет глобальный формат, что мне собственно и надо или я должен использовать какой то оператор для искомого копирования?

Добавлено через 9 минут
2 krapotkin
Пожалуй действительно недосмотрел. Спасибо.

Правильно ли я понимаю, что мне нужно написать: FS := TFormatSettings.Create('ru-RU');
и при этом писать FS.ShortDateFormat := 'dd.mm.yyyy'; уже нет нужды?
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
23.11.2019, 15:54
Если вы хотите на любой локали видеть именно в таком формате, а не в предустановленном то нужно. Суть TFormatSettings в том, что бы обеспечить разработчику возможность на выходе получить формат именно в нужном ему формате, а не в локальном.

Добавлено через 15 минут
Вот так выглядит в D2010 структура FormatSettings по умолчанию. В D2010 это просто глобальная переменная:
(0, 0, #0, #0, 0, #0, #0, #0, '', '', '', '', '', '', '', ('', '', '', '', '', '', '', '', '', '', '', ''), ('', '', '', '', '', '', '', '', '', '', '', ''), ('', '', '', '', '', '', ''), ('', '', '', '', '', '', ''), 0)
И вот так она выглядит после применения функции GetLocaleFormatSettings(LOCALE_SYSTEM_DE FAULT, formatSettings)
(3, 8, ' ', ',', 2, '.', ':', ';', #$20BD, 'dd.MM.yyyy', 'd MMMM yyyy ''г.''', '', '', 'hh:mm', 'hh:mm:ss', ('янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'), ('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'), ('Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'), ('воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'), 0)
В XE это уже не просто глобальная переменная типа reacord, а существенно более сложная структура TFormatSettings, имеющая свои методы и специальную функцию инициализатор Create (это не класс и Create не конструктор) и тут ситуация аналогичная. Без инициализации имеем:
('', 40, 22, 'F', #$FFFF, #$FFFF, '', '', '', '', '', '', ('', '', '', '', '', '', '', '', '', '', '', ''), ('', '', '', '', '', '', '', '', '', '', '', ''), ('', '', '', '', '', '', ''), ('', '', '', '', '', '', ''), (), 'ﺨ', #$19, 35296, 66, '')
а теперь используем инициализатор Create:
FormatSettings := TFormatSettings.Create;
(#$20BD, 3, 2, '.', ':', ';', 'dd/MM/yyyy', 'd MMMM yyyy ''г.''', '', '', 'hh:mm', 'hh:mm:ss', ('янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'), ('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'), ('Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'), ('воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'), (), ' ', ',', 50, 8, '')
1
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
24.11.2019, 00:55
Цитата Сообщение от tsa2016 Посмотреть сообщение
Откуда мне знать, какие еще параметры могут понадобиться при преобразовании даты?
А кто программу пишет? Разве не вы?
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 15
24.11.2019, 01:00
Цитата Сообщение от northener Посмотреть сообщение
А кто программу пишет? Разве не вы?
Нет, не я. Я пишу свою программу и использую стандартную функцию преобразования даты. А кто пишет программы стандартных функций и какие дополнительные параметры они могут использовать я не знаю.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
24.11.2019, 01:19
Цитата Сообщение от tsa2016 Посмотреть сообщение
Я пишу свою программу и использую стандартную функцию преобразования даты
Давайте разберемся на примере из вашего топика.
Цитата Сообщение от qad_quolo Посмотреть сообщение
timetostr(time, formatsettings);
Вы используете стандартную функцию TimeToStr. Но если бы вы заглянули бы в справку по этой функции, то вы увидели бы, что эта функция существует в двух вариантах:
Delphi
1
2
function TimeToStr(const DateTime: TDateTime): string;
function TimeToStr(const DateTime: TDateTime; const AFormatSettings: TFormatSettings): string;
Первый вариант преобразовывает дату-время в его строковое представления в соответствии с локализацией пользователя. Второй вариант плюёт на локализацию пользователя и преобразовывает дату-время в соответствии с вашими личными желаниями! Так на кой ляд вам в переменную const AFormatSettings: TFormatSettings изначально считывать локальные настройки пользователя?
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 15
24.11.2019, 01:32
Цитата Сообщение от northener Посмотреть сообщение
Давайте разберемся на примере из вашего топика.
Это не мой топик, но давайте.
Цитата Сообщение от northener Посмотреть сообщение
Вы используете стандартную функцию TimeToStr. Но если бы вы заглянули бы в справку по этой функции, то вы увидели бы, что эта функция существует в двух вариантах:
Delphi
1
2
function TimeToStr(const DateTime: TDateTime): string;
function TimeToStr(const DateTime: TDateTime; const AFormatSettings: TFormatSettings): string;
Первый вариант преобразовывает дату-время в его строковое представления в соответствии с локализацией пользователя. Второй вариант плюёт на локализацию пользователя и преобразовывает дату-время в соответствии с вашими личными желаниями! Так на кой ляд вам в переменную const AFormatSettings: TFormatSettings изначально считывать локальные настройки пользователя?
Если я не определяю параметры AFormatSettings, они остаются неопределенными. Откуда я могу знать, исчерпывающий список параметров AFormatSettings, необходимых для работы этой функции? Кто мне может гарантировать, что она когда-нибудь не загнется у какого-то из пользователей моей программы? Поэтому я полагаю правильным присвоение в AFormatSettings глобальных параметров а потом уже настройка отдельных нужных мне параметров.
Соответственно, в Дельфи 2010 я поставил
GetLocaleFormatSettings(LOCALE_SYSTEM_DE FAULT,FS);
FS.ShortDateFormat:='dd.mm.yyyy';

в в Дельфи 2018:
FS:=TFormatSettings.Create('ru-RU');
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
24.11.2019, 02:23
Цитата Сообщение от tsa2016 Посмотреть сообщение
Если я не определяю параметры AFormatSettings, они остаются неопределенными. Откуда я могу знать, исчерпывающий список параметров AFormatSettings, необходимых для работы этой функции?
Из справки естественно. Раз уж вы с какого-то перепуга решили наплевать на локальные настройки пользователя в отношении именно ShortDateFormat, то вам не хило бы познакомиться со всеми прочими настройками локализации даты-времени.
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 15
24.11.2019, 03:50
Цитата Сообщение от northener Посмотреть сообщение
Из справки естественно.
Я не разделяю вашего оптимизма относительно ее полноты.
Цитата Сообщение от northener Посмотреть сообщение
Раз уж вы с какого-то перепуга решили наплевать
Я не знаю, плюете ли вы с перепугу, но я нет, и не вижу никаких причин глубоко знакомиться со всеми прочими настройками локализации даты-времени. Меня вполне удовлетворяет полученный гарантировано верный результат.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2019, 03:50

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся.
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка Run-Time Check Failure #2 - Stack around the...

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не...

Разработать программу, в которой основной поток, принимает поток ввода и контролирует созданные потоки.
что-то не-то с кодом. 2 дня ломаю голову :( //#define _REENTRANT #include <stdio.h> #include <stdlib.h> #include...

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в буфер) вылезает эта ошибка я уже с ней...

OpenFileDialog и потоки: Текущий поток должен быть задан как поток однопоточного контейнера (STA)
Со стартового окна запускаю формы вот так: new Thread(() => { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru