C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запретить скролл TStringGrid
spiller
Отправлено: 12.03.2006, 21:04


Ученик-кочегар

Группа: Участник
Сообщений: 27



Всем привет.
Необходимо при определенном условии запретить скролл грида.
Знаю только что код нужно помещать в обработчик OnTopLeftChanged

Вот на одном из форумов нашел :
Запретить скроллинг можно так. Необходимо определить собственный обработчик событий DBGrid'a. Сделать это достаточно просто. Необходимо повесить на свойство WindowProc (тип TWndMethod) DBGrid'a свою собственную процедуру. А в ней давить сообщение CM_MOUSEWHEEL.

Как это закодить?

Grigoriy
Отправлено: 13.03.2006, 01:31


Мастер участка

Группа: Участник
Сообщений: 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);
//и так далее...

Вернуться в Вопросы программирования в C++Builder