귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
강좌, 팁, 정보 강좌, 팁, 정보 입니다.
글내용 - 강좌, 팁, 정보
 델파이7의 TStringList에서 공백으로도 분리되는 증상 때문에 찾은 자료입니다.
자연사랑100
(유성욱)
2020-08-05 오전 3:17:18
카테고리: 팁
718회 조회



등록된 파일이 없습니다.

델파이7의 TStringList에서 commaText를 사용해 보면, 의도하지 않게 공백도 콤마처럼 구분자로 사용되는 것을 알 수 있습니다.

 

상위 버전에서는 StrictDelimiter 가 생겨서 별로 필요없겠지만, 아직도 하위 버전으로 개발하고 있는 사람에게는 유용한 기능입니다.

 

소스 구글링해 보시면 commaText는 올라와 있는데,

delimitedText 는 안 보이더라고요.

 

그래서 시험삼에 구글링해서 구한 소스를 조금 변경해 delimitedText 도 공백이 구분자로 되지 않게 잘 됩니다. 도움 되시길...

 

사용법:

var

  tcs: TCommaStrings;

begin

  tsc:= TCommaStrings.Create;

  tsc.commaText:= '1   2, 3  4';

  -> 결과:

tsc[0] -> 1    2

tsc[1] -> 3    4

 

end;

 

===== 이하 오브젝트입니다 ====

{ TCommaStrings }


  TCommaStrings = class(TStringList)
  private
    function GetCommaText: string;
    procedure SetCommaText(const Value: string);
    function GetDelimitedText: string;
    procedure SetDelimitedText(const Value: string);
  public
    property CommaText: string read GetCommaText write SetCommaText;
    property DelimitedText: string read GetDelimitedText write SetDelimitedText;
  end;

 


{ TCommaStrings }

function TCommaStrings.GetCommaText: string;
var
  S: string;
  P: PChar;
  I, Count: Integer;
begin
  Count := GetCount;
  if (Count = 1) and (Get(0) = '') then
    Result := '""'
  else
  begin
    Result := '';
    for I := 0 to Count - 1 do
    begin
      S := Get(I);
      P := PChar(S);
      while not (P^ in [#0..' ', '"', ',']) do
        P := CharNext(P);
      if (P^ <> #0) then
        S := AnsiQuotedStr(S, '"');
      Result := Result + S + ',';
    end;
    System.Delete(Result, Length(Result), 1);
  end;
end;


procedure TCommaStrings.SetCommaText(const Value: string);
var
  P, P1: PChar;
  S: string;
begin
  BeginUpdate;
  try
    Clear;
    P := PChar(Value);
    while P^ in [#1..' '] do
      P := CharNext(P);
    while P^ <> #0 do
    begin
      if P^ = '"' then
        S := AnsiExtractQuotedStr(P, '"')
      else
      begin
        P1 := P;
        while (P^ >= ' ') and (P^ <> ',') do
          P := CharNext(P);
        SetString(S, P1, P - P1);
      end;
      Add(S);
      while P^ in [#1..' '] do
        P := CharNext(P);
      if P^ = ',' then
      begin
        repeat
          P := CharNext(P);
        until
          not (P^ in [#1..' ']);
        if P^ = #0 then
          Add('') {Trailing commas ARE another field!}
      end;
    end;
  finally
    EndUpdate;
  end;
end;


function TCommaStrings.GetDelimitedText: string;
var
  S: string;
  P: PChar;
  I, Count: Integer;
begin
  Count := GetCount;
  if (Count = 1) and (Get(0) = '') then
    Result := '""'
  else
  begin
    Result := '';
    for I := 0 to Count - 1 do
    begin
      S := Get(I);
      P := PChar(S);
      while not (P^ in [#0..' ', '"', Delimiter {','}]) do
        P := CharNext(P);
      if (P^ <> #0) then
        S := AnsiQuotedStr(S, '"');
      Result := Result + S + Delimiter {','};
    end;
    System.Delete(Result, Length(Result), 1);
  end;
end;


procedure TCommaStrings.SetDelimitedText(const Value: string);
var
  P, P1: PChar;
  S: string;
begin
  BeginUpdate;
  try
    Clear;
    P := PChar(Value);
    while P^ in [#1..' '] do
      P := CharNext(P);
    while P^ <> #0 do
    begin
      if P^ = '"' then
        S := AnsiExtractQuotedStr(P, '"')
      else
      begin
        P1 := P;
        while (P^ >= ' ') and (P^ <> Delimiter{ ','}) do
          P := CharNext(P);
        SetString(S, P1, P - P1);
      end;
      Add(S);
      while P^ in [#1..' '] do
        P := CharNext(P);
      if P^ = Delimiter{ ','} then
      begin
        repeat
          P := CharNext(P);
        until
          not (P^ in [#1..' ']);
        if P^ = #0 then
          Add('') {Trailing commas ARE another field!}
      end;
    end;
  finally
    EndUpdate;
  end;
end;