-1

文字列、区切り文字、および TStrings リストが提供された場合、おそらく文字列を分割/区切りする別の質問から見つけた手順があります。その手順は次のとおりです。

procedure SplitString(const Delimiter: Char; Input: string; const Strings: TStrings);
begin
  //Delimits or splits the received string, returns TStrings array
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;

しかし、私がこれを提供したとき:

SplitString('=',test,EqualParse);

testは文字列200 : NCPATH -------------> = C:\SNDATA\NC\で、EqualParseは ですTStringList。返される200のはEqualParse[0](等号の左側のすべてである必要があります。返されることを期待しています200 : NCPATH ------------->。そのコードの使用方法に何か問題がありますか?変更できますか?明示的に行われていない場合は、スペースで分割しないこともできますか?

4

1 に答える 1

5

TStrings.StrictDelimiterTrueに設定する必要があります。そうしないDelimitedTextと、区切り文字として空白が含まれます。

procedure SplitString(const Delimiter: Char; Input: string; const Strings: TStrings);
begin
  //Delimits or splits the received string, returns TStrings array
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.StrictDelimiter := True; // <-- add this
   Strings.DelimitedText := Input;
end;

これは文書化された動作です:

StrictDelimiter が False に設定されている場合、Delimiter の値に関係なく、スペース文字も区切り文字として解釈されます。

そうは言っても、入力の区切り文字プロパティを設定するとTStrings、呼び出し元に望ましくない副作用が生じる可能性があるTStringListため、解析にローカルを使用することをお勧めします。

procedure SplitString(const Delimiter: Char; Input: string; const Strings: TStrings);
var
  Tmp: TStringList;
begin
  Assert(Assigned(Strings)) ;
  tmp := TStringList.Create;
  try
    tmp.Delimiter := Delimiter;
    tmp.StrictDelimiter := True;
    tmp.DelimitedText := Input;
    Strings.Assign(tmp);
  finally
    tmp.Free;
  end;
end;
于 2013-06-10T15:49:25.940 に答える