Добрый день.
Для доступа к элементам группировки данных используйте дерево группировки - DBGridEh1.DataGrouping.GroupDataTree
Для обхода дерева используйте методы GroupDataTree.GetFirst, GroupDataTree.GetNext
Для определения типа ветки используйте свойство Node.NodeType (dntDataSetRecordEh - запись данных ДатаСета, dntDataGroupEh - Заголовок группы, dntDataGroupFooterEh - футер группы.
Вот примерный код обхода дерева и Демо проект.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
GroupDataTree: TGridGroupDataTreeEh;
Node: TGroupDataTreeNodeEh;
Field: TField;
s: String;
begin
DBMemoEh1.Lines.Clear;
DBMemoEh1.Lines.BeginUpdate;
GroupDataTree := DBGridEh1.DataGrouping.GroupDataTree;
Node := GroupDataTree.GetFirst;
while Node <> nil do
begin
s := StringOfChar(' ', (Node.Level - 1) * 2);
if (Node.NodeType = dntDataSetRecordEh) then
begin
Field := DBGridEh1.Columns[DBGridEh1.SelectedIndex].Field;
MemTableEh1.InstantReadEnter(Node.DataSetRecordViewNo);
s := s + 'DataRow Level: FieldValue = ' +
VarToStr(MemTableEh1.Rec.DataValues[Field.FieldName, dvvValueEh]);
MemTableEh1.InstantReadLeave;
end else if (Node.NodeType = dntDataGroupEh) then
begin
s := s + 'GroupTitle: Level - ' + IntToStr(Node.Level) +
', Value - ' + Node.DisplayValue;
end else if (Node.NodeType = dntDataGroupFooterEh) then
begin
s := s + 'GroupFooter: Level - ' + IntToStr(Node.Level);
s := s + ', FooterValue - ' + VarToStr(Node.FooterValues[DBGridEh1.SelectedIndex]);
end;
DBMemoEh1.Lines.Add(s);
Node := GroupDataTree.GetNext(Node);
end;
DBMemoEh1.Lines.EndUpdate;
end;