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를 변경하고싶은데
: 방법은 맞나요????
:
:
: 다양한 방법으로 구현하려 했습니다만 거의 다 실패 ㅜㅜ
:
: 멘붕.... ㅜㅜ 흑
: