recorrer - Delphi: StringList Delimiter es siempre un carácter de espacio incluso si se establece Delimiter
tstringlist delphi (5)
Estoy teniendo problemas con el delimitador en la clase TStringList. Echar un vistazo:
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]
DEBERÍA devolver ''foo bar''
sl[1]
SÍ devuelve ''foo''
Parece que el delimitador ahora es ''^''
Y '' ''
¿Algunas ideas?
Debe establecer s1.StrictDelimiter := True
para que los espacios no se consideren delimitadores, más información here .
Como trabajas en una versión que no admite lo anterior (como se aclaró después de enviar la respuesta), tienes dos opciones:
- Encuentra un personaje que sabes que no se usará en el texto original (por ejemplo, subrayado), convierte todos los espacios a ese personaje antes de dividirlo y vuelve a convertirlo después de la división. Esta es la sugerencia de robosoft .
- Si no tiene comillas y espacios invertidos en el texto, puede usar el truco de Alexander y ajustar el texto entre los delimitadores en el comando invertido, de modo que
''hello hello^bye bye''
convierte en''"hello hello"^"bye bye"''
. Si elige esta ruta y le conviene, acepte la respuesta de Alexander y no la mía, también proporciona el código para implementarla.
Ambas soluciones alternativas que no usan StrictDelimiter
tienen limitaciones: la primera requiere algún carácter no utilizado, y la segunda no requiere comas y espacios invertidos en el texto original.
Tal vez es hora de actualizar a una versión más nueva de Delphi :)
El trabajo en Delphi 7 "como guantes" para mí. Esta es mi función después de aplicar el truco de Alejandro:
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;
¡Muchas gracias!
Ryan ha proporcionado una excelente solución a este problema utilizando la función ExtractStrings () en Delphi. Ver:
Entonces, en su caso, reemplace las llamadas a sl.Delimiter y sl.DelimitedText con la línea siguiente: ExtractStrings ([''^''], [], PChar (S), sl);
sl.DelimitedText := ''"'' + StringReplace(S, sl.Delimiter, ''"'' + sl.Delimiter + ''"'', [rfReplaceAll]) + ''"'';
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);