Q&A

  • Length()함수의 리턴값?
RichEdit1.Lines[1]의 길이를 Length()함수로 구하였더니,

다음과 같은 문제가 발생하였습니다.



(1) Line의 끝에 enter키 값이 있을 때와

예) This is a school.(enter) ->RichEdit1.Lines[1]

(2) Line의 끝에 enter키 값이 없이 다음 Line과 연결될 때

예) This is a (여기에는 enter 값이 없음) ->RichEdit1.Lines[1]

school.(여기에서 enter) ->RichEdit1.Lines[2]



위의 예에서 (1) 번의 Line 길이를 Length() 함수로

구하여 'T' 'h' 'i' 등등으로 읽었더니 아무 문제가 없는데,



(2)번의 Line 길이를 (1)번과 같은 방법으로 구하여

읽었더니 라인의 끝에서 "EAccessViolation" 에러가 발생합니다.



라인의 끝에 enter 값이 없을 때 어떤 값이 들어가는지 궁금하고,

EAccessViolation 에러를 어떻게 처리할 수 있는지 궁금합니다.

Length()의 리턴 값이 (1)과 (2)에서 어떻게 차이가 있는지요.



고맙습니다.





2  COMMENTS
  • Profile
    구창민 1999.07.14 18:59
    이정환 께서 말씀하시기를...

    > RichEdit1.Lines[1]의 길이를 Length()함수로 구하였더니,

    > 다음과 같은 문제가 발생하였습니다.

    >

    > (1) Line의 끝에 enter키 값이 있을 때와

    > 예) This is a school.(enter) ->RichEdit1.Lines[1]

    > (2) Line의 끝에 enter키 값이 없이 다음 Line과 연결될 때

    > 예) This is a (여기에는 enter 값이 없음) ->RichEdit1.Lines[1]

    > school.(여기에서 enter) ->RichEdit1.Lines[2]

    >

    > 위의 예에서 (1) 번의 Line 길이를 Length() 함수로

    > 구하여 'T' 'h' 'i' 등등으로 읽었더니 아무 문제가 없는데,

    >

    > (2)번의 Line 길이를 (1)번과 같은 방법으로 구하여

    > 읽었더니 라인의 끝에서 "EAccessViolation" 에러가 발생합니다.

    >

    > 라인의 끝에 enter 값이 없을 때 어떤 값이 들어가는지 궁금하고,

    > EAccessViolation 에러를 어떻게 처리할 수 있는지 궁금합니다.

    > Length()의 리턴 값이 (1)과 (2)에서 어떻게 차이가 있는지요.

    >

    > 고맙습니다.

    >

    >



    이정환님 안녕하세요?

    저는 잘 되는 걸요?

    혹시, RichEdit의 라인이 10 라인이라면

    RichEdit.Lines[10] 이라고 쓰신것은 아닌지요?

    첨자는 0 부터 시작하기 때문에 마지막 라인은 9가 됩니다.

    그리고, 궁금해 하시는 Enter에는 0A0D(16진수)가 들어가게 됩니다.

    라인을 내리고, 컬럼의 가장앞으로 가게하는 제어 문자입니다.



    그리고, 아래처럼 테스트 해보세요.

    procedure TForm1.Button1Click(Sender: TObject);

    var i: integer;

    begin

    for i:= 0 to RichEdit1.Lines.Count -1 do

    ShowMessage( IntToStr(Length(RichEdit1.Lines[i])) );

    end;

    바로 쓴글이라 오타가 있을수 있습니다.

    그럼.. 즐거운 프로그래밍 되세요~

  • Profile
    이정환 1999.07.16 21:55
    말씀하신 대로 하여 보았습니다.

    그랬더니 (1) 라인 끝에서 Enter(0A0D)를 치고 다음 라인으로 바꾼 곳은

    정상으로 IntToStr()값이 리턴되는데,

    (2) 타자할 때, 라인 끝에서 글자가 넘쳐서 자동으로 라인이 바뀐

    곳에서는 "IntToStr()값 +1"이 리턴됩니다. 그래서 혹시 자동으로 라인이

    바뀐 문장의 끝에 나타나는 "+1"값이 nil 또는 space 값인가 하여서

    "if 라인끝=nil then ShowMessage('nil')"

    "if 라인끝=' ' then ShowMessage('space')" 등등으로 테스트하여 보았는데,

    아무 반응이 없습니다.



    (2)의 라인 끝에 어떤 값이 들어가는지 여전히 궁금합니다.



    델파이 초보라서 질문이 서툴러서 죄송합니다. 아래에 제가 라인값이 필요한

    함수를 함께 보냅니다. 혹시 제가 엉터리로 질문한 것이면 코딩을 보시고

    잘못을 지적하여 주세요. 고맙습니다.



    procedure get_c_token();

    var

    firstTokenindex, count: integer; //한 Char씩 읽다가 각 token별로

    //묶기 위한 값을 계산하는 변수

    begin

    T:='';

    t_temp:='';

    c_tokentype:=' ';

    firstTokenindex:=0;

    count:=0;



    //각 line의 끝을 화면에 표시하고 TokenType을 'E'로

    if linelengthindex > length(Linestring)

    then begin

    t:='end(문장이 끝났습니다.)';

    c_tokentype:='E';

    exit;

    end;



    //line의 끝이 아니면 1 Char를 Token으로 얻기

    T:= Copy(linestring, linelengthindex,1);



    //공백 문자를 건너 뛰기

    while T = ' '

    do begin

    inc(linelengthindex);

    T:= Copy(linestring, linelengthindex,1);

    end;



    //숫자를 Token으로 얻기

    if ((T >= '0') and (T <= '9')) then

    begin

    firstTokenindex:= linelengthindex;

    while ((T >= '0') and (T <= '9')) do

    begin

    c_tokentype := 'N';

    inc(linelengthindex);

    inc(count);

    T:= Copy(linestring, linelengthindex,1);

    end;

    T:= Copy(linestring, firstTokenindex, count);

    end



    //한글을 Token으로 얻기

    else if IsDBCSLeadByte(byte(linestring[linelengthindex]))

    then

    begin

    firstTokenindex:= linelengthindex;

    while

    IsDBCSLeadByte(byte(linestring[linelengthindex])) do

    begin

    c_tokentype := 'H';

    T:= Copy(linestring, linelengthindex,2);

    inc(linelengthindex);

    inc(count);

    inc(count);

    if

    IsDBCSLeadByte(byte(linestring[linelengthindex])) then

    inc(linelengthindex);

    end;

    T:= Copy(linestring, firstTokenindex, count);

    end



    //한글도 숫자도 아니면 아래 부분을 처리

    else begin

    inc(linelengthindex);

    //이 부근에서 EAccessViolation 에러가 발생하는 것으로 추정

    c_toKentype := T[1];

    end;



    end;





    답해주셔서 거듭 고맙습니다. 위의 코딩을 보시고 문제가 발견되면 좋겠습니다.

    저는 프로그램에는 아마추어이고, 어쩌다가 우리말을 공부한 바가 있어서

    "우리말 문법분석기"를 만드는데에 관심이 있습니다.



    시간이 있으시면 다시 답해주시고, 혹시 잘못한 점이 있으면 지적해 주시면

    좋겠습니다.



    고맙습니다.



    이정환 드림.



    구창민 께서 말씀하시기를...

    > 이정환 께서 말씀하시기를...

    > > RichEdit1.Lines[1]의 길이를 Length()함수로 구하였더니,

    > > 다음과 같은 문제가 발생하였습니다.

    > >

    > > (1) Line의 끝에 enter키 값이 있을 때와

    > > 예) This is a school.(enter) ->RichEdit1.Lines[1]

    > > (2) Line의 끝에 enter키 값이 없이 다음 Line과 연결될 때

    > > 예) This is a (여기에는 enter 값이 없음) ->RichEdit1.Lines[1]

    > > school.(여기에서 enter) ->RichEdit1.Lines[2]

    > >

    > > 위의 예에서 (1) 번의 Line 길이를 Length() 함수로

    > > 구하여 'T' 'h' 'i' 등등으로 읽었더니 아무 문제가 없는데,

    > >

    > > (2)번의 Line 길이를 (1)번과 같은 방법으로 구하여

    > > 읽었더니 라인의 끝에서 "EAccessViolation" 에러가 발생합니다.

    > >

    > > 라인의 끝에 enter 값이 없을 때 어떤 값이 들어가는지 궁금하고,

    > > EAccessViolation 에러를 어떻게 처리할 수 있는지 궁금합니다.

    > > Length()의 리턴 값이 (1)과 (2)에서 어떻게 차이가 있는지요.

    > >

    > > 고맙습니다.

    > >

    > >

    >

    > 이정환님 안녕하세요?

    > 저는 잘 되는 걸요?

    > 혹시, RichEdit의 라인이 10 라인이라면

    > RichEdit.Lines[10] 이라고 쓰신것은 아닌지요?

    > 첨자는 0 부터 시작하기 때문에 마지막 라인은 9가 됩니다.

    > 그리고, 궁금해 하시는 Enter에는 0A0D(16진수)가 들어가게 됩니다.

    > 라인을 내리고, 컬럼의 가장앞으로 가게하는 제어 문자입니다.

    >

    > 그리고, 아래처럼 테스트 해보세요.

    > procedure TForm1.Button1Click(Sender: TObject);

    > var i: integer;

    > begin

    > for i:= 0 to RichEdit1.Lines.Count -1 do

    > ShowMessage( IntToStr(Length(RichEdit1.Lines[i])) );

    > end;

    > 바로 쓴글이라 오타가 있을수 있습니다.

    > 그럼.. 즐거운 프로그래밍 되세요~