2013-06-04 2 views
4

문자열 목록과 바꿀 값이 있습니다. 저는 'O'='0',' .'='.', ...과 같은 목록에서 그들을 결합하려고합니다. 그래서 그것을 편집하고 더 많은 교체 쌍을 추가하는 것이 쉽습니다. 내가 생각할 수있는문자열에 키 - 값 쌍 목록을 저장하고로드하려면 어떻게합니까?

지금 최선의 방법은 다음과 같습니다

var 
    ListaLimpeza : TStringList; 
begin 
    ListaLimpeza := TStringList.Create; 

    ListaLimpeza.Delimiter := '|'; 
    ListaLimpeza.QuoteChar := '"'; 
    ListaLimpeza.DelimitedText := 'O=0 | " .=."'; 

    ShowMessage('1o Valor = '+ListaLimpeza.Names[1]+' e 2o Valor = '+ListaLimpeza.ValueFromIndex[1]); 

처럼이 작품,하지만 난 (예 : ' .'의 경우) 이전 문자열을 코딩 할 수 없기 때문에 그것은, 비주얼하지 좋은 ((" .)와 같아서 =은 TStringList에 이름과 값을 할당합니다.

+0

예제에서 표준 구분 기호와 인용 부호를 사용하면 게시가 훨씬 쉬울 것입니다. 샘플 코드를 사용하면 작동합니까? 나는 당신이 당신의 DelimitedText 할당에서이 문자들을 적절하게 사용하지 못하고 있다고 생각합니다. 그러나 나는 이상한 선택을 만났을 때 당신의 모범을 풀기 위해 포기했다. 제안 : SA가 아닌 표준 기본값을 고수하면 SA에 대한 더 나은 응답을 얻을 수 있습니다. 그리고!, 표준에 문제가 생기지 않는 한. 아마도 여기 다른 사람이 당신의 뇌와 내장을 파헤쳐 당신의 것을 파헤칠 것입니다. – RobertFrank

+0

몇 가지 사항을 수정했습니다. 지금은 더 이해할 수 있다고 생각합니다. 확인해 주시겠습니까? –

+0

* 어떻게 * 저장했는지 * 목록을 어떻게 편집 할 것인지 생각 해 봤나? 편집하려면 2 열 그리드를 사용하여 따옴표 나 구분을 걱정할 필요가 없습니다. 그런 다음 원하는대로 문자열을 저장하십시오. 읽기 쉬운 형식으로 저장하는 것에 대해 걱정하지 마십시오. 프로그램에 의해 명확하게로드 될 수 있는지 확인하십시오. –

답변

5

기본적으로 NamesValues은 Windows INI 파일 형식으로 =으로 구분해야합니다. AFAICT로 구분 기호를 변경할 방법이 없습니다. @SirRufo가 주석에 표시 했으므로 (내가 알지 못했던) TStringList.NameValueSeparator 속성을 사용하여 변경할 수 있습니다.

이 당신에게 당신이 무슨 생각하지 않은, 당신의 TStringList에 무엇 델파이 생각의 아이디어를 줄 것이다 :

Sample ShowMessage output from above code

TStringList이이 출력을 생성

procedure TForm1.FormCreate(Sender: TObject); 
var 
    SL: TStringList; 
    Temp: string; 
    i: Integer; 
begin 
    SL := TStringList.Create; 
    SL.Delimiter := '|'; 
    SL.QuoteChar := '"'; 
    SL.StrictDelimiter := True; 
    SL.DelimitedText := 'O=0 | ! .!=!.!'; 
    Temp := 'Count: ' + IntToStr(SL.Count) + #13; 
    for i := 0 to SL.Count - 1 do 
    Temp := Temp + Format('Name: %s Value: %s'#13, 
       [SL.Names[i], SL.ValueFromIndex[i]]); 
    ShowMessage(Temp); 
end; 

이름/값은 아마도 당신이 필요로하는 것을하지 않을 것입니다. 실제 목표가 무엇인지는 분명하지 않지만 간단한 파일 목록 인 text|replacement을 사용하고 해당 파일을 평문으로 파싱하는 것이 효과적이며 그 파일에서 읽기/쓰기에는 TStringList을 쉽게 사용할 수 있지만, 직접 파싱을하는 것 외에는 파싱을 쉽게 할 수있는 방법을 찾지 마십시오. 당신이 그들을 구문 분석 할 때 쌍을 저장하는 배열을 사용할 수 있습니다

당신은 당신이 추가/수정/교체 쌍을 삭제하고 그냥 다시 쓰기 읽기 동작을 반대로 할 필요가 무엇이든지 제어 채울 수 있습니다
type 
    TReplacePair = record 
    TextValue: string; 
    ReplaceValue: string; 
    end; 

    TReplacePairs = array of TReplacePair; 

function GetReplacementPairs: TReplacePairs; 
var 
    ConfigInfo: TStringList; 
    i, Split: Integer; 
begin 
    ConfigInfo := TStringList.Create; 
    try 
    ConfigInfo.LoadFromFile('ReplacementPairs.txt'); 
    SetLength(Result, ConfigInfo.Count); 
    for i := 0 to ConfigInfo.Count - 1 do 
    begin 
     Split := Pos('|`, ConfigInfo[i]; 
     Result[i].TextValue := Copy(ConfigInfo[i], 1, Split - 1); 
     Result[i].ReplaceValue := Copy(ConfigInfo[i], Split + 1, MaxInt); 
    end; 
    finally 
    ConfigInfo.Free; 
    end; 
end; 

저장합니다.

+1

예, 이해합니다. 나는 다른 접근법을 찾을 필요가 있다고 믿는다. 나는 다음과 같이 사용하려고 생각하고있다.''| O | == | 0 | , | . == |. | , ... ''문자열을 사용한 다음 코드를 사용하여 해체하여 적절한 대체물이 식별되도록합니다. 저에게 시각적 인 코드를주는 더 쉬운 해결책이 있습니까? –

+0

솔루션에 대한 제안을 추가했지만'TStringList'의 내장 기능이 도움이되지 않습니다. 당신은 항상 당신을 위해 이렇게 할 자신의 자손을 만들 수 있습니다. –

+0

편집을 확인합니다. –