Delphi: TStringList delimitatore è sempre un carattere di spazio, anche se è impostato delimitatore
-
20-09-2019 - |
Domanda
Ho problemi con il delimitatore nella classe TStringList. Date un'occhiata:
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]
DOVREBBE restituire 'foo bar'
sl[1]
fa ritorno 'foo'
Sembra che il delimitatore è ormai '^'
E ' '
Tutte le idee?
Soluzione
È necessario impostare s1.StrictDelimiter := True
per spazi non devono essere considerati delimitatori, maggiori informazioni qui .
Dal momento che si lavora in una versione che non supporta quanto sopra (come è stato chiarito dopo la risposta è stata presentata), avete due opzioni:
- Trova un personaggio si sa non sarà utilizzato nel testo originale (ad esempio sottolineatura), convertire tutti gli spazi a quel personaggio prima di sciogliersi, e convertire indietro dopo la divisione. Questo è Robosoft suggerimento s '.
- Se non avete invertito le virgole e gli spazi nel testo, è possibile utilizzare trucco e avvolgere Alexander 's il testo tra i delimitatori di comando invertito, in modo che si rivolge a
'hello hello^bye bye'
'"hello hello"^"bye bye"'
. Se si sceglie questa strada e funziona per voi, vi prego di accettare la risposta di Alessandro e non la mia, egli fornisce anche il codice per la sua attuazione.
Entrambe le soluzioni alternative che non utilizzano StrictDelimiter
hanno dei limiti: il primo richiede un po 'di carattere non utilizzati, e la seconda non richiede virgolette e gli spazi nel testo originale.
Forse è il momento di passare a una versione più recente di Delfi:)
Altri suggerimenti
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Ryan ha un eccellente fornitore di soluzione a questo problema utilizzando ExtractStrings (funzione) in Delphi. Vedi:
Quindi nel tuo caso, sostituire le chiamate a sl.Delimiter e sl.DelimitedText con la linea di seguito: ExtractStrings ([ '^'], [], PChar (S), sl);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
Il lavoro di in Delphi 7 "come guanti" per me. Questa è la mia funzione dopo applicare trucco di Alessandro:
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;
Grazie mille!