제가 쓰는 일부분을 발췌한 부분입니다.
응용해서 사용하세요. ^^;
참고로 깜박임은 Grid->DoubleBuffer = True 해주면 많이 해소 됩니다. (단, 메모리가 늘겠죠... ^^;)
void __fastcall TFSub04n02::Grid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *grid = dynamic_cast(Sender);
if(grid == NULL) return;
TCanvas* canvas = grid->Canvas;
TRect rect = grid->CellRect(ACol, ARow);
canvas->Font->Assign(grid->Font);
canvas->Pen->Color = clBlack;
canvas->Brush->Color = (!ARow) ? TColor(clGray) : TColor(0x00A7A7A7);
canvas->FillRect(rect);
if(ACol == grid->ColCount -1) rect.right--;
if(ARow == grid->RowCount -1) rect.bottom--;
if(ARow == grid->RowCount -1 || grid->RowCount == 1)
{
canvas->MoveTo(rect.left, rect.bottom);
if(rect.Height() >= grid->DefaultRowHeight - 1)
{
canvas->MoveTo(rect.right, rect.bottom);
canvas->LineTo(rect.left, rect.bottom);
}
}
else
{
canvas->MoveTo(rect.left, rect.bottom);
}
canvas->LineTo(rect.left, rect.top);
canvas->LineTo(rect.right, rect.top);
if(ACol == grid->ColCount -1 || grid->RowCount == 1) canvas->LineTo(rect.right, rect.bottom);
AnsiString str = grid->Cells[ACol][ARow];
/*
grid->Cells[ACol][ARow] 대신 메모리(변수)값을 부르면 될것입니다.
*/
if(ARow && ACol == 1)
{
switch(str.ToIntDef(0))
{
case 1:str = "TRAY 삽입"; break;
case 2:str = "TRAY 배출"; break;
case 3:str = "AUTO SHIP"; break;
default:str = " UN-KNOWN"; break;
}
}
TSize size = canvas->TextExtent(str);
if(!ARow || ACol != 2) canvas->TextOut(rect.left + (rect.Width() - size.cx)/2, rect.top + (rect.Height() - size.cy)/2, str);
else canvas->TextOut(rect.left + 10, rect.top + (rect.Height() - size.cy)/2, str);
}
//---------------------------------------------------------------------------
김태우 님이 쓰신 글 :
: 아..그렇군요...
:
: 그래서 다시 OnDrawCell 를 호출하게 되어서...
:
: 깜빡임?? 같은 현상이 나오는거였던거군요...???
:
: OnDrawCell 구현 해놓은 예제라도 좀 보여주실수 있나요....
:
: 메모리에 둔다는건 XLSheet.OlePropertyGet("Cells", j , i).OlePropertyGet("Value");
:
: 이런식 말고 읽어드린 자료를 배열이나 이런곳에 할당해놓고..
:
: 그걸 직접 Drawing 하라는 말씀이신지...
:
: 예제좀..ㅜㅜ
:
:
: 이길남.HoPe 님이 쓰신 글 :
: : 제가 타이머나 쓰레드를 사용하라는 주된 이유는
: :
: : 정보를 한번에 읽어오는데 프로그램이 정지되는 것과 같은 현상을 방지하기 위해서 입니다.
: :
: : 프로그램이 정지된것과 비슷한 현상을 방지하려면,
: :
: : 타이머를 사용해서 조금씩 데이터를 갱신하는 방법밖에 없다고 생각됩니다.
: :
: : 또한, 인디님께서 말씀하신 OnDrawCell 방법도 좋습니다.
: :
: : 다만, 주의 하실점은 데이터를 모두 별도의 메모리에 두어서 직접 Drawing을 하셔야됩니다.
: :
: : 만약, "SringGrid1->Cells[ACol][ARow] = 데이터" 이런식의 작성을 하면,
: :
: : 다시 OnDrawCell을 호출하게 되므로 역효과가 나타납니다.
: :
: : 또한, OnDrawCell 부분에서 엑셀파일을 계속해서 열고 닫으면 외부에서 엑셀 파일을 열거나 닫으면
: :
: : 공유 위반 에러가 날듯합니다.
: :
: : (요 부분은 직접 테스트를 하지 못하였습니다. 다만, 염려되는 부분이라서 말씀드립니다.)
: :
: : 그럼 즐거운 하루 되십시요. ^^;
: :
: :
: : 인디 님이 쓰신 글 :
: : : 김태우 님이 쓰신 글 :
: : : : 언제나 친절하게 답변해 주셔서 감사합니다.
: : : : 마지막으로 한가지 더 여쭙겠습니다..
: : : : 타이머나 쓰레드로 할때는 그럼 폼이 죽는 현상을 어떻게 해결 해야되는건가요..?
: : : :
: : :
: : :
: : : 님~ 타이머 쓰레드 쓸 이유가 전혀 없어여~
: : : 화면 업데이트 하는데 먼 타이머랑 쓰레드 까지 쓰나여~ ㅋㅋ
: : :
: : : 스트링그리드 OnDrawCell 이벤트 핸들러 하나면 모든게 다 되여~~
: : : 화면에 보이는 셀들에 대해서만 OnDrawCell이 호출되기때문에~
: : : 이벤트 핸들러에서 해당 셀들만 뿌려주면 되져~
: : :
: : : 타이머~ 쓰레드는 전혀 핀트가 빗나건 얘기에여~ ㅋㅋ
: : :
: : : 님~ 엑셀 테스트파일 아직 안올렸네여~~~
: : :
: : : 그리구여~ 혹시 말로만 초보라고 하구~
: : : 실제로는 프로젝트 하는 분 아닌가여? 시간에 쫓기면서 허겁지겁? ㅋㅋㅋㅋ
: : :
: : : 인디로 웹서버 포스트 날리고~ 엑셀 데이타 다루는건 초보자들이 다루는 내용이 아닌데~ ㅋㅋ