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
[1080] [Controls] StringGrid의 선택한 Row가 Grid가운데가 되도록..
장성호 [nasilso] 9227 읽음    2012-03-22 00:35
음..

[StringGrid에서 특정Row를 선택은..]

StringGrid에서 특정Row를 선택하려면
다음과 같이 해주시면 됩니다.

StringGrid->Row = 원하는 RowIndex ; 



그런데 위와같이만 코딩하면..

선택한 Row가 Grid의 윗쪽에 올수도 있고, 아랫쪽에 나타날수도 있습니다.


[선택한 Row가 항상 top에 오게..]
선택한 Row가 항상 top에 오게하려면 다음과 같이 TopRow를 설정해주면 됩니다.

// 선택한 Row가 항상 윗쪽에..

StringGrid->Row = 원하는 RowIndex ; 
StringGrid->TopRow = 원하는 RowIndex ; 




[선택한 Row가 Grid중간에]
그런데 만약 선택한 Row가 Grid중간에 오도록 Scroll 되게 하려면 어떻게 해야할까요?
TopRow를 선택한row보다 작은값으로 적당히 계산해서 설정하면 될것 입니다.


//---------------------------------------------------------------------------
// StringGrid에서 선택할 Row가 Grid화면 가운데 위치하게 하는 함수
//---------------------------------------------------------------------------
void __fastcall GridSelectViewCenter(TStringGrid *Grid,int iTargetRow)
{
	if(iTargetRow<0 || iTargetRow>=Grid->RowCount)return;
	int iGridHei=Grid->ClientHeight;
	int iFixedRowH=0;
	for(int i=0;iFixedRows;i++)iFixedRowH+=Grid->RowHeights[i];	
	int iHalfHei=(iGridHei-iFixedRowH-Grid->RowHeights[iTargetRow])/2;
	int iSumHei=0;
	for( int i=iTargetRow-1;i>0;i--)
	{
		iSumHei+=Grid->RowHeights[i];
		if(iSumHei>=iHalfHei)
		{
			Grid->TopRow=(iSumHei==iHalfHei)?i:i+1;
			Grid->Row=iTargetRow;
			return;
		}
	}
	Grid->TopRow=1;
	Grid->Row=iTargetRow;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int iTargetRow=Edit1->Text.ToIntDef(0);
	GridSelectViewCenter(StringGrid1,iTargetRow);
}



약간 미진한 부분이 있지만 그럭저럭 동작하는 코드입니다.

그럼..

+ -

관련 글 리스트
1080 [Controls] StringGrid의 선택한 Row가 Grid가운데가 되도록.. 장성호 9227 2012/03/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.