How to : Splitting a string in a string list

preview_player
Показать описание
Splitting a string in a string list

A function that splits a string in parts separated by a substring

and returns the parts in a dynamic string array

Splitting a string in a string list

The following functions split a string in parts separated by a substring and return the parts in a string list that may be passed as third parameter or created by the function (and in this latter case it must be freed by the caller):

interface

uses classes;

function SplitStrings(const str: string;

const separator: string = ',';

Strings: TStrings = nil): TStrings;

function AnsiSplitStrings(const str: string;

const separator: string = ',';

Strings: TStrings = nil): TStrings;

implementation

uses sysutils;

function SplitStrings(const str: string; const separator: string;

Strings: TStrings): TStrings;

// Fills a string list with the parts of "str" separated by

// "separator". If Nil is passed instead of a string list,

// the function creates a TStringList object which has to

// be freed by the caller

var

n: integer;

p, q, s: PChar;

item: string;

begin

if Strings = nil then

Result := TStringList.Create

else

Result := Strings;

try

p := PChar(str);

s := PChar(separator);

n := Length(separator);

repeat

q := StrPos(p, s);

if q = nil then q := StrScan(p, #0);

SetString(item, p, q - p);

Result.Add(item);

p := q + n;

until q^ = #0;

except



item := '';

if Strings = nil then Result.Free;

raise;

end;

end;

function AnsiSplitStrings(const str: string; const separator: string;

Strings: TStrings): TStrings;

// Fills a string list with the parts of "str" separated by

// "separator". If Nil is passed instead of a string list,

// the function creates a TStringList object which has to

// be freed by the caller

// ANSI version

var

n: integer;

p, q, s: PChar;

item: string;

begin

if Strings = nil then

Result := TStringList.Create

else

Result := Strings;

try

p := PChar(str);

s := PChar(separator);

n := Length(separator);

repeat

q := AnsiStrPos(p, s);

if q = nil then q := AnsiStrScan(p, #0);

SetString(item, p, q - p);

Result.Add(item);

p := q + n;

until q^ = #0;

except

item := '';

if Strings = nil then Result.Free;

raise;

end;

end;

Examples:

procedure TForm1.Button1Click(Sender: TObject);

begin

SplitStrings(Edit1.Text, ', ', ListBox1.Items);

end;

procedure TForm1.Button2Click(Sender: TObject);

var

Parts: TStrings;

begin

Parts := nil;

try

Parts := SplitStrings(Edit1.Text, ', ');

ShowMessage('First part is "' + Parts[0] + '"');

finally

Parts.Free;

end;

end;

You can see an example using a dynamic array instead of a StringList in a separate article.
Рекомендации по теме