Q&A

  • [다시질문]Length()함수의 리턴 값?
감사합니다.

그리고, 말씀하신 대로 하여 보았습니다.

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

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

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

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

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

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

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

아무 반응이 없습니다.



제 질문을 다시 정리하면,

RichEdit의 WordWrap 프로퍼티가 True인 상태에서 Width의 값을

초과하여 라인을 입력하면 enter없이 라인이 변경되는데,

이때 라인 끝에 어떤 값이 들어가는지 모르겠습니다.

제 생각에는 enter 값(0a0d)은 아니거든요.



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

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

잘못을 지적하여 주시면, 고맙습니다.



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 에러가 발생하는 것으로 추정

//라인 끝에 enter값이 있으면 (1)에러없이 정상 작동하고

// (2)Length() 값이 정상적으로 출력되지만

//라인이 WordWrap=True 상태에서 자동 스크롤이 되었을 때에는

// (1)에러 발생하고

// (2)Length() + 1 값이 출력

// (3) (2)의 +1 값이 무엇인지 궁금합니다.

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;

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

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

1  COMMENTS
  • Profile
    권경부 1999.07.20 08:49
    0D0A는 완전한 엔터를 입력했을때 들어가는 코드입니다.

    문서에는 캐리지리턴과 하드리턴이 있는데 캐리지리턴이 0A값을 가지고 있고 하드리턴이 0D값을 가지고 있죠.

    즉, 자동으로 줄바꿈이 된곳에는 0A값만을 가지고 있을것입니다.

    확인해 보세요.



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

    > 감사합니다.

    > 그리고, 말씀하신 대로 하여 보았습니다.

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

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

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

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

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

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

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

    > 아무 반응이 없습니다.

    >

    > 제 질문을 다시 정리하면,

    > RichEdit의 WordWrap 프로퍼티가 True인 상태에서 Width의 값을

    > 초과하여 라인을 입력하면 enter없이 라인이 변경되는데,

    > 이때 라인 끝에 어떤 값이 들어가는지 모르겠습니다.

    > 제 생각에는 enter 값(0a0d)은 아니거든요.

    >

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

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

    > 잘못을 지적하여 주시면, 고맙습니다.

    >

    > 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 에러가 발생하는 것으로 추정

    > //라인 끝에 enter값이 있으면 (1)에러없이 정상 작동하고

    > // (2)Length() 값이 정상적으로 출력되지만

    > //라인이 WordWrap=True 상태에서 자동 스크롤이 되었을 때에는

    > // (1)에러 발생하고

    > // (2)Length() + 1 값이 출력

    > // (3) (2)의 +1 값이 무엇인지 궁금합니다.

    > 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;

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

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





    • 하윤철
      1999.05.05 00:45
      송수정 wrote: > 델파이 3.0을 쓰고 있습니다. > DB에 있는 내용을 레포트로 출력하고자 할때 > 퀵레...
    • Crow2020
    • 1999.07.18 00:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 권경부
      1999.07.20 08:51
      쩝.. 프린터가 잘 설정이 안되었다는 이야기네요. 즉, 컴퓨터에 연결되지않은 프린터나 유령프린터를 설...
    • 배재민
    • 1999.05.05 00:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.05 04:36
      아래의 내용을 살펴보니.. try ...finally.. 의 사용에 대해 이해가 조금 부족한듯 싶습니다. finall...
    • 송기원
    • 1999.07.17 21:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 전철호
      1999.07.19 18:46
      송기원 께서 말씀하시기를... > Tedit에서 현재 caret의 위치를 구할려면 어떻게 해야 합니까? > > 예...
    • 하윤철
      1999.05.05 00:45
      송수정 wrote: > 델파이 3.0을 쓰고 있습니다. > DB에 있는 내용을 레포트로 출력하고자 할때 > 퀵레...
    • 이정환
    • 1999.07.17 18:20
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 권경부
      1999.07.20 08:49
      0D0A는 완전한 엔터를 입력했을때 들어가는 코드입니다. 문서에는 캐리지리턴과 하드리턴이 있는데 캐리지...
    • 문의득
    • 1999.07.17 16:30
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하윤철
      1999.05.04 23:44
      1. Tab control을 올려놓고 폼 색상을 바꾸면... 텝들의 색상은 따라서 안바뀌고 윈도우의 칙칙한 회색...
    • 안치봉
      1999.05.05 01:25
      하윤철 wrote: > 1. Tab control을 올려놓고 폼 색상을 바꾸면... > 텝들의 색상은 따라서 안바뀌고 ...
    • 김종호
    • 1999.07.17 10:07
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김지건
      1999.05.04 23:29
      프로그램이 실행중에 있을때 TalNet.exe라를 실행화일이 죽는 것을 방지하고 싶은데요...방법을 모르겠...
    • 김성동
      1999.07.17 18:04
      SubKeyList := TStringList.Create; 로 변경하세요. TStrings는 Abstract Class이기 때문에 바로 쓸 수 없...
    • 1999.05.05 01:04
      김지건 wrote: > 프로그램이 실행중에 있을때 TalNet.exe라를 실행화일이 > > 죽는 것을 방지하고 싶...
    • 한재아
      1999.05.04 23:28
      먼저fax에 대한 가르침 너무 감사드립니다. 죄송하지만 앞으로도 DELPHI에 대해 재아가 많이 귀챦게 ...
    • 조복기
      1999.07.17 20:27
      안녕하세요..조복기입니다.. 개발하고있는 프로그램이 C/S 환경이라면 스토드프로시져나 뷰등을 적극...
    • 이정욱
      1999.05.06 00:11
      안녕하세요? 음.. 저를 지목하시다니.. 전 사실 DB쪽은 잘 모릅니다. 모.. 시스템도 잘 못하지만.... DbG...
    • 김영애
    • 1999.05.04 05:26
    • 4 COMMENTS
    • /
    • 0 LIKES
    • BDS
      1999.07.17 04:54
      고수님들의 한수 지도를 부탁드리며.... 검색을 하려고 하는데 검색 버튼을 클릭시 다음과 같은 에러가 '...
    • 하윤철
      1999.05.04 23:12
      김영애 wrote: > 이것을 함으로써 보고서가 어렵다는 것을 다시한번 느꼈습니다.. > 이것을 테이블 4개를...
    • 1999.07.18 06:55
      BDS 께서 말씀하시기를... > 고수님들의 한수 지도를 부탁드리며.... > 검색을 하려고 하는데 검색 버튼...
    • rain
      1999.05.04 05:34
      저는 그와 같은 상황에서는 일종의 View를 만들어서 해결합니다. 아니면, 폼의 내용과는 상관없는 SQL...
    • 이호선
      1999.05.04 21:27
      답변감사합니다.그런데 궁금한것이 더있어서요. Word화일이나 다른 문서화일로도 첨부가 가능한지요. 문...
    • 하윤철
      1999.07.19 20:03
      해봤습니다만 안되더만요. 안되는걸 어쩝니까. 다시 물어보는수 밖에요... 코드를 그대로 올리니 한번 봐...
    • 이정욱
      1999.05.04 22:42
      Word파일을 그림으로 저장하실 수 있으면 가능합니다만, 저희는 그 방법을 모르니 불가능하다고 하겠네요.....
    • 조복기
      1999.07.19 22:17
      안녕하세요..조복기입니다.. 참고가 될 사항만 말씀드리겠습니다. 이기종간의 테이블조인은 필요한...
    • 이호선
    • 1999.05.04 21:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.05.04 22:42
      Word파일을 그림으로 저장하실 수 있으면 가능합니다만, 저희는 그 방법을 모르니 불가능하다고 하겠네요.....
    • 김영옥
    • 1999.05.04 19:32
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 문보석
      1999.07.17 01:38
      안녕하세요... 인터넷 페이지에 있는 서버,클라이언트 소켓을 가지고 Gif 이미지 전송 프로그램을 ...
    • 구창민
      1999.05.04 21:22
      김영옥 wrote: > 싱그러운 아침입니다. > 다들 어제의 비가 반가웠겠죠... > 다름 아니라 ... 제가 델파...
    • 1999.05.04 21:20
      김영옥 wrote: > 싱그러운 아침입니다. > 다들 어제의 비가 반가웠겠죠... > 다름 아니라 ... 제가 델파...
    • 호의석
    • 1999.07.17 00:20
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 손창근
      1999.07.17 00:51
      안녕하세요.. 오공이 입니다. 다음 팁은 각 셀에 color을 넣는 Tip입니다. 이걸 이용하시면 원하시는 ...
    • 김영옥
    • 1999.05.04 19:32
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      1999.05.04 21:22
      김영옥 wrote: > 싱그러운 아침입니다. > 다들 어제의 비가 반가웠겠죠... > 다름 아니라 ... 제가 델파...
    • 1999.05.04 21:20
      김영옥 wrote: > 싱그러운 아침입니다. > 다들 어제의 비가 반가웠겠죠... > 다름 아니라 ... 제가 델파...
    • 델초보
    • 1999.07.17 00:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이상준
      1999.07.17 02:21
      델초보 께서 말씀하시기를... > 델파이에서 win.ini말고 일반 .ini화일을 읽어올때 > 섹션명만 읽어오는 ...
    • 고혜정
    • 1999.05.04 18:50
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 신진욱
      1999.07.06 09:05
      고혜정 께서 말씀하시기를... > 다음과 같은 에러가 발생해서 도움을 청하려 합니다. > Error : Cannot ...
    • 1999.05.04 21:17
      고혜정 wrote: > 다음과 같은 에러가 발생해서 도움을 청하려 합니다. > Error : Cannot make a visible...
    • 이정욱
      1999.05.04 21:17
      이미 보여주고 있는 창을 또 ShowModal을 하시려는것 같습니다. 일단 그 폼의 Visible을 False로 주시고 S...