Delphi - сбориник статей

       

Метки колонок: рисуем в заголовке 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;



Содержание раздела