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
[66358] Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요..
장성호 [nasilso] 1419 읽음    2012-02-21 20:42
제가 얘기한 속도개선방안중

첫째는 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 를 사용어떻게 하나요.. 장성호 2655 2012/02/21
66353                 Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 김태우 1631 2012/02/21
66358                     Re:Re:Re:Re:Re:StringGrid 에서 BeginUpdate 를 사용어떻게 하나요.. 장성호 1419 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.