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


Имитация внутренних группировок


Для создания внутренних группировок необходимо подготовить не только TDBGrid, но и набор данных, которые он будет отображать. Ведь TDBGrid не умеет показывать строк, которых нет в его источнике данных (TDataSource). Подготовим данные по такому запросу: выберем всю информацию по странам и добавим список континентов с суммами полей "население" и "площадь". Обычный UNION-запрос:

Select 1 as TypeRecord , Continent , Name, Area , Population From country Union Select 0 as TypeRecord,Continent ,Continent as Name, Sum(Area) as Area , Sum(Population) as Population From country Group By Continent Order by 2,1

Итак, мы получим для каждого континента список его стран и еще одну запись, которую мы будем использовать как служебную запись для группировки, суммы по континенту эта строка уже содержит. Идентифицировать служебную запись можно по значению служебного поля TypeRecord (именно для этого оно и введено). Добавим в обработку события OnDrawColumnCell рисование группировочной строки:

procedure TfExDBG.__GridFixDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); Var Alignment : TAlignment; begin // рисуем на строке итогов имитацию заголовка грида IF Column.Field.DataSet.FieldByName('TypeRecord').AsInteger = 0 Then TexDBGrid(Sender).DrawCellButton(Rect,Column.Field.DisplayText,[fsBold],State,Alignment) end;
Вуаля! :о)

А вот еще один вариант группировок — без итогов по каждой колонке, только отделение групп данных друг от друга (рис. 5).
рис. 5

Для его реализации добавим метод, аналогичный DrawCellButton, вернее создадим новый на его основе. Метод DrawRowButton делает тоже самое, что и DrawCellButton, но только всегда растягивает картинку на всю видимую строку грида.

procedure TexDBGrid.DrawRowButton(Rect: TRect; Text: String; Style: TFontStyles; Alignment: TAlignment); Var FullRect : TRect; Col : TColumn; begin FullRect:=Rect; FullRect.Left:=IndicatorWidth + 1; FullRect.Right:=CalcTitleRect(Columns[Columns.Count-1],0,Col).Right; DrawCellButton(FullRect,Text,Style,[],Alignment); end;




Начало  Назад  Вперед