Мастер участка
Группа: Участник
Сообщений: 381
|
Здравствуй spiller.
QUOTE |
Вот на одном из форумов нашел :
Запретить скроллинг можно так. Необходимо определить собственный обработчик событий DBGrid'a. Сделать это достаточно просто. Необходимо повесить на свойство WindowProc (тип TWndMethod) DBGrid'a свою собственную процедуру. А в ней давить сообщение CM_MOUSEWHEEL.
|
Ой, как сложно !
Советую вот такой код.
Должны быть описаны две функции.
1. Служебная функция не являющаяся членом объекта(компонента-таблицы).
2. Обработчик события OnTopLeftChanged — является членом объекта(компонента-таблицы).
CODE |
int Interdiction_or_sanction_scroll_Grid(TDrawGrid* gr,int i)
{
//если i=0 — Скроллирование таблицы запрещается
//если i=1 — Скроллирование таблицы разрешается
struct GridScrollPos
{
TDrawGrid* grid;
int LeftCol1;
int TopRow1;
int pr_Interdiction;
};
static GridScrollPos* BaseGridScrollPos;
static unsigned int SizeBaseGridScrollPos;
unsigned int i1=0;
while ((i1<SizeBaseGridScrollPos)&&(BaseGridScrollPos[i1].grid!=gr)) i1++;
if (i1==SizeBaseGridScrollPos)
{
(void*)BaseGridScrollPos=realloc(BaseGridScrollPos,(SizeBaseGridScrollPos+1)*sizeof(GridScrollPos));
SizeBaseGridScrollPos++;
BaseGridScrollPos[i1].grid=gr;
BaseGridScrollPos[i1].pr_Interdiction=0;
};
switch (i)
{
case 0:
BaseGridScrollPos[i1].LeftCol1=gr->LeftCol;
BaseGridScrollPos[i1].TopRow1=gr->TopRow;
BaseGridScrollPos[i1].pr_Interdiction=1;
break;
case 1:
BaseGridScrollPos[i1].pr_Interdiction=0;
break;
case 2:
return BaseGridScrollPos[i1].LeftCol1;
break;
case 3:
return BaseGridScrollPos[i1].TopRow1;
break;
case 4:
return BaseGridScrollPos[i1].pr_Interdiction;
break;
};
};
//********************************************
//Обработчик события OnTopLeftChanged
void __fastcall TForm1::StringGrid1TopLeftChanged(TObject *Sender)
{
if (Interdiction_or_sanction_scroll_Grid((TDrawGrid*)Sender,4))
{
((TDrawGrid*) Sender)->LeftCol=Interdiction_or_sanction_scroll_Grid((TDrawGrid*)Sender,2);
((TDrawGrid*) Sender)->TopRow=Interdiction_or_sanction_scroll_Grid((TDrawGrid*)Sender,3);
if (((TDrawGrid*) Sender)->Col<((TDrawGrid*) Sender)->LeftCol)
{
((TDrawGrid*) Sender)->Col=((TDrawGrid*) Sender)->LeftCol;
};
if (((TDrawGrid*) Sender)->Row<((TDrawGrid*) Sender)->TopRow)
{
((TDrawGrid*) Sender)->Row=((TDrawGrid*) Sender)->TopRow;
};
if (((TDrawGrid*) Sender)->Col>((TDrawGrid*) Sender)->VisibleColCount+((TDrawGrid*) Sender)->LeftCol)
{
((TDrawGrid*) Sender)->Col=((TDrawGrid*) Sender)->VisibleColCount+((TDrawGrid*) Sender)->LeftCol;
};
if (((TDrawGrid*) Sender)->Row>((TDrawGrid*) Sender)->VisibleRowCount+((TDrawGrid*) Sender)->TopRow)
{
((TDrawGrid*) Sender)->Row=((TDrawGrid*) Sender)->VisibleRowCount+((TDrawGrid*) Sender)->TopRow;
};
};
}
|
Если нужно будет запретить скроллинг, то
вызывать нужно функцию
Interdiction_or_sanction_scroll_Grid
со вторым параметром равным нулю,
например так
CODE |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Interdiction_or_sanction_scroll_Grid(StringGrid1, 0);
}
|
Если нужно разрешить скроллинг, то
вызывать нужно функцию
Interdiction_or_sanction_scroll_Grid
со вторым параметром равным единице,
например так
CODE |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Interdiction_or_sanction_scroll_Grid(StringGrid1, 1);
}
|
Первый параметр — указатель на компонент-таблицу.
Ставь на форму сколь угодно этих ГРИДов и для каждого опиши в теле обработчика события OnTopLeftChanged один и тот же код !
ну тот что выше я выложил.
И потом попробуй вот такую последовательность
CODE |
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid1, 0);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid1, 1);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid2, 0);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid2, 1);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid3, 0);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid3, 1);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid4, 0);
//--------------
Interdiction_or_sanction_scroll_Grid(StringGrid4, 1);
//и так далее...
|
|