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