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
[66361] Re:Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요..
김태우 [hananet0282] 1556 읽음    2012-02-21 23:28
감사합니다...
잘 이해가 되었습니다....

그런데 StringGrid1DrawCell 를 이용해서 보이는 부분만 출력해 주려고 하는데요...
StringGrid1DrawCell의 TRect &Rect 를 이용하면 될것같은데..
그 범위를 어떻게 지정하고 스트링 그리드에 스크롤이 생겼을경우 스크롤이동시에
그 범위를 다시 잡아줘되는데... 흠...초보라 그런지..
뭐 거이 밥상차려달라는 수준식으로 여쭈어보고만있네요.ㅜㅜㅜ



장성호 님이 쓰신 글 :
: 제가 얘기한 속도개선방안중
:
: 첫째는 Data읽어오는 속도 개선방안이구
: 둘째는 읽어온 Data를 표시하는 속도 개선방안입니다.
:
: ------------------------------------------
:
: 둘째 방안에 대해서..
: ListView를 사용하시라는 예기는 아니구요
: VirtualListView처럼 Grid의 Cell에 내용을 입력하지 말고
: Data를 따로 메모리에 가지고 있다가
: Grid의 OnDrawCell이벤트에 표시만 해주는 방식을 얘기한것입니다.
:
: 첫번째 방안인 엑셀내용을 Clipboard를 이용해서 읽어오는 방법은
: 다음 링크를 참조하세요
: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=1075
:
: ------------------------------------------
:
: 둘중 하나만 개선되어도 속도가 많이 좋아지겠지만
: 둘다 개선되면 훨씬더 좋을것 같습니다.
:
: 그럼..
:
: 김태우 님이 쓰신 글 :
: : 답변 감사합니다...
: : 한가지 여쭈어 보고싶은게 있습니다..
: : Clipboard를 이용해 한번에 한페이지 전체를 읽어오는걸 알고 싶습니다.
: :
: : 대충 검색을 해보니.. 셀이나 범위를 지정해서 가져오던데요..
: : 범위 지정말고 엘셀시트1 이나 시트2 이렇게 있듯이..
: : 원하는 시트의 전체를 내용부분을 다 클립보드에 복사해 줄수있는 방법이 있는지요...
: : ListView사용도 지금 구현해 보고있으나.. 클립보드 방식도 괜찮을듯 해서요..
: : 가져오고나서 탭으로 짤라서 쓰면될듯해서요.
: :
: :
: : 장성호 님이 쓰신 글 :
: : : 음...
: : :
: : : 이길남.HoPe 님의 첫번째 방법은  제 pc에서는 15초 이상 걸리네요.  제pc가 많이 느린가봐요
: : :
: : : 김태우 님께서 Grid에 Excell의 내용을 가져와서 표시하는데 시간이 걸리는 이유는 크게 2가지가 있는것 같습니다.
: : :
: : : Grid업데이트 시간 소요원인
: : :
: : : 1. 첫번째 이유는
: : :      박우성님이 말씀하셨듯이 OLE-Automation으로 엑셀의 Data를 읽어오는 방법이 빠르지가 않습니다.
: : :      Grid에 넣지 않고 읽어오는 코드만 실행해보시면 한참 시간이 걸린다는것을 쉽게 확인할수 있을것입니다.
: : :
: : : 2. 두번째 느린이유는 ..
: : :     Grid의 Cell에 데이타를 입력하는 과정이 좀 복잡합니다.
: : :     Beginupdata / Endupdate로 화면갱신을 멈춰놓고 데이타 입력만 하더라도..
: : :     Grid는 각 Cell의 Data를 Row별로 , Col별로 전체를 읽어올수 있도록 만들어져 있어서..
: : :     하나의 Cell에 입력할때마다 Row별 , Col별로 있는 TStringGridStrings에 데이타를 업데이트합니다.
: : :
: : :
: : : Grid업데이트 속도 개선 방법
: : :
: : : 1.  엑셀 읽어오는 속도 개선 방법
: : :     * 박성우님이 제시한 방법대로 Excel파일을 열어서 직접읽어오는 방법(컴포넌트 사용등)으로 방법이나..
: : :     * OLE-Automation이라도 한셀씩 읽어오지 않고, Clipboard를 이용해 한번에 한페이지 전체를 읽어오면 빠릅니다.
: : :
: : :     
: : : 2. Grid에 Data입력 속도 개선방법
: : :     " 어떤 작업을 가장 빠르게 하는 방법은?  아무 작업을 하지 않는것입니다."
: : :     뭔말인고 하니 , 작업은 하지 않더라도 단지 한것처럼 보이기만 하면 작업한것이나 다름 없겠죠~!
: : :
: : :    Grid 의 각 Cell에 Data를 입력하지 않고..
: : :    RowCount , ColCount 만 변경해주고
: : :    화면에 보일때 OnDrawCell 이벤트를 이용해 표시만 해주는것입니다.
: : :  
: : :    Windows의 탐색기(Explorer.exe) 의 File/Folder표시하는 ListView도
: : :     Virtual-List로 만들어 쓰는데.. 바로  그런원리입니다.
: : :    참조 http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=899
: : :
: : :    위와같이 Grid를 만들어 쓰면
: : :    수천개 Row/Col 이라 하더라도 실제로 화면에 보이는것은  많아야 수십개 정도니..
: : :    버벅거림을 느끼지 않게 만들수 있습니다.
: : :
: : :
: : : 그럼...    
: : :
: : :
: : : 김태우 님이 쓰신 글 :
: : : : 답변 감사합니다..
: : : : 하지만.. 지금 님같은 경우는 숫자로만 하셨지만...
: : : : 제가 읽어 들일 파일들은 문자도 있고 숫자도 있고 빈칸도 있는 경우 입니다..
: : : : 마찬가지로..말씀해주신결로 적용을 해보았으나..
: : : : 마찬가지로 시간이 오래 걸리네요..30초 이상으로요..ㅜㅜ
: : : :
: : : :
: : : :
: : : :
: : : : 이길남.HoPe 님이 쓰신 글 :
: : : : : 제가 아래와 같이 테스트 해봤습니다.
: : : : : 참조 하세요.
: : : : :
: : : : : Row, Col 수량을 4000씩 잡았습니다.
: : : : : 하기와 같이 하면 약 6~7초 정도 걸렸습니다.
: : : : :
: : : : :     int row = StringGrid1->RowCount - 1;
: : : : :     int col = StringGrid1->ColCount - 1;
: : : : : 
: : : : :     unsigned long tt = GetTickCount();
: : : : : 
: : : : :     for(int j = 1; j < row + 1; j++)    StringGrid1->Rows[j]->BeginUpdate();
: : : : :     for(int i = 1; i < col + 1; i++)    StringGrid1->Cols[i]->BeginUpdate();
: : : : : 
: : : : :     for(int j = 1; j < row + 1; j++)
: : : : :     {
: : : : :         for(int i = 1; i < col + 1; i++)
: : : : :         {
: : : : :             StringGrid1->Cells[i][j] = IntToStr(i);
: : : : :         }
: : : : :     }
: : : : :     for(int j = 1; j < row + 1; j++)    StringGrid1->Rows[j]->EndUpdate();
: : : : :     for(int i = 1; i < col + 1; i++)    StringGrid1->Cols[i]->EndUpdate();
: : : : : 
: : : : :     Caption = GetTickCount() - tt;
: : : : : 

