Delphi: TStringList est toujours Délimiteur un espace, même si délimiteur est réglé
-
20-09-2019 - |
Question
Je ne parviens pas à le delimiter dans la classe TStringList. Jetez un coup d'oeil:
var
s: string;
sl: TStringList;
begin
sl := TStringList.Create;
s := 'Users^foo bar^bar foo^foobar^barfoo';
sl.Delimiter := '^';
sl.DelimitedText := s;
ShowMessage(sl[1]);
end;
sl[1]
DEVRAIT retourner 'foo bar'
sl[1]
FONCTIONNE 'foo'
retour
Il semble que le séparateur est '^'
maintenant ET ' '
Toutes les idées?
La solution
Vous devez définir s1.StrictDelimiter := True
pour les espaces de ne pas être considérés comme délimiteurs, plus d'infos ROBOSOFT suggestion .
'hello hello^bye bye'
se tourne vers '"hello hello"^"bye bye"'
. Si vous choisissez cette voie et il fonctionne pour vous, s'il vous plaît accepter la réponse d'Alexandre et pas le mien, il fournit également le code pour la mettre en œuvre. Les deux solutions de contournement n'utilisent pas StrictDelimiter
ont des limites: la première exige un certain caractère utilisé, et la seconde ne nécessite pas des virgules et des espaces inversé dans le texte original.
Peut-être qu'il est temps de passer à une version plus récente de Delphi:)
Autres conseils
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Ryan a fournisseur une excellente solution à ce problème en utilisant la fonction ExtractStrings () dans Delphi. Voir:
Dans votre cas, remplacer les appels à sl.Delimiter et sl.DelimitedText avec la ligne ci-dessous: ExtractStrings ([ '^'], [], PChar (S), sl);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
Les travaux de Delphi 7 « comme des gants » pour moi. Ceci est ma fonction applique après Trick Alexander:
procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := '"' + StringReplace(Input, Delimiter, '"' + Delimiter + '"', [rfReplaceAll]) + '"' ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := 'Users^foo bar^bar foo^foobar^barfoo';
Split('^',Edit1.Text,Memo1.Lines);
end;
Merci beaucoup!