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

C++빌더 Q&A
C++Builder Programming Q&A
[1596] [질문] TRichEdit의 각 줄 정렬방법?/프포
존재무상 [ ] 3792 읽음    1999-07-17 20:17
읽어 주셔서 감사합니다.
조금 길더라도 끝까지 읽으시고 도와주시기 바랍니다.

******************************************************************
질문요지:
TRichEdit의 각 줄을 오름차순이나 내림차순으로 정렬할 때 각 줄의 번지 얻기.
******************************************************************
TListView, TTreeView의 경우 오름차순 정렬을 지원하지만
TRichEdit , TStringList는 이것을 지원하지 않습니다.

1. TRichEdit의 각 줄의 내용은 AnsiString으로서 Lines->Strings[index]로
   참조합니다.
2. 잠시 TRichEdit가 아닌 일반 텍스트 정렬을 살펴보면:

  가. 택스트 배열을 정렬할 때 둘을 서로 바꾸게 되는 데 보통은
       (char  array[줄수][최대길이+1], ex[최대길이+1];)
      strcpy(ex,array[n]);
      strcpy(array[n],array[m]);
      strcpy(array[m],ex);
     이렇게 합니다.
     그런데 이렇게 하다보면 시간이 많이 걸립니다.
  나. 그래서 빠르게 하려면 포인터를 사용하여
     ( char  *pointer[줄수], *ex; )
     ex=pointer[n];
     pointer[n] = pointer[m];
     pointer[m] = ex;
     이렇게 합니다.
     물론 이때는 택스트를 저장할 기억공간을 동적으로 할당합니다.
     (
       문자열을 파일에서 읽어 pointer배열에 저장한다고 했을 때
       ( char buffer[MaxLen+1];   FILE *fp; )
       fgets(buffer,MaxLen,fp);
       pointer[n] = new char[strlen(buffer)+1];
       strcpy(pointer[n], buffer);
       이렇게 합니다.
      )
3. 확실히 포인터를 이용하는 것이 빠릅니다.
   그래서 TRichEdit의 각 줄을 정렬할 때 포인터를 사용하려 합니다.
    TRichEdit의 각 줄은 AnsiString클래스의 객체이며
    RichEdit1->Lines->Strings[index]와 같이 참조합니다.
4. TRichEdit의 각 줄이 AnsiString이므로

  함수호출: SortInitiate(RichEdit1->Lines);

  void  SortInitiate(TStrings *List)
  {
    AnsiString **MyList;
    int n;
    MyList = new AnsiString * [줄수];
    for(n=0; n<List->Count ; n++)
    {
      MyList[n]= & List->Strings[n];
    }
    Sort(MyList, List->Count);
     .
     .
     .
    delete MyList;
  }

void Sort(AnsiString **List, int count)
{
   AnsiString *ex;
   .
   .
   .
   if( *List[n] > *List[m] )
   {
     ex = List[n];
     List[n] = List[m];
     List[m] = ex;
   }
   .
   .
   .
  }

5. 그런데 위와 같이 하면 처리가 안됩니다.
   SortInitiate함수의
     for(n=0; n<줄수 ; n++)
    {
      MyList[n]= & List->Strings[n];
    }
   에서  MyList[n]= & List->Strings[n]은
   RichEdit1의 각 줄의 번지를 AnsiString형 포인터배열인 MyList에
   할당하는 것인데 의도대로  되지 않습니다.

6. 문제는 Richedit1->Lines->Strings[index]가 AnsiString클래스
   객체이며 이 것의 번지를 얻는 방법이
   &(Richedit1->Lines->Strings[index])가 아닌 모양입니다.

*********************************************************
어떻게 하여야 할까요?
반드시 TRichEdit를 사용하여야 합니다.
그리고 소요시간도 가장 짧아야 합니다.
(힙소트가 빠른 것으로 아는데 그 알고리즘은 이미 완성하였습니다.)
문제는 6번입니다.

어떻게 해야 할까요??????????

많은 분들의 조언을 부탁 드립니다.
감사합니다.
**********************************************************


+ -

관련 글 리스트
1596 [질문] TRichEdit의 각 줄 정렬방법?/프포 존재무상 3792 1999/07/17
1599     [답변] 존재무상/ TRichEdit의 각 줄 정렬방법?/프포 박지훈.임프 3558 1999/07/17
1609     [답변] 존재무상/ TRichEdit의 각 줄 정렬방법?/프포 박지훈.임프 3791 1999/07/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.