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
[70756] Re:Re:StringGrid DrawCell 관련 질문드립니다.
정현율 [ausido] 2931 읽음    2014-01-22 08:57
덕분에 해결했습니다. 정말 감사드립니다.

장성호 님이 쓰신 글 :
: 음...
:
: [문제]
: 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 관련 질문드립니다. 정현율 2931 2014/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.