Delphi 重载TFormatSettings和不兼容的类型

Delphi 重载TFormatSettings和不兼容的类型,delphi,delphi-xe2,Delphi,Delphi Xe2,我有以下程序: procedure Initialize(out FormatSettings: TFormatSettings); const LongDayNamesEx : array [1..7] of string = ('Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato', 'Domenica'); LongMonthNamesEx : array [1..12] of string = ('Genn

我有以下程序:

procedure Initialize(out FormatSettings: TFormatSettings);
const
  LongDayNamesEx : array [1..7] of string = ('Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato', 'Domenica');
  LongMonthNamesEx : array [1..12] of string = ('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');
begin
  FormatSettings := TFormatSettings.Create;
  with FormatSettings do
  begin
    LongDayNames := LongDayNamesEx;
    LongMonthNames := LongMonthNamesEx;
  end;
end;
我得到一个关于不兼容类型的错误(E2008)。我怎样才能解决这个问题?我不想将某些东西用作:

LongDayNames[1] := 'Lunedì';
LongDayNames[2] := 'Martedì';
...
LongDayNames[7] := 'Domenica';
LongMonthNames[1] := 'Gennaio';
LongMonthNames[2] := 'Febbraio';
...
LongMonthNames[12] := 'Dicembre';
如果不是非常必要的话。 谢谢您的帮助。

您可以这样做:

type
  TDayNameArray = array[1..7] of string;
const
  LongDayNamesEx: TDayNameArray = ('Måndag', 'Tisdag', 'Onsdag', 'Torsdag',
    'Fredag', 'Lördag', 'Söndag');
var
  fs: TFormatSettings;
begin
  TDayNameArray(fs.LongDayNames) := LongDayNamesEx;

安德烈亚斯对你直接提出的问题给了你一个很好的回答

采用另一种方法,我认为在初始化对象时通过传递区域设置可以更容易地解决问题。例如:

FormatSettings := TFormatSettings.Create('it-IT');
意大利人的。然后,系统将填写特定于语言环境的设置、日期名称、月份名称等


或者,您可能会使用带有区域设置ID的重载更合适。不管怎样,你肯定会明白的。

要直接回答你提出的问题,最明显的解决办法是使用for循环。将记录辅助对象和打开的数组参数结合起来,使其更易于调用:

type
  TTFormatSettingsHelper = record helper for TFormatSettings
    procedure SetLongDayNames(const Values: array of string);
  end;

procedure TTFormatSettingsHelper.SetLongDayNames(const Values: array of string);
var
  Index: Integer;
  Value: string;
begin
  Assert(high(Values)-low(Values)
    = high(Self.LongDayNames)-low(Self.LongDayNames));

  Index := low(Self.LongDayNames);
  for Value in Values do
  begin
    Self.LongDayNames[Index] := Value;
    inc(Index);
  end;
end;
然后你只需写下:

FormatSettings.SetLongDayNames(['Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 
  'Venerdì', 'Sabato', 'Domenica']);

谢谢,我解决了。关于具体语言,帮不了我多少忙;是的,当然它设置了语言,但我需要字符串的每种格式输出。例如,当我需要显示“sabato”时,我会显示“sabato”。