TSPString = Class
private
FsSRC:string;
sList:TStrings;
FcMask: String;
procedure SetMask(const Value: String);
procedure SplitSToListEx(S: String; Seperator: String; List: TStrings;CaseSens : Boolean = True );
public
constructor create(const SRC:string;const sMask:string='|');
destructor Destroy; override;
procedure ReSetSRC(const SRC:string ;const sMask:string='|');
property cMask:String read FcMask write SetMask;
function colCount(cMask:string='|'):Integer;
function getCol(const index:Integer;const cMask:string='|'):string;
end;
{ TSPString }
function TSPString.colCount(cMask: string): Integer;
begin
if cMask <> FcMask then begin
FcMask := cMask;
SplitSToListEx(FsSRC,FcMask,sList);
end else begin
if sList.Count <=0 then
SplitSToListEx(FsSRC,FcMask,sList);
end;
Result := sList.Count;
end;
constructor TSPString.create(const SRC:string;const sMask:string);
begin
FsSRC := SRC;
sList := TStringList.Create;
SetMask(sMask);
end;
destructor TSPString.Destroy;
begin
FreeAndNil(sList);
inherited;
end;
function TSPString.getCol(const index: Integer;const cMask: string): string;
begin
if cMask <> FcMask then begin
FcMask := cMask;
SplitSToListEx(FsSRC,FcMask,sList);
end else begin
if sList.Count <=0 then
SplitSToListEx(FsSRC,FcMask,sList);
end;
if sList.Count > 0 then begin
if index >= sList.Count then
Result := sList.Strings[sList.Count - 1]
else if index < 0 then
Result := sList.Strings[0]
else
Result := sList.Strings[index];
end else begin
Result := FsSRC;
end;
end;
procedure TSPString.ReSetSRC(const SRC:string ;const sMask:string);
begin
if (FsSRC <> SRC) or (FcMask <> sMask)then begin
FsSRC := SRC;
FcMask := '';
SetMask(sMask);
end;
end;
procedure TSPString.SetMask(const Value: String);
begin
if FcMask <> Value then begin
FcMask := Value;
sList.Clear;
end;
end;
procedure TSPString.SplitSToListEx(S, Seperator: String; List: TStrings;
CaseSens: Boolean);
var
tmps : String;
i,iBeg,iSepLen : Integer;
bMatch , bHaveItem : Boolean;
begin
List.Clear;
iBeg := 1;
iSepLen := Length(Seperator);
bHaveItem := False;
for i := 1 to Length(S) do begin
tmps := Copy(S,i,iSepLen);
if CaseSens then
bMatch := tmps = Seperator
else
bMatch := CompareText(tmps,Seperator) = 0;
if bMatch then begin
List.Add(Copy(S,iBeg,i-iBeg));
iBeg := i + iSepLen ;
bHaveItem := True;
end;
end;
if (iBeg <= Length(S)+1) and ( bHaveItem or (Length(S) > 0)) then
List.Add(Copy(S,iBeg,Length(S)-iBeg+1));
end;
字符串分割类
最新推荐文章于 2021-11-18 19:25:59 发布