2015-02-10 2 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; 

Может кто-нибудь мне помочь?

Edited

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

Почему вы не используете словарь? –

+0

, поэтому изменение разделителя прерывает поиск по имени, даже если экземпляр TStrings внутренне * знает * нового разделителя. –

+0

Вместо того, чтобы добавлять пару имя-значение самостоятельно, почему бы вам не написать: 'SL.Values ​​['Alex']: = '14 .05.1984''? –

ответ

3

Свойство, которое определяет разделитель между именами и значениями является NameValueSeparator. Итак, установите это на '|', и код должен вести себя по вашему желанию.

Я не могу не чувствовать, что словарь будет более подходящим для ваших нужд.

+0

К тому времени, когда я был написав извиняющееся сообщение для вас и других людей, вы меня ожидали: во всяком случае: СПАСИБО! –

+0

Вы сделали ошибку в своем исходном вопросе. Это может случиться. Но ты хорошо справился с этим, когда попал под огонь! Отлично сработано. Из-за этого я отклонил свое голосование. Однако я не могу подчеркнуть важность предоставления MCVE. Это было бы короткое 20-строчное консольное приложение. Это действительно делает вопросы лучше для всех. –

+0

Да @ Давид: вы правы! Урок, извлеченный для будущих вопросов :-) –