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
[69513] Re:StringGrid 페이지 관리 질문입니다.
장성호 [nasilso] 2219 읽음    2013-05-23 17:12
Grid의 기본기능을 조작해서 쓰는것은
여러가지 고려해야할 사항이 참 많이 있습니다.

기본 Grid에서  TopRow를 변경하는 방법에는
1) MouseWheel ,  2) 방향키(up/down)
3) PageUp/PageDown , 4) ScrollBar
5) 기타 ..  등이 있습니다.

위 모든 것을 고려해야하며, TopLow를 변경했을때 SelectRow는 어떻게 할것인지도 고려해야합니다.


아래에 대충(완벽하지 않음)
위 몇가지에 동작하도록 코딩해 보았습니다.

StrollBar를 제대로 조작하려면 SubClassing해야하는데..
간단히 TopLowChanged 이벤트를 이용했습니다.

//---------------------------------------------------------------------------
bool __fastcall TForm8::MoveGridPageDown(TStringGrid *pGrid,int iPageSize)
{
	int iTop=(pGrid->TopRow-1)/iPageSize+1;
	int iNew=pGrid->Row+1;
	int iNewTop=((iNew-1)/iPageSize)+1;
	if(iTop!=iNewTop && iNewRowCount)
	{
		pGrid->TopRow=iNew;
		pGrid->Row=iNew;
		return true;
	}
	else
	{
		return false;
	}
}
//---------------------------------------------------------------------------
bool __fastcall TForm8::MoveGridPageUp(TStringGrid *pGrid,int iPageSize)
{
	int iTop=(pGrid->TopRow-1)/iPageSize+1;
	int iNew=pGrid->Row-1;
	int iNewTop=((iNew-1)/iPageSize)+1;
	if(iTop!=iNewTop && iNew>1)
	{
		pGrid->TopRow=iNew-iPageSize+1;
		pGrid->Row=iNew;
		return true;
	}
	else
	{
		return false;
	}
}
//---------------------------------------------------------------------------
#define GRID_PAGE_SIZE	8
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// MouseWheel 움직일때 Page단위로 보여주도록 동작
//---------------------------------------------------------------------------
void __fastcall TForm8::StringGrid1MouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos,
			 bool &Handled)
{
	Handled=MoveGridPageDown(StringGrid1,GRID_PAGE_SIZE);
}
//---------------------------------------------------------------------------
void __fastcall TForm8::StringGrid1MouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos,
			 bool &Handled)
{
	Handled=MoveGridPageUp(StringGrid1,GRID_PAGE_SIZE);
}
//---------------------------------------------------------------------------
// Key보드 Up/Down , PageUp,PageDown에 동작
//---------------------------------------------------------------------------
void __fastcall TForm8::StringGrid1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
	if(GetAsyncKeyState(VK_DOWN)&0x8000)
	{
		if(MoveGridPageDown(StringGrid1,GRID_PAGE_SIZE))Key=0;
	}
	else if(GetAsyncKeyState(VK_UP)&0x8000)
	{
		if(MoveGridPageUp(StringGrid1,GRID_PAGE_SIZE))Key=0;
	}
	else if(GetAsyncKeyState(VK_PRIOR)&0x8000)//PAGEDOWN
	{
		int iNewTop=StringGrid1->TopRow-GRID_PAGE_SIZE;
		if(iNewTop>0)
		{
			StringGrid1->Row=StringGrid1->Row-GRID_PAGE_SIZE;
			StringGrid1->TopRow=iNewTop;
		}
		Key=0;
	}
	else if(GetAsyncKeyState(VK_NEXT)&0x8000)//VK_PAGEUP
	{
		int iNewTop=StringGrid1->TopRow+GRID_PAGE_SIZE;
		if(iNewTopRowCount)
		{
			StringGrid1->Row=StringGrid1->Row+GRID_PAGE_SIZE;
			StringGrid1->TopRow=iNewTop;
		}
		Key=0;
	}
}
//---------------------------------------------------------------------------
// ScrollBar를 Mouse로 잡아서 움직일때(ScrollBar-Arrow버튼 클릭에는 동작안함)
//---------------------------------------------------------------------------
void __fastcall TForm8::StringGrid1TopLeftChanged(TObject *Sender)
{
	int iNewTopLow=StringGrid1->TopRow;
	int iPageTopLow=((iNewTopLow-1)/GRID_PAGE_SIZE)*GRID_PAGE_SIZE+1;
	if(iNewTopLow!=iPageTopLow)
	{
		StringGrid1->TopRow=iPageTopLow;
	}
}
//---------------------------------------------------------------------------





프로그램 초짜 님이 쓰신 글 :
: 많은 질문속에서도 빛나는 답변 감사 드립니다.
:
: StringGrid를 사용하고있는데요
:
: 총 Row수는 25입니다.
:
: 근데 저희가 쓰는 Row 내용이 각 채널별 관리 입니다.
:
: 24채널을 다 보여주면 좋켓지만 공간상 8칸씩 끊어 보일려 합니다.
:
: 이때 마우스 휠 조작이나 스크롤바 를 조작시에
:
: TopRow를 조절해서 페이지 단위(?)로 움직이려 합니다.  8칸씩요
:
: 1번부터 8번까지 어떤 Row를 선택하던지 1번이 젤 위로 가게 하고싶다는 내용입니다.
: 9번부터 16번까지 는 9번이 젤 위로...
:
:
: 위 내용을 구현핮다 생긴 질문의 요지 입니다.
:
: 1. 스크롤을 움직일때 뜨는 이벤트 내에선 스크롤이 아래 인지 위인지는 알수있나요?
: 이부분은 어떻게 처리 하면 좋을까요...
:
: 2. 마우스 휠 조작시에 변수 TopRowNumber를 누르고
: 0 ~ 2까지 변하게 하고 TopRow를  *8  을해서 TopRow를 변경하고싶은데
: 방법은 맞나요????
:
:
: 다양한 방법으로 구현하려 했습니다만 거의 다 실패 ㅜㅜ
:
: 멘붕.... ㅜㅜ 흑
:

+ -

관련 글 리스트
69504 StringGrid 페이지 관리 질문입니다. 프로그램 초짜 1593 2013/05/22
69513     Re:StringGrid 페이지 관리 질문입니다. 장성호 2219 2013/05/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.