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
[70751] Re:StringGrid DrawCell 관련 질문드립니다.
장성호 [nasilso] 3156 읽음    2014-01-21 20:11
음...

[문제]
DrawCell 이벤트가 바생한 컴포넌트가  어느것인지 체크해야합니다.

만약
DrawCell 이벤트로 넘어오는 ACol,  ARow, Rect 가 StringGrid1 꺼인데..
StringGrid2 에다가 그정보를 이용해서 그리면 이상한데 그리게 될것입니니다.

[답변]

아래 코드에 주석부분이 설명입니다.

void __fastcall TForm3::DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,TGridDrawState State) 
{ 
// FixedRows는 반복해서 변경할 필요없습니다.  폼생성시나 필요할때 한번만(디자인 타임에 해도 좋구요)
// StringGrid1->FixedRows = 1; 
// StringGrid2->FixedRows = 1; 

//  for문은 쓸데 없습니다.
// Grid에서 화면에 보이는 Cell 이 100개이면 이벤트가 100번 발생합니다.
// 파라메터로 넘어온 ACol , ARow에 대해서만 그려주면 됩니다.
    
   if(ACol != 1) return; //조건을 보니 Col이 1 인경우만 OwnerDraw하는것 같네요 

   // Sender 가 현재 이벤트 발생한 Grid입니다.
   TStringGrid *pGrid = (TStringGrid *)Sender;

   if(PathCheck[i] == 1)
   {
	 pGrid->Canvas->Font->Color = clRed;
	 pGrid->Canvas->FillRect(Rect);
	 pGrid->Canvas->TextOut(Rect.Left,Rect.Top,pGrid->Cells[ACol][ARow]);
   }
   else if(PathCheck2[i] == 2)
   {
	 pGrid->Canvas->Font->Color = clBlack;
	 pGrid->Canvas->FillRect(Rect);
	 pGrid->Canvas->TextOut(Rect.Left,Rect.Top,pGrid->Cells[ACol][ARow]);
   }

// Grid1과 Grid2의 조건이 다르다면
 if( Sender == StringGrid1 ) // 이런식으로 비교하시면 됩니다. 
           
} 



그럼..

정현율 님이 쓰신 글 :
: 소스가 너무 길어서... DrawCell 이벤트 관련 부분 소스입니다..
:
: void __fastcall TForm3::DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,TGridDrawState State)
: {
:         StringGrid1->FixedRows = 1;
:         StringGrid2->FixedRows = 1;
:
:         for(int i = 1 ; i <= StringGrid1->RowCount-1; i++)
:         {
:             if(ACol == 1 && ARow == i && PathCheck[i] == 1)
:             {
:                 StringGrid1->Canvas->Font->Color = clRed;
:                 StringGrid1->Canvas->FillRect(Rect);
:                   StringGrid1->Canvas->TextOut(Rect.Left,Rect.Top,StringGrid1->Cells[ACol][ARow]);
:                 break;
:             }
:             if(ACol == 1 && ARow == i && PathCheck2[i] == 2)
:             {
:                 StringGrid1->Canvas->Font->Color = clBlack;
:                 StringGrid1->Canvas->FillRect(Rect);
:                 StringGrid1->Canvas->TextOut(Rect.Left,Rect.Top,StringGrid1->Cells[ACol][ARow]);
:                 break;
:             }
:         }
:
:
:         for(int i = 1; i<= StringGrid2->RowCount-1; i++)
:             if(ACol == 1 & ARow == i && PathCheck3[i] == 3)
:             {
:                 StringGrid2->Canvas->Font->Color = clRed;
:                 StringGrid2->Canvas->FillRect(Rect);
:                 StringGrid2->Canvas->TextOut(Rect.Left,Rect.Top,StringGrid2->Cells[ACol][ARow]);
:                 break;
:             }
: }
:
: 소스는 Path 에 등록된 경로에 파일이 존재하지 않으면 해당 셀의 글씨색을 빨간색으로 바꾸는 내용입니다.
:
: 첫번째 실행 화면 -- 오른쪽 StringGrid 에서 없는 파일 경로가 빨간색으로 잘 표시됨
: 두번째 실행 화면 -- 왼쪽 StringGrid1 에서 없는 파일 경로가 빨간색으로 잘 표시됨

: 문제는 이때 오른쪽 StringGrid 에서 빨간색으로 표시되어있던 부분의 글씨가 짤린다고 해야하나... 아무튼 위치에 변동이 생깁니다...
:
: 제 생각으로는 한 DrawCell 이벤트에 StringGrid 두개를 모두 다 제어하도록 소스를 짜서 그런것 같긴 한데..
:
: DrawCell 이벤트는 Form의 변화 발생시점마다 실행이 되는 것으로 알고 있습니다.
:
: 그래서 grid마다 이벤트를 따로 줘야 하나 해서 해봤더니 되질 않네요...
:
: 더이상 방법을 못찾고 있습니다. 아시는 분 있으시다면 해결좀 부탁드려요...

+ -

관련 글 리스트
70747 StringGrid DrawCell 관련 질문드립니다. 정현율 3341 2014/01/21
70751     Re:StringGrid DrawCell 관련 질문드립니다. 장성호 3156 2014/01/21
70756         Re:Re:StringGrid DrawCell 관련 질문드립니다. 정현율 2932 2014/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.