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

 
StringGrid — вопрос...
ManKom
  Отправлено: 21.12.2005, 14:45


Не зарегистрирован







Вопрос в следующем:
1) Как в режиме дизайна у StringGrida мышкой изменить ширину колонок?
2) Каким образом в режиме дизайна перехватить нажатие кнопок мыши?
Буду очень благодарен, если есть примерчики.
Спасибо.
Grigoriy
Отправлено: 22.12.2005, 15:10


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

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



Вот что я могу предложить
В этом примере изменять ширину рядов и высоту строк можно даже тогда, когда курсор мыши находится в рабочей зоне.
CODE

#include <vcl.h>
#pragma hdrstop

#include "Unit1dizaintable.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int dopusknaredaktortable=3;/*предельное расстояние редактирования ширины и высоты*/
int minwidthscolumn=5;//минимальная ширина колонок
int minheightsrow=5;//минимальная высота столбцов
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
int Column,Row,dx1,dy1,dx2,dy2;
TRect R;
static int pr;
static int izmColumn;
static int izmRow;
static int Xfix;
static int Yfix;
if (!Shift.Contains(ssLeft))
{
StringGrid1->MouseToCell(X,Y,Column,Row);
R=StringGrid1->CellRect(Column,Row);
dx1=abs(R.Left-X);
dx2=abs(R.Right-X);
dy1=abs(R.Top-Y);
dy2=abs(R.Bottom-Y);
if (dx1<=dx2)izmColumn=Column-1; else {izmColumn=Column;dx1=dx2;};
if (dy1<=dy2)izmRow=Row-1; else {izmRow=Row;dy1=dy2;};
if (dx1<dy1) pr=1; else {pr=2;dx1=dy1;};
if (dx1>dopusknaredaktortable)
{pr=0;StringGrid1->Cursor=-2;}
else
{
StringGrid1->Cursor=crHSplit-pr+1;
Xfix=X;Yfix=Y;
};
}
else
{
if (pr==1)
if (izmColumn>=0)
if (StringGrid1->ColWidths[izmColumn]+X-Xfix>=minwidthscolumn)
{StringGrid1->ColWidths[izmColumn]+=X-Xfix;
Xfix=X;};
if (pr==2)
if (izmRow>=0)
if (StringGrid1->RowHeights[izmRow]+Y-Yfix>=minheightsrow)
{StringGrid1->RowHeights[izmRow]+=Y-Yfix;
Yfix=Y;
};
};
}

Если есть хотя бы по одной строке и столбцу в фиксированной зоне, то можно просто установить в множестве TGridOptions элементы
goRowSizing
goColSizing.
Но тогда изменять ширину и высоту можно только, если курсор мыши находится в фиксированной зоне.

Отредактировано Grigoriy — 22/12/2005, 15:12
GIZMO
Отправлено: 23.12.2005, 18:23


Машинист паровоза

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



QUOTE (ManKom @ 21/12/2005, 14:45)
Вопрос в следующем:
1) Как в режиме дизайна у StringGrida мышкой изменить ширину колонок?
2) Каким образом в режиме дизайна перехватить нажатие кнопок мыши?
Буду очень благодарен, если есть примерчики.
Спасибо.

CM_DESIGNHITTEST

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