|
액셀 데이타 액세스 및 TStringGrid 화면처리와 관련한 내용에 답글이 많이 달려서 따로 올려 봅니다.
TStringGrid 관련...
TStringGrid 클래스 자체가 효율적으로 구현되어있지 못합니다.
그리고 Cell에 데이타가 들어간 후 윈도우즈 Message 핸들러에서 업데이트와 관련한 메시지가 핸들링 된 이후에
화면이 갱신되는 구조이기 때문에, 넣어야 할 데이타가 너무 많아.. for 문의 루프가 길면 길어질 수록 그 시간동안
블럭킹 상태가 될수 밖에 없습니다. 그렇기 때문에 TStringGrid에서 BeginUpdate, EndUpdate의 사용은 의미가
없습니다.
Grid 콘트롤을 상속받아서 클래스를 확장구현할 게 아니라면, 인디님이 답변한 것 처럼... OnDrawCell 이벤트
핸들러를 이용해서 화면에 보여지는 셀들만 그려주는 게 가장 효과적인 방법입니다.
액셀 데이타 액세스와 관련해서 Copy/Paste 방식도 언급이 되었던데...
액셀 Sheet의 "Range OLE Interface"를 이용해서 Cell 데이타 블럭을 한번에 바로 받는 게 더 나은 방법입니다.
Copy/Paste 방법은 데이타를 가져올 때 Win32 레이어도 경유하는 구조이기 때문 입니다.
예를들면 다음과 같은 식이 되겠죠...
Variant cellDataBlocks;
Variant cellRangeInterface;
cellDataBlocks = VarArrayCreate(.....); // 2 차원 Dynamic Variant Array[Cols][Rows] 생성
........................................................
cellRangeInterface = Workbook.Worksheet.Range(....);
.........................................................
cellDataBlocks = cellRangeInterface.Value(); // 사용할 데이타
더 나아가서... 액셀 데이타를 더 빠르게 액세스 하고자 한다면...
Excel add-in DLL을 C++로 구현해 주는 방법을 사용하는 겁니다. add-in DLL은 액셀 프로그램의 어드레스 공간에서
같은 컨텍스트로 돌아가기 때문에, 액셀 프로그램 자체에 툴바, 메뉴 등의 유져인터페이스를 확장해 넣을 수도 있고,
Worksheet의 Cell Data 등.. 액셀 내부 데이타 액세스도 가능합니다.
액셀 add-in DLL을 구현해서.. 사용자 프로그램과 액셀 간에 Shared Memory를 통해서 데이타를 주고 받으면...
더 빠르게 데이타를 주고 받을 수 있습니다. Proxy/Stub 마샬링 등.. OLE 관련 레이어를 완전히 바이패스 하는 거죠.
|