Почему в программе, написанной в Lazarus в Windows при отображении чисел выводится ? в разделителе тысяч.

Это проблема старая. И всё равно периодически возникает в вопросах новичков на форумах.

Эта ситуация вызвана тем, что программы, написанные с использованием Lazarus и LCL работают в кодовой странице строк UTF8. В windows же кодовая страница по умолчанию Win1251.

Для решения проблемы можно воспользоваться следующим кодом:

procedure ConvetToUTF8LocalConst;
var
 i:integer;
begin
 DefaultFormatSettings.ShortMonthNames[1]:='Январь';
 DefaultFormatSettings.ShortMonthNames[2]:='Февраль';
 DefaultFormatSettings.ShortMonthNames[3]:='Март';
 DefaultFormatSettings.ShortMonthNames[4]:='Апрель';
 DefaultFormatSettings.ShortMonthNames[5]:='Май';
 DefaultFormatSettings.ShortMonthNames[6]:='Июнь';
 DefaultFormatSettings.ShortMonthNames[7]:='Июль';
 DefaultFormatSettings.ShortMonthNames[8]:='Август';
 DefaultFormatSettings.ShortMonthNames[9]:='Сентябрь';
 DefaultFormatSettings.ShortMonthNames[10]:='Октябрь';
 DefaultFormatSettings.ShortMonthNames[11]:='Ноябрь';
 DefaultFormatSettings.ShortMonthNames[12]:='Декабрь';

for i:=1 to 12 do
 DefaultFormatSettings.LongMonthNames[i] := DefaultFormatSettings.ShortMonthNames[i];

 DefaultFormatSettings.LongDayNames[1]:='Воскресенье';
 DefaultFormatSettings.LongDayNames[2]:='Понедельник';
 DefaultFormatSettings.LongDayNames[3]:='Вторник';
 DefaultFormatSettings.LongDayNames[4]:='Среда';
 DefaultFormatSettings.LongDayNames[5]:='Четверг';
 DefaultFormatSettings.LongDayNames[6]:='Пятница';
 DefaultFormatSettings.LongDayNames[7]:='Суббота';
 
 DefaultFormatSettings.ShortDayNames[1]:='Вс';
 DefaultFormatSettings.ShortDayNames[2]:='Пн';
 DefaultFormatSettings.ShortDayNames[3]:='Вт';
 DefaultFormatSettings.ShortDayNames[4]:='Ср';
 DefaultFormatSettings.ShortDayNames[5]:='Чт';
 DefaultFormatSettings.ShortDayNames[6]:='Пт';
 DefaultFormatSettings.ShortDayNames[7]:='Сб';
end;

procedure InitLocale;
begin
 DefaultFormatSettings.LongDateFormat:='dd.mm.yyyy';
 DefaultFormatSettings.ShortDateFormat:=DefaultFormatSettings.LongDateFormat;
 DefaultFormatSettings.DateSeparator:='.';
 DefaultFormatSettings.TimeSeparator:=':';
 DefaultFormatSettings.ThousandSeparator:=' ';
 DefaultFormatSettings.CurrencyString:='р.';
 ConvetToUTF8LocalConst;
end;

При запуске программы достаточно реализовать вызов функции InitLocale;

Ещё полезно сделать вызов

Application.UpdateFormatSettings:=false;

после
Application.Initialize;

в главном файле проекта (*.lpr)

Вот образец фрагмента файла проекта, который получается с учётом этих рекомендаций:

  Application.Title:='Макошь - торговля и склад';
  Application.Initialize;
  Application.UpdateFormatSettings:=false;
  InitLocale;

Всё вышенаписанное относится к винде. В линуксе оно не нужно. Но код будет работать везде правильно.

Запись опубликована в рубрике Windows, Без рубрики, Программирование на Lazrus с метками , . Добавьте в закладки постоянную ссылку.