C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[474] TMemo에 (공백을 제외한) 문자가 있는지 검사하기
evergreen [heredity] 8324 읽음    2005-06-27 22:11
안녕하세요. heredity입니다.
팁이라고 하기엔 너무 초라한 허접 팁을 하나 소개합니다.

예전엔 TMemo가 비었는지 아닌지 검사할 땐 heredity는
  "혹시 공백이 입력됐으면 어떻게 하누~, Memo내 모든 스트링을 검사해야 겠다"
하여
      :
      :
  bool bEmpty = true;

  for( int nI = 0; nI < Memo1->Lines->Count; nI++ ) {
    if( Memo1->Lines->Strings[nI].Trim() != "" ) {
      bEmpty = false;
      break;
    }
  }

  if( bEmpty ) {     // <-- 2005.07.04   if( !bEmpty )를 if( bEmpty ) 로 고칩니다.
    ShowMessage( "내용 없음." );  
  }
      :
      :
와 같이 검사했었습니다.

오늘도 위와같은 코드를 작성하려니 손가락이 자기는 죽어도 쌩 노가다는 할 수 없다며
거부 반응을 보이기 시작합니다.
어쩔수 없이 안 돌아가는 머리에 기름칠하고 돌리기 시작하니 "필요는 발명의 어머니"라고
간단한(?) 수가 생각 나더군요.

if( Memo1->Lines->Text.Trim() == "" ) {   // if 조건문내 !=를 == 로 고칩니다.
    ShowMessage( "내용 없음." );  
}

허걱! 이렇게 간단한 수가... 왜 이 생각을 지금까지 못했을까?
순간 그동안 주인 잘못 만나서 고생한 손가락이 생각나더군요.
미안하다 나의 손가락아. 이 못난 쥔을 용서하렴  ㅜ.ㅠ
황경록 [mpbox]   2005-06-27 23:35 X
음 죄송합니다. -_- 흘흘 Memo1->Lines->Text 를 Memo1->Text 로 하셔도 되구요.
좀더 프로그래머틱(? 누구의 기준이냐~~~~ 흐~) 하게 하려면 Memo1->Text.Trim().Length() == 0 으로 하신다면 ^^:: 어떨까요~
박지훈.임프 [cbuilder]   2005-07-02 05:39 X
죄송합니다만...
말씀하신 두가지 소스는 다르게 동작합니다.

아마도 Trim() 함수를 잘못 이해하신 것이 아닌가 싶습니다. Trim()함수는 인자로 넘긴 문자열 전체에서 공백을 지우는 것이 아니라, 인자 문자열의 앞/뒷부분에 있는 공백만 삭제합니다. 따라서 Trim(" qqq qq ")는 "qqqqq"가 되는 것이 아니라 "qqq qq"가 됩니다.

따라서, 처음 보여주신 코드는 각 라인마다 앞/뒤의 공백을 지우는 코드이고, 뒤에 보여주신 코드는 여러 라인으로 된 문자열 전체에서 맨 앞의 공백(첫줄의 앞 공백)과 맨 뒤의 공백(마지막줄 뒷 공백)만 삭제합니다.
황경록 [mpbox]   2005-07-03 20:24 X
어쨌든 포인트는 중간공백은 포함시킨다라고 해야 겠네요 ^^...
음... 그냥 Memo1->Text.Length() 를 통해 값을 통해 내용이 있나 없나를 검사하다 입력된 문자열의 앞뒤 공백때문에 문제가 생기셨던걸로 보입니다. 그래서 Trim() 함수를 쓰게 된것 같네요. 그리고 참고적으로 Memo1 에서 각 라인은 \r\n 으로 구분이 되는데 Trim() 함수를 쓰면 이를 제거 하게 되는 효과가 되어 입력된 문자열을 정확하게(?) 판단할 수 있게 되는 것 같습니다.

결국... "  12 34\r\n" 이런 것이 Memo1 에 입력되어 있는 경우 "12 34" 를 빼어내 이를 검사하는 걸로 Memo1->Text.Trim().Length() 이러한 문장이 나오지 않았는가 생각됩니다 ^^... @.@ 글을 쓰다보니 음 뭔가 정리가;;;
evergreen [heredity]   2005-07-04 00:30 X
내용중 잘못된 부분을 바꿨습니다. 꾸벅   ㅡ.ㅡ
  if( !bEmpty )  -->  if( bEmpty )
  if( Memo1->Lines->Text.Trim() != "" )  -->  if( Memo1->Lines->Text.Trim() == "" )

참고로 위 팁의 경우 Trim()보단 TrimLeft()가 더 적절한 것 같습니다.
(TrimRight()가 더 적합할 지도.... --;)
글구.... 음~ 리플이 몇개 달렸군요.

먼저 황경록님께....
  1. Memo1->Text.Trim().Length() == 0에 대하여
     별 차이는 없겠지만
       Memo1->Text.Trim().Length() == 0   // 문자열.Length() == 0
     보단
       Memo1->Text.Trim() == ""           // 문자열 == ""
     이 더 읽기 편해 보입니다 (개인적인 취향차이일수도 ....)
     처리 속도 면에선 Memo1->Text.Trim().Length()이 좋아 보입니다.

     Memo1->Lines->Text는 Memo1->Text를 쓰는 것은
       ... --> TWinControl --> TCustomEdit --> TEdit
                           --> TCustomEdit --> TCustomMemo --> TMemo
     의 형태로 상속됐으니 당연하겠구요(좋은 지적 감사합니다.)

다음은 임프님께...
  본 팁의 요점은 Memo1의
     첫번째 줄 ""
     두번째 줄 "    \t   "
     세번째 줄 "   "
  와 같은 경우 Trim("\r\n    \t   \r\n   \r\n")이 ""을 돌려주는 것을 이용해
  TMemo에 적용한 겁니다.

내용중 잘못된 부분을 바꿨습니다. 꾸벅   ㅡ.ㅡ
  if( !bEmpty )  -->  if( bEmpty )
  if( Memo1->Lines->Text.Trim() != "" )  -->  if( Memo1->Lines->Text.Trim() == "" )

참고로 위 팁의 경우 Trim()보단 TrimLeft()가 더 적절한 것 같습니다.
(TrimRight()가 더 적합할 지도.... --;)
글구.... 음~ 리플이 몇개 달렸군요.

먼저 황경록님께....
  1. Memo1->Text.Trim().Length() == 0에 대하여
     별 차이는 없겠지만
       Memo1->Text.Trim().Length() == 0   // 문자열.Length() == 0
     보단
       Memo1->Text.Trim() == ""           // 문자열 == ""
     이 더 읽기 편해 보입니다 (개인적인 취향차이일수도 ....)
     처리 속도 면에선 Memo1->Text.Trim().Length()이 좋아 보입니다.

     Memo1->Lines->Text는 Memo1->Text를 쓰는 것은
       ... --> TWinControl --> TCustomEdit --> TEdit
                           --> TCustomEdit --> TCustomMemo --> TMemo
     의 형태로 상속됐으니 당연하겠구요(좋은 지적 감사합니다.)

다음은 임프님께...
  본 팁의 요점은 Memo1의
     첫번째 줄 ""
     두번째 줄 "    \t   "
     세번째 줄 "   "
  와 같은 경우 Trim("\r\n    \t   \r\n   \r\n")이 ""을 돌려주는 것을 이용해
  TMemo에 적용한 겁니다.

오해 없으시길...
evergreen [heredity]   2005-07-04 00:33 X
켁~ 붙여넣기 했더니 2번이나 반복됐네.... 꾸벅 -_-;;
황경록 [mpbox]   2005-07-04 07:21 X
헤헤 ^^; 델파이 생각나는 군요... 결국 델파이 코딩 스타일로;;;
Memo1->Text.Trim() == "" 을
Memo1->Text.Trim().IsEmpty() 로~
evergreen [heredity]   2005-07-04 14:27 X
ㅋㅋㅋ
사실 IsEmpty()가 거의 필요 없어 보이는 함수처럼 보여도 가독성을 높이기엔 따봉이죠!
IsEmpty() 사용에 한표(?) !

+ -

관련 글 리스트
474 TMemo에 (공백을 제외한) 문자가 있는지 검사하기 evergreen 8324 2005/06/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.