C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[791] DBGrid 셀의 높이를 바꾸어 지정해 보자.
김태선 [cppbuilder] 7408 읽음    2008-07-31 04:30
DBGrid는 여러 SI 프로그래머들이 애용하지만 제한점이 많아 사실상 대체 컴포넌트를 이용하는 경우가 많습니다.
필자 같이 원래 주어진 컴포넌트를 주로 이용하고 기능이 필요한 것은 가급적 수정하거나 추가해서
쓰는 것을 좋아하는 성향을 가진 플머도 있습니다. 약간의 기능을 위해 새로운 컴포넌트를 설치하는 것도 부담이닌까요.

DBGrid도 제한이 많은데 셀의 높이 값을 수정할 수 없는 것도 큰 문제입니다.
가령 터치스크린용 프로그램을 만든다고 가정할때 셀의 높이가 크지 않으면 제대로 row 를 선택할 수도 없습니다.
폰트 크기에 따라 셀의 높이가 결정되어 버리므로, 폰트를 크게 하면 당연히 화면에 아주 이상한 광경이 펼쳐지죠.

그래서 약간의 트릭을 사용해서 문제를 해결할 수 있습니다.
일단 셀의 높이는 DBGrid 의 사용폰트의 폰트 사이즈 값을 조정해서 바꿀 수 있습니다.
문제는 이렇게 하면 셀에 표시되는 내용도 코끼리만 해지닌까, default cell draw  기능을 쓰지 않고
아래처럼 사용자가 일일이 셀의 모습을 그려주는 방법을 씁니다.

단 아래 코드는 Editting을 직접 하지 않는 DBGrid 에서 테스트 되었습니다.
Editting 모드가 되면 원래 지정한 큰 폰트가 나옵니다.
그리고 심각하게 오래 테스트된 것이 아니니 무슨 문제가 있을 수도 있는데 그런건 각자 알아서 .... ㅎㅎ;



//---------------------------------------------------------------------------
// DBGrid 셀 새로 그리기.

void __fastcall TFormMain::DBGrid1DrawDataCell(TObject *Sender,
	  const TRect &Rect, TField *Field, TGridDrawState State)
{
	TCanvas  *C = DBGrid1->Canvas;
	//grid->DefaultDrawDataCell(Rect, Field, State);

	int		align = TA_CENTER;
	if (Field->DataType == ftString) // TFieldType
		align = TA_LEFT;
	unsigned oldalign = SetTextAlign(C->Handle, align); //TA_CENTER);
	if (State.Contains(gdSelected))
	{
		C->Pen->Color = clWhite;
		C->Brush->Color = clNavy;
	}
	else
	{
		C->Pen->Color = clBlack;
		C->Brush->Color = clWhite;
	}
	//TRACE("Rect: %d %d %d %d %s", Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, ~Field->AsString);
	int  font_size = C->Font->Size;
	C->Font->Size = 10;
	//grid->Font->Size = 10;		// 이걸수정하면 DBGrid1가 고뇌 폭주모드에 빠진다. 그래서 원래의 폰트값은 수정하면 안된다.
	if (align == TA_LEFT)
		C->TextRect(Rect, Rect.Left + 4, Rect.Top + 8, Field->AsString);
	else
	{
		C->TextRect(Rect,
			Rect.Left + Rect.Width() / 2 ,
			Rect.Top + 8, Field->AsString);
	}
	C->Font->Size = font_size;
	SetTextAlign(C->Handle, oldalign);
}
//---------------------------------------------------------------------------


Options 에
dgAlwaysShowSelection = true; 로 해 놓는게 좋습니다.
위 코드는 포커스를 잃었을때 처리를 안하기 때문입니다.

코드가 좀 지저분?한데 원래 주석을 많이 다는 스타일이라서.. 양해 바랍니다.

그럼~

+ -

관련 글 리스트
791 DBGrid 셀의 높이를 바꾸어 지정해 보자. 김태선 7408 2008/07/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.