Метки колонок: рисуем в заголовке TCheckBox или TRadioButton
Вновь вернемся к заголовкам. Допустим нам надо реализовать возможность как-то отметить колонку. В принципе для таких целей может служить два контрола TCheckBox и TRadioButton. Для рисования в заголовках воспользуемся специальным событием нашего нового грида: OnDrawTitleRect
procedure TfExDBG.OnDrawTitleRect(Sender: TObject; ACol: Integer; Column: TColumn; ARect: TRect); Var Style, TypeButton : Word; FRect : TRect; begin IF ACol >= TexDBGrid(Sender).FixedCols Then Begin InflateRect(ARect, -1, -1);
TDBGrid(Sender).Canvas.FillRect(ARect);
// Ширина прямоугольника для рисования контрола - 20 пикселей
FRect:=ARect; IF RectWidth(FRect) > 20 Then FRect.Right:=FRect.Left + 20;
// Определяем отмечено или нет текущее поле
IF Column.Field.Tag = 1 Then Style:=DFCS_CHECKED Else Style:=0;
// Выбираем тип контрола для отметки колонки
IF FTitleIsCheckBox Then TypeButton:=DFCS_BUTTONCHECK Else TypeButton:=DFCS_BUTTONRADIO;
// Рисуем отметку
DrawFrameControl(TDBGrid(Sender).Canvas.Handle, FRect, DFC_BUTTON, TypeButton OR Style);
FRect.Left:=FRect.Right + 1; FRect.Right:=ARect.Right;
// Текст заголовка
WriteText(TDBGrid(Sender).Canvas,FRect,Column.Title.Caption,Column.Title.Alignment); End; end;
Обработку нажатия на метку колонки проводим в обработчике события OnMouseUp. В приведенном примере для хранения отметки столбца используется свойство TField.Tag. Естественно, это только один из возможных вариантов.
procedure TfExDBG.GridFixMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Const MinX = 2; MaxX = 20; Var Row, Col , i : Integer; Grid : TexDBGrid; Begin Grid:=TexDBGrid(Sender);
// Получим номер строки и столбца грида, над которыми произошел клик мышкой
Grid.MouseToCell(X,Y,Col,Row);
IF Button = mbLeft Then Begin // Левая кнопка мыши — проверяем попадание в заголовок // и обязательное попадание на сам крыжик
IF (Row = 0) AND (Col > Grid.FixedCols ) AND (Grid.Columns[Col - 1].Field <> nil) Then Begin Dec(X, Grid.TitleRect(Col-1).Left);
// Проверяем попадание в область крыжика
IF (X > MinX) and (X < MaxX) Then Begin Tag:=Grid.Columns[Col - 1].Field.Tag;
// Снимаем отметку со всех колонок (если это TRadioButton)
IF NOT FTitleIsCheckBox Then For i:=0 To Grid.Columns.Count - 1 Do Grid.Columns[i].Field.Tag:=0;
// И отмечаем текущую
Grid.Columns[Col - 1].Field.Tag:=1 - Tag;
// Перерисовываем только заголовки, а не весь грид
Grid.RefreshTitles; RefreshSelect; End; End; End; End;