TFormatSettings — Тип Delphi

Delphi — W1048 Небезопасный тип «строка» в «TFormatSettings»

4 RBA [2012-11-01 12:34:00]

Я переношу старый проект в Delphi XE, и я получаю это предупреждение в приведенном ниже коде.

даже FormatSettings.ThousandSeparator имеет тип char.

LE: Я спрашиваю, может ли кто-нибудь сказать мне, почему это предупреждение происходит. Код старый, и он будет переделан.

LE2: Чтобы получить это предупреждение, все предупреждения должны быть установлены в true в Компиляторе Delphi-подсказки и предупреждения

LE3: Если кому-то это нужно — <$ WARN UNSAFE_CAST OFF>, предупреждение отключается.

LE4: снимок экрана предупреждения для тех, кто считает, что предупреждение трудно поверить.

1 ответ

4 Решение kludg [2012-11-01 13:53:00]

Происхождение предупреждения — это объявление переменной FormatSettings в SysUtils.pas :

который строит строку ( CurrencyString ) для записи ( TFormatSettings ).

Delphi — W1048 Небезопасный тип «строка» в «TFormatSettings» — delphi

Я переношу старый проект в Delphi XE, и я получаю это предупреждение в приведенном ниже коде.

даже FormatSettings.ThousandSeparator имеет тип char.

LE: Я спрашиваю, может ли кто-нибудь сказать мне, почему это предупреждение происходит. Код старый, и он будет переделан.

LE2: Чтобы получить это предупреждение, все предупреждения должны быть установлены в true в Компиляторе Delphi-подсказки и предупреждения

LE3: Если кому-то это нужно — <$ WARN UNSAFE_CAST OFF>, предупреждение отключается.

LE4: снимок экрана предупреждения для тех, кто считает, что предупреждение трудно поверить.

    2 1
  • 30 окт 2020 2020-10-30 14:56:56
  • RBA

1 ответ

Происхождение предупреждения — это объявление переменной FormatSettings в SysUtils.pas :

который строит строку ( CurrencyString ) для записи ( TFormatSettings ).

FormatSettings.DecimalSeparator

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

[Error] Unit1.pas(43): Undeclared identifier: ‘FormatSettings’
[Error] Unit1.pas(43): Missing operator or semicolon
[Error] Unit1.pas(43): Statement expected, but expression of type ‘Char’ found
[Error] Unit1.pas(44): Incompatible types
[Error] Unit1.pas(44): ‘)’ expected but ‘,’ found
[Error] Unit1.pas(48): Constant expression expected
[Error] Unit1.pas(62): Missing operator or semicolon
[Error] Unit1.pas(62): Statement expected, but expression of type ‘Char’ found
[Error] Unit1.pas(63): Incompatible types
[Error] Unit1.pas(63): ‘)’ expected but ‘,’ found
[Error] Unit1.pas(74): Statement expected but end of file found
[Error] Unit1.pas(20): Unsatisfied forward or external declaration: ‘TForm1.Edit2KeyDown’
[Error] Unit1.pas(22): Unsatisfied forward or external declaration: ‘TForm1.Edit2KeyPress’
[Error] Unit1.pas(23): Unsatisfied forward or external declaration: ‘TForm1.FormClick’
[Fatal Error] Project1.dpr(6): Could not compile used unit ‘Unit1.pas’

Добавлено через 11 минут
чё никто не знает что ли.

TFormatSettings — Тип Delphi

Making sure you have your e111 for your
holiday is absolutely essential

A new book on thinking . now on Amazon

Delphi Basics
Delphi Basics supplies reference up to release XE1
This web site provides help and reference for the fundamentals of the Delphi© language. It gives an introduction to the Delphi Object Oriented Language for newcomers, and provides a ready reference for experienced programmers.

It limits itself to a broad base of the language in order to keep things simple and manageable. The approach taken is to present the most useable basics of Delphi Programming in as accessible a manner as possible.

Feel free to contact the author about any aspects of the site. Every effort will be made to respond to all emails received.

New : An independent review of «Learn to program in Pascal», an online course for those starting out on Delphi programming.

Currently at a 60% discount

Learn Javascript course

Currently at a 70% discount

Delphi Basics as a downloadable Windows program Download the Windows program : now only Ј5

A complete version of the web site has been converted into a Windows executable.

It looks and behaves like the site, but with the added benefits of :

  • No adverts
  • Search facility for finding Run Time Library entries and .Net Methods.
  • Fast access to 1,000+ pages of tutorial/reference pages — the full site and more
  • System.Drawing.Graphics .Net >Download the Windows program : now only Ј5

Learn Delphi TV
Learn Delphi with easy tutorial videos.

TFormatSettings — Тип Delphi

I’m trying to code something related to this thread [link] http://www.delphipages.com/threads/thread.cfm? >
I’ve found this code in internet

function StringToDateTime(const Value: String): TDateTime;
var
FormatSettings: TFormatSettings;
begin
GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FormatSettings);
FormatSettings.DateSeparator := ‘_’;
FormatSettings.ShortDateFormat := ‘dd_mm_yyyy_hh_nn_ss’;
Result := StrToDateTime(Value, FormatSettings);
end;

But my Delphi 6 Personal doesn’t compile it. It cannot find TFormatSettings and GetLocaleFormatSettings declarations in SysUtils. Is it normal ?

If yes, then I have to find another solution.

Как определить TFormatSettings постоянного (Delphi 10)

Я просто пытаюсь преобразовать приложение Delphi 2007 для Delphi 10. В версии программного обеспечения я использую константу TFormatSettings 2007. Поскольку тип TFormatSettings изменилось где-то посередине, я наткнулся на следующую проблему: Как определить TFormatSettings константа? Я попытался следующие:

Это дает следующее сообщение об ошибке: необъявленный идентификатор: «» EraName

Я попробовал несколько других подходов, но не нашел решения. Можно ли вообще определить константу TFormatSettings? Как вы справляетесь тип записи определяется и используется в записи типа при объявлении константы?

EraInfo представляет собой динамический массив записей, и это не представляется возможным определить постоянный динамический массив записи. Если EraInfo не требуется, просто опустить заявление:

Опущенные поля будет ноль или ноль, в зависимости от их типа.

5 Minute Snack: Reading floats with StrToFloat and TFormatSettings independent of system region settings

This is one of the topics that sadly shows up mostly at run-time when you already deployed the app to your customers.

We all have our development machine. Our application works just fine. And then we deploy to the customer and the customer says that he gets an error that “12,5 is not a valid float value”.

Why is it 12,5 you wonder… on your system it is always 12.5 and works just fine.

Well, different regions different ways to write a number. In Europe most countries use “,” (comma) as a decimal separator and “.” as a thousand separator. In the United States of America it is exactly vice versa.

It gets even more complicated if you have to read a number from a string that is produced by a device that always formats numbers a certain way no matter what and you have to make sure that your application is able to interpret these numbers.

There is always lots of information on the web when it comes to Delphi and its functions. In order to convert a string to a float value you use StrToFloat . Sadly, most of the information is outdated. Recent versions of Delphi use an approach that has been established by Java and .NET and has found its way into the Delphi RTL.

Here’s how Delphi tries to parse a string into a float: Delphi uses the local regional settings of the user profile the application runs in. This means if your application runs on a US-based system without any individual changes the decimal separator most likely will be “.”. If your application is run on a system in Germany, Delphi will use “,” as a decimal separator.

How you say what Delphi shall use: Let me just start with this. I have seen so many strange things to solvet his issue, it made me dizzy sometimes. There’s people rewriting registry settings to get it done and trying to load different regional configurations using the Win API… the sky seems to be the limit.

However, the solution is so easy if you have a look at the different fingerprints of the StrToFloat method:

There is the option to specify a setting of type TFormatSettings as the second parameter for the parse operation. And that is already the solution. TFormatSettings is a record that is designed to hold regional settings of all sorts. Date and Time formats, day names, number formats — all you need.

And if you look at the source….

…you even get information what different methods can be used to fill the record with data.

If you know that your external device will deliver measurement data in US format all the time, i.e. with ‘.’ as a decimal separator and you want to make sure that Delphi knows it you need to create TFormatSettings either with a US-locale or you can also create one based on your system and set the delimiter manually. You have the option.

Here we create the record for US settings:

LFormat is of type TFormatSettings . Mind that it does not have to be released as it is a record and not an object instance; even though the method is called create it is not a constructor that is called.

Alternatively, you can say:

So, whenever you encounter a string that has “12.5” as a number it will be able to parse that number no matter on what system your application runs.

Once you know that you have TFormatSettings at your disposal it becomes really easy.

Delphi XE5 и FormatSettings

Я меняю FormatSettings внутри своего приложения. Предположим, что в местной местной валюте установлено значение $, и я бы хотел использовать € в своем приложении. Я могу изменить его, используя следующий код.

Однако, если я перейду в региональные настройки и изменил его там, мои FormatSettings вернутся назад. Я считаю, что должен быть способ сохранить безопасность. Вы знаете какое-либо решение этого?

Вы можете справиться с этим, избегая переменной глобальных параметров общего формата, FormatSettings , которая устарела уже много лет.

Вместо этого создайте и TFormatSettings локальную переменную типа TFormatSettings . Передайте это всем функциям, которые зависят от настроек формата. Это только переменная параметров глобального формата, которая обновляется, когда пользователь вносит изменения.

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

Хорошо, вот что я сделал, чтобы решить мою собственную проблему. То, что я хотел сделать, — просто изменить приложение FormatSettings.CurrencyString и FormatSettings.CurrencyFormat и сохранить их в безопасности. Я могу сделать это легко, но когда я перейду в «Региональные настройки» и «Валюта», мое приложение вернет его обратно. Я нашел 2 решения:

1.Set Application.UpdateFormatSettings := False; Однако вы не получите никаких других изменений. Я имею в виду, что ничего не будет обновлено.

2. Этот вопрос решил мою проблему. Просто прослушайте WM_WININICHANGE и используйте PostMessage для очереди вашего собственного обновления. Вы можете найти полный код ниже:

Спасибо всем, кто пытался мне помочь. Я ценю это.

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

Delphi programming

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

GetLocaleFormatSettings

передаёт местные значения измерений

|| procedure GetLocaleFormatSettings ( LCID : Integer; var FormatSettings : TFormatSettings ) ;

Описание:

Delphi процедура GetLocaleFormatSettings передаёт значение местной валюты и измерений окна LCID в запись TFormatSettings.

Эта запись — TFormatSettings используется многими конверсионными функциями. Смотри пример

Пример кода:

var
formatSettings : TFormatSettings;

begin
// Furnish the locale format settings record
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatSettings);

// And use it in the thread safe form of CurrToStrF
ShowMessage(‘1234.56 formats as = ‘+
CurrToStrF(1234.56, ffCurrency, 4, formatSettings));
end;

TFormatSettings

Record with all the strings that determine formatting

Declaration

Source position: sysinth.inc line 33

type TFormatSettings = record

Currency format string

Negative currency format string

Thousands separator character

Decimal separator character

Date separator character

Time separator character

List separator character

Short date format string

Long Date Format string

AM time indicator string

PM time indicator string

Short time format string

Long time format string

Array with short month names

Array with long month names

Array with short day names

Value for 2 digit year century window

Description

TFormatSettings is a record that contains a copy of all variables which determine formatting in the various string formatting routines. It is used to pass local copies of these values to the various formatting routines in a thread-safe way.

See also

Format a string with given arguments.

Return a string representation of a TDateTime value with a given format.

Format a float according to a certain mask.

Илон Маск рекомендует:  LastDelimiter - Функция Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Run Time Library Reference
By first letter
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z $
By Functionality
Data types
Integers, ordinals
Floating point types
String, char types
Pointer types
Other types

Dates and Times
Calculations
Conversions from
Conversions to
Values
Displaying
By Unit
System
SysUtils
StrUtils
DateUtils
FileCtrl
ConvUtils
StdConvs
Math
Classes
Dialogs
Types
Variants
By Category
Compiler directives
Directives
Keywords
Types
Variables Constants
Functions
Procedures