: : : : :
: : : : : 하기와 같이 하면 약17초 정도 걸리거더군요.
: : : : :
: : : : :     int row = StringGrid1->RowCount - 1;
: : : : :     int col = StringGrid1->ColCount - 1;
: : : : : 
: : : : :     unsigned long tt = GetTickCount();
: : : : : 
: : : : :     for(int j = 1; j < row + 1; j++)
: : : : :     {
: : : : :         for(int i = 1; i < col + 1; i++)
: : : : :         {
: : : : :             StringGrid1->Cells[i][j] = IntToStr(i);
: : : : :         }
: : : : :     }
: : : : : 
: : : : :     Caption = GetTickCount() - tt;
: : : : : 

: : : : :
: : : : : 이것도 느리면 타이머를 사용해서 조금씩 변경하는 방법이 있습니다.
: : : : :
: : : : : void __fastcall TForm1::Timer1Timer(TObject *Sender)
: : : : : {
: : : : : /*
: : : : :     외부에서 FRowIndex를 0으로 하면 다시 갱신하는 구조입니다. ^^;;
: : : : :     전체를 다 갱신하면 FRowIndex가 RowCount보다 많기 때문에 갱신작업을 하지 않을껍니다.
: : : : : */
: : : : :     if(FRowIndex > StringGrid1->RowCount)
: : : : :     {
: : : : :         Caption = "갱신 완료!";
: : : : :         return;
: : : : :     }
: : : : : 
: : : : :     for(int c = 0; c < StringGrid1->ColCount; c++)
: : : : :     {
: : : : :         StringGrid1->Cells[c][FRowIndex] = IntToStr(c);
: : : : :     }
: : : : : 
: : : : :     Caption = "갱신 중!";
: : : : :     FRowIndex++;
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : : 

: : : : :
: : : : : Ps. 답변이 되실련지 모르겠네요.
: : : : :
: : : : : 김태우 님이 쓰신 글 :
: : : : : : for(int j = 1; j < row+1; j++)
: : : : : :         {
: : : : : :            
: : : : : :             for(int i = 1; i < col+1; i++)
: : : : : :             {
: : : : : :
: : : : : :                 StringGrid1->Cells[i][j] = XLSheet.OlePropertyGet("Cells", j , i).OlePropertyGet("Value");
: : : : : :                 StringGrid1->Cells[0][j] = IntToStr(j);
: : : : : :                 StringGrid1->Cells[i][0] = IntToStr(i);
: : : : : :             }
: : : : : :         }
: : : : : :
: : : : : : StringGrid1->Rows[0]->BeginUpdate();
: : : : : : 이렇게 밖에 사용을 못하나요??
: : : : : :
: : : : : : 그러면 이렇게 엑셀에서 읽어온값을 그리드에 넣어줄때..
: : : : : : 어떻게 사용해야되는건지...
: : : : : : 초보입니다.. 부탁드리겠습니다.
: : : : : : 검색을 해봐도.. 제가 적용하면 마찬가지로 프로그램이 용량이큰엑셀은 30초 정도는 멈춰 있네요..

+ -

관련 글 리스트
66341 StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 2075 2012/02/21
66348     Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 델파이수행중 1787 2012/02/21
66346     Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 박우성 1711 2012/02/21
66343     Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 이길남.HoPe 1435 2012/02/21
66344         Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 1504 2012/02/21
66349             Re:Re:Re: 님~ 테스트에 사용한 엑셀파일 올려보세여 인디 1389 2012/02/21
66347             Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 장성호 2656 2012/02/21
66353                 Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 1631 2012/02/21
66358                     Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 장성호 1420 2012/02/21
66361                         Re:Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 1556 2012/02/21
66345             Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 이길남.HoPe 1291 2012/02/21
66362                 Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 1250 2012/02/21
66363                     Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 이길남.HoPe 1384 2012/02/22
66369                         Re:Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 1200 2012/02/23
66372                             Re: 님~ 아직 파일 안올렸네여~ 인디 1218 2012/02/23
66378                                 Re:Re: 님~ 아직 파일 안올렸네여~ 김태우 1231 2012/02/23
66375                                 Re:Re: 님~ 아직 파일 안올렸네여~ 이길남.HoPe 1227 2012/02/23
66382                                     Re:Re:Re: 님~ 아직 파일 안올렸네여~ 김태우 1299 2012/02/23
66388                                         Re:Re:Re:Re: 님~ 아직 파일 안올렸네여~ 이길남.HoPe 1276 2012/02/24
66407                                             Re:Re:Re:Re:Re: 님~ 아직 파일 안올렸네여~ 김태우 1255 2012/02/25
66370                             Re:Re:Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 이길남.HoPe 1835 2012/02/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.