usar recorrer example crear como delphi delphi-7 delimiter tstringlist

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:

  1. 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 .
  2. 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!



sl.DelimitedText := ''"'' + StringReplace(S, sl.Delimiter, ''"'' + sl.Delimiter + ''"'', [rfReplaceAll]) + ''"'';


sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);