안녕하세요..^^ ( 속도가 느리다고 해서리 조금 수정해보았습니다. )
흠.. 질답란에도 그렇고 가끔 보면.. Comport나 기타 문열로 주구장창 들어온 내용을 구분자를 이용해서 나누려고 할때 ExtracStrings를 사용합니다.
근데.. 아시듯이 이넘은 몇가지 문제가 있습니다. 뭐 제가 사용법을 몰라서 그럴수도 있구요 ^^;
예를들어 의 경우 #1로 구분자를 넣는경우 2번 내용이 없어서 ‘1번’+#1#1+’3번’을 만들고 이 값을
ExtracStrings하시면 StringList에 ‘1번’, ‘3번’ 만 나오는 것이죠.
의도와는 다른 값이 나와 가끔 당황스럽습니다.
또 한예는 문자 하나로는 불가능 하고 ‘{1}’처럼 2문자 이상의 문자열로 구분자를 주고 싶은 경우 입니다.
이런 경우도 쪼끔 당황 스럽습니다.
이를 보완하고자 만들어본것인데, 몇년된것을 조금 손봐서 다시 만들었습니다.
소스 나갑니다.
Function Str2Words( CurrentStr, CutStr : String; StrList : TStringList ) : Integer;
Var
TS : String;
LPos, fPos, i,
S_L, C_L : Integer;
pStr, tStr, iStr : PCHar;
bCut : boolean;
Begin
S_L := Length( CurrentStr );
C_L := Length( CutStr );
pStr := PChar( CurrentStr );
tSTr := pStr;
lPos := 0;
fPos := 0;
StrList.BeginUpdate;
try
Repeat
bCut := tStr^ = pChar(CutStr)^;
If bCut then
begin
iStr := tSTr;
for i := 1 to C_L - 1 do
begin
inc( iStr );
if iStr^ <> ( pChar( CutStr ) + i )^ then Break;
end;
if i < C_L Then
bCut := False;
end;
If bCut Then
begin
SetString( TS, pStr, lPos - fPos );
StrList.Add(Ts);
inc( lPos, C_L );
fPos := lPos;
Inc( tStr, C_L );
pStr := tStr;
end
else
begin
inc( lPos );
inc( tStr );
end;
until lPos >= S_L;
SetString( TS, pStr, tStr - pStr );
StrList.Add(TS);
finally
StrList.EndUpdate;
end;
Result := StrList.Count;
End;
>>>>>>>>>>>>>>>>사용법<<<<<<<<<<<<<<<<<<
procedure TForm1.Button1Click(Sender: TObject);
var
Str : string
StrList: TStringList;
begin
Str := '1번'+'{구분자}{구분자}'+'3번'
StrList := TStringList.Create;
Try
StrList.Clear;
If Str2Words( Str ,'{구분자}', StrList ) > 0 then
begin
ListBox1.Items.Clear;
ListBox1.Items.Assign( StrList );
end;
finally
freeAndNil( StrList );
end;
end
참고되시기 바랍니다. << 저작자 : 김말동 >>

최신 댓글