2015-02-10 56 views
3

下面的代碼搜索的工作原理:更改TStrings.Delimiter打破按名稱

var 
    SL: TStrings; 
begin 
    SL := TStringList.Create; 
    try 
    SL.Add(Format('%s=%s', ['Alex', '14.05.1984'])); 

    ShowMessage(SL.Values['Alex']); 
    finally 
    SL.Free; 
    end; 
end; 

儘管此代碼不能正常工作(不能從名稱獲得價值):

var 
    SL: TStrings; 
begin 
    SL := TStringList.Create; 
    try 
    SL.Delimiter  := '|'; // <=== changed from default '=' char 
    SL.QuoteChar  := '"'; // <=== added 
    SL.StrictDelimiter := True; // <=== added 

    SL.Add(Format('%s=%s', ['Alex', '14.05.1984'])); 

    ShowMessage(SL.Values['Alex']); // <=== returns an empty string 
    finally 
    SL.Free; 
    end; 
end; 

有人能幫助我嗎?

被修改

program Sample; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Classes, 
    Dialogs; 

var 
    SL: TStrings; 
begin 
    try 
    SL := TStringList.Create; 
    try 
     SL.Delimiter := '|'; 
     SL.QuoteChar := '"'; 
     SL.StrictDelimiter := True; 

    // SL.Add(Format('%s=%s', ['Alex', '14.05.1984'])); 
     SL.LoadFromFile('ReplacementPairs.txt'); 
     ShowMessage(SL.Values['Alex']); 
    finally 
     SL.Free; 
    end; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

的ReplacementPairs.txt文件的內容是:

Alex|14.05.1984 
Paul|10.07.2015 
Edith|18.11.1961 
+0

你爲什麼不用字典? – 2015-02-10 16:07:02

+0

因此,即使TStrings實例內部知道*新分隔符,更改分隔符也會按名稱打破搜索。 – 2015-02-10 16:10:58

+0

你不用自己添加名稱 - 值對,爲什麼不寫:'SL.Values ['Alex']:= '14 .05.1984''? – 2015-02-10 16:10:59

回答

3

確定名稱和值之間的分隔符的屬性是NameValueSeparator。因此,請將其設置爲'|',並且代碼應該按照您的要求行事。

我不禁覺得字典會更適合您的需求。

+0

當我是爲你和其他人寫一篇道歉信息,你期待我:無論如何:謝謝你! – 2015-02-10 16:42:08

+0

您在原始問題中犯了一個錯誤。這可能發生。但是當它發生火災時,你做了很好的修理工作!做得好。因爲這個,我改變了我的投票方式。但是,我不能強調提供MCVE的重要性。一個簡短的20線控制檯應用程序可以完成這項工作。它確實使每個人的問題都變得更好。 – 2015-02-10 16:49:04

+0

是@David:你說得對!爲未來問題學到的經驗教訓:-) – 2015-02-10 16:51:14