ogorodov писал(а):Привет Rik а есть где нибудь пример использования TxDBGrid ... что он вообще из себя представляет
Сетка используется как и стандартная, но имеет немного расширенные функции.
1. Отрисовка 2 полей в одном столбце. Смысл - впихать как можно больше информации в экран, чтобы как можно больше доступной информации было перед глазами и чтобы соответственно не прокручивать сетку влево вправо. Каждый столбец имеет свойства TxColumn.FieldName и TxColumn.xFieldName (соответственно есть TxColumn.Caption и TxColumn.xCaption)
2. Измененное оформление (можно отключить, свойство TxDBGrid.xStyle)
3. Автоматическое изменение ширины колонок при изменении ширины сетки. Для этого свойство TxDBGrid.Options.AutoSizeColumns = True, в столбцах сетки TxColumn.PrcWidth - ширина столбца в процентном отношении к общей ширине сетки. Сумма PrcWidth всех столбцов не должна превышать 100.
3. Отрисовка иконок в ячейках, в зависимости от значения поля. Для этого назначить на сетке в свойстве ImageList библиотеку изображений. В столбце, в котором собираемся выводить изображение, задаем в свойстве TxColumn.DrawImage = True, в свойстве ImageIndexes задаем какую иконку рисовать в зависимости от значения поля.
Пример:

На скриншоте редактор свойства ImageIndexes, для поля с типом Boolean задано рисовать: для значения True иконку из библиотеки изображений с индексом 13, для значения False - изображение с индексом 6.
Чтобы задать какую иконку рисовать, в редакторе свойства добавляем строку, затем в столбец Key вписываем значение поля, какое нас интересует, после этого щелкаем на изображении нужной иконки в списке справа, индекс изображения подставится в столбец Name. 
4. Автоперенос текста в ячейках. Свойства TxColumn.WordWrap и TxColumn.xWordWrap. 
5. Можно задать приращение к высоте строки в поле TxDBGrid.IncRowHeight - Можно растянуть высоту строк так, чтобы влазили длинные значения строковых полей (само собой если задан перенос в столбцах TxColumn.WordWrap и TxColumn.xWordWrap).
6. В свойствах сетки можно назначить TAction для: TxDBGRid.InsertAction - срабатывает при нажатии в сетке <Ins>, TxDBGrid.EditAction срабатывает при нажатии в сетке <F4>, TxDBGrid.DeleteAction - срабатывает при нажатии в сетке <Ctrl>+<Del>, TxDBGRid.SelectAction срабатывает при нажатии в сетке <Enter> (при этом TxDBGrid.Option.RowSelect должна быть True, иначе не работает).
7. Есть функции автосортировки и автофильтра, но для них нужно писать дополнительные обработчики, в зависимости от используемых компонент доступа к данным.
Автосортировка работает если щелкнуть на заголовок столбца, данные выстроятся по этому полю (TxDBGRid.Option.AutoSortIcon поставить в True, будет отрисована стрелка в заголовке сортированного поля). Автофильтр работает при нажатии <Ctrl>+<F>, автофильтр работает по полю в котором стоит курсор.
Пример, в модуле XDBGRid есть переменные процедурного типа GetDataSortField и AutoSortDataSet, им нужно назначить обработчики перед использованием сетки в одном месте программы, можно например в конструкторе главной формы или секции initialization:
- Код: Выделить всё
- XDBGrids.GetDataSortField := @GetDBSortingField;
 XDBGrids.AutoSortDataSet:= @OnAutoSortDataset;
Пример обработчиков из CrossMashine, он задает использование этих функций для IBX, ZEOS, xDBF, после этого в сетке для всех наборов данных IBX, ZEOS, xDBF будет работать автосортировка и автофильтр:
- Код: Выделить всё
- procedure GetDBSortingField(DataSet: TDataSet; var SortedFieldName: string; var Desc: Boolean);
 var
 S: string;
 I, L: Integer;
 xDBF: TxDbf;
 begin
 SortedFieldName := '';
 Desc:= False;
 {$IFDEF IBX}
 if DataSet is TIBDataSet then
 begin
 S := UTF8UpperCase(TIBDataSet(DataSet).OrderFields);
 if S <> '' then
 begin
 I := Pos(',', S);
 if I > 0 then
 begin
 L := Length(S);
 Delete(S, I, L - I + 1);
 end;
 I := Pos(' DESC', S);
 if I > 0 then
 begin
 Desc := True;
 Delete(S, I, 5);
 end;
 end;
 SortedFieldName := Trim(S);
 end
 else
 {$EndIf}
 {$IfDef ZEOS}
 if DataSet is TZAbstractRODataset then
 begin
 S := UTF8UpperCase(TZAbstractRODataset(DataSet).SortedFields);
 if S <> '' then
 begin
 I := Pos(',', S);
 if I > 0 then
 begin
 L := Length(S);
 Delete(S, I, L - I + 1);
 end;
 Desc := TZAbstractRODataset(DataSet).SortType = stDescending;
 end
 else
 if DataSet is TZQuery then;
 begin
 S := UTF8UpperCase(TZQuery(DataSet).IndexFieldNames);
 if S <> '' then
 begin
 I := Pos(',', S);
 if I > 0 then
 begin
 L := Length(S);
 Delete(S, I, L - I + 1);
 end;
 Desc := False;
 end
 end;
 SortedFieldName := Trim(S);
 end
 else
 {$ENDIF}
 if DataSet is TxDbf then
 begin
 xDBF := TxDbf(DataSet);
 S := xDBF.IndexName;
 if S <> '' then
 begin
 
 for I := 0 to xDBF.Indexes.Count - 1 do
 begin
 if xDbf.Indexes.Items[I].IndexFile = S then
 begin
 SortedFieldName := xDbf.Indexes.Items[I].SortField;
 Desc := ixDescending in xDbf.Indexes.Items[I].Options;
 Break;
 end;
 end;
 end;
 end;
 end;
 
 procedure OnAutoSortDataset(DataSet: TDataSet; Column: TxColumn; CellCursorPos: TCellCursorPos);
 var
 DIDef: TDbfIndexDef;
 begin
 {$IFDEF IBX}
 if DataSet is TIBCustomDataSet then
 begin
 if CellCursorPos = ccpTop then
 begin
 if Column.Sorted = soxAscending then
 begin
 TIBCustomDataSet(DataSet).OrderFields := Column.FieldName + ' DESC';
 Column.Sorted := soxDescending;
 end
 else
 begin
 TIBCustomDataSet(DataSet).OrderFields := Column.FieldName;
 Column.Sorted := soxAscending;
 end;
 end
 else
 begin
 if Column.xSorted = soxAscending then
 begin
 TIBCustomDataSet(DataSet).OrderFields := Column.xFieldName + ' DESC';
 Column.xSorted:= soxDescending;
 end
 else
 begin
 TIBCustomDataSet(DataSet).OrderFields := Column.xFieldName;
 Column.xSorted:= soxAscending;
 end;
 
 end;
 end
 else
 {$ENDIF}
 {$IFDEF ZEOS}
 if DataSet is TZQuery then
 begin
 if CellCursorPos = ccpTop then
 begin
 if Column.Sorted = soxAscending then
 begin
 TZQuery(DataSet).IndexFieldNames := Column.FieldName + ' DESC';
 Column.Sorted:= soxDescending;
 end
 else
 begin
 TZQuery(DataSet).IndexFieldNames := Column.FieldName;
 Column.Sorted:= soxAscending;
 end;
 end
 else
 begin
 if Column.xSorted = soxAscending then
 begin
 TZQuery(DataSet).IndexFieldNames := Column.xFieldName + ' DESC';
 Column.xSorted:= soxDescending;
 end
 else
 begin
 TZQuery(DataSet).IndexFieldNames := Column.xFieldName;
 Column.xSorted:= soxAscending;
 end;
 end;
 end
 else
 {$EndIf}
 if DataSet is TCustomBufDataset then
 begin
 if CellCursorPos = ccpTop then
 begin
 TCustomBufDataset(DataSet).IndexFieldNames := Column.FieldName;
 Column.Sorted:= soxAscending;
 end
 else
 begin
 TCustomBufDataset(DataSet).IndexFieldNames := Column.xFieldName;
 Column.xSorted:= soxAscending;
 end;
 end
 else
 if DataSet is TxDbf then
 begin
 if CellCursorPos = ccpTop then
 begin
 DIDef := TxDbf(DataSet).Indexes.GetIndexByField(Column.FieldName);
 if DIDef = nil then
 TxDbf(DataSet).AddIndex(Column.FieldName, Column.FieldName, [ixCaseInsensitive]);
 TxDbf(DataSet).IndexFieldNames := Column.FieldName;
 if TxDbf(DataSet).IndexName <> '' then
 Column.Sorted:= soxAscending;
 end
 else
 begin
 TxDbf(DataSet).IndexName := Column.xFieldName;
 Column.xSorted:= soxAscending;
 end;
 end;
 end;
 
ps. Когда задаете в каком либо столбце второе поле (TxColumn.xFieldName) у сетки автоматически устанавливается TxDBGrid.DoubleRowHeight = True, если вы уберете все TxColumn.xFieldName, то чтобы привести сетку в "одноэтажное состояние", нужно установить TxDBGrid.DoubleRowHeight = False.
Возможно видео полезным будет:
http://youtu.be/EES8aXxwAoI