2012-11-20 49 views
3

我有這樣的過程:超載TFormatSettings和不兼容的類型

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'; 

如果不是非常必要的話。 感謝您的幫助。

回答

3

安德烈亞斯給你一個很好的答案,你問直接的問題。

採取不同的方法,我認爲你可以在初始化對象時通過傳遞語言環境來更容易地解決你的問題。例如:

FormatSettings := TFormatSettings.Create('it-IT'); 

意大利語。然後系統將填寫特定於語言環境的設置,日期名稱,月份名稱等。

或者您可能會使用採用語言環境ID的重載更合適。無論如何,你一定會明白這個主意。

+0

謝謝,我解決了。關於指定語言,沒有多大幫助;是的,當然它設置語言,但我需要每個格式輸出的字符串。例如,當我需要顯示時顯示「sabato」:「Sabato」。 –

5

你可以這樣做:

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; 
0

要回答您直接詢問的問題,顯而易見的解決方案是使用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']);