음..
[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);
}
약간 미진한 부분이 있지만 그럭저럭 동작하는 코드입니다.
그럼..
|