|
:: MVP ::
|
|
|
:: RSS ::
|
|
|
Как объединить несколько ячеек?
// Способ первый
// Отключение отрисовки не сработает, т.к. в DBGridEh.pas
// FonDrawFooterCell вызывается уже после прорисовки ячейки
// методом по умолчанию, но можно отрисовать ячейку 1 после
// отрисовки ячейки 2. Представленный подход имеем проблему
// с выделением строк и отрисованных ячейках
procedure TForm1.DBGridEh1DrawFooterCell(Sender: TObject;
DataCol, Row: Integer; Column: TColumnEh; Rect: TRect; State: TGridDrawState);
begin
if Row = 1 then // нумерация с 0
begin
DBGridEh1.Canvas.Brush.Color := clSilver;
if Column.Index = 1 then
begin
Rect.Left := Rect.Left - DBGridEh1.Columns[0].Width;
DBGridEh1.Canvas.FillRect(Rect);
DBGridEh1.Canvas.TextOut(Rect.Left, Rect.Top + 2, DBGridEh1.GetFooterValue(Row,
DBGridEh1.Columns[0]));
end
else
DBGridEh1.DefaultDrawFooterCell(Rect, DataCol, Row, Column, State);
end
else
begin
Column.Footer.ValueType := fvtSum;
inherited;
end;
end;
// Способ второй
procedure Tfrm_psk_LST.grd_MainDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
function isCombineLine: Boolean;
begin
with (Sender as TDBGridEhAuto) do
Result := (Columns[1].DisplayText <> '') and
(Columns[2].DisplayText = '') and
(Columns[3].DisplayText = '');
end;
const
{$J+}
isSelect: Boolean = False;
{$J+}
var
r: TRect;
begin
if DataCol = 0 then
isSelect := False;
if DataCol in [1..3] then // нумерация с 0
begin
if (gdSelected in State) or isSelect then
begin
if ActiveControl = Sender then
DBGridEh1.Canvas.Brush.Color := RGB(215, 240, 255)
else
DBGridEh1.Canvas.Brush.Color := RGB(218, 218, 218);
if not isSelect then
isSelect := True;
end
else
DBGridEh1.Canvas.Brush.Color := (Sender as TDBGridEhAuto).EvenRowColor;
if isCombineLine then
begin
r := Rect;
case Column.Index of
// Здесь 2 - количество объединяемых ячеек минус 1
1: r.Right := r.Right + DBGridEh1.Columns[1].Width + DBGridEh1.Columns[2].Width + 2;
2: begin
r.Left := r.Left - DBGridEh1.Columns[1].Width - 1;
r.Right := r.Right + DBGridEh1.Columns[2].Width + 1;
end;
3: r.Left := r.Left - DBGridEh1.Columns[1].Width - DBGridEh1.Columns[2].Width - 2;
end;
DBGridEh1.Canvas.FillRect(r);
DBGridEh1.Canvas.Font.Style := [fsBold];
r.Left := r.Left + 2;
DrawTextEh(DBGridEh1.Canvas.Handle, DBGridEh1.Columns[1].DisplayText,
Length(DBGridEh1.Columns[1].DisplayText), r, DT_END_ELLIPSIS);
end;
end;
end;
|
Как запретить перемещение колонок?
// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
begin
DBGridEh1.OptionsEh := DBGridEh1.OptionsEh - [dghColumnMove];
end;
// Способ второй
procedure TForm1.DBGridEh1ColumnMoved(Sender: TObject; FromIndex,
ToIndex: Integer);
begin
DBGridEh1.Columns[ToIndex].Index := FromIndex;
end;
|
Как показать номер записи?
procedure TForm1.Button1Click(Sender: TObject);
begin
DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghShowRecNo];
end;
|
Какое поле выделено в DBGridEh?
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(DBGridEh1.Columns[DBGridEh1.SelectedIndex].FieldName);
end;
|
Как в DBGridEh настроить локальную сортировку?
// Локальная сортировка в DBGridEh поддерживается не всеми типами DataSet. Для работы
// с компонентами ADOQuery и ADODataSet необходимо подключить библиотеку EhLibADO.
// Для сотрировки MemTable цепочка подключения которой выглядит следующим образом:
// TDBGridEh -> TDataSource -> TMemTableEh -> TDataSetDriverEh -> TClientDataSet -> TFDConnection
// необходимо подключить библиотеку EhLibMTE. Если используются другие типы, такие как
// TIBQuery или TIBDataSet, подключение локальной сортировки может не работать.
//
// Unit | DataSet | Local | Server | Local | Server
// | | sorting | sorting | filtering | filtering
// ---------|------------------------|---------|---------|-----------|----------
// EhLibBDE | TQuery, TTable | N | Y | Y | Y
// EhLibADO | TADOQuery, TADODataSet | Y | Y | Y | Y
// EhLibCDS | TClientDataSet | Y | Y | Y | Y
// EhLibDBX | TSQLQuery, TSQLDataSet | N | Y | N | Y
// EhLibIBX | TIBQuery, TIBDataSet | N | Y | Y | Y
//
// Для DataSet'ов сторонних разработчиков можно написать и зарегестрировать свой собственный класс
// или написать обработчики событий OnSortMarkingChanged для каждого требуемого grid'а. Кроме того
// можно написать OnSortMarkingChanged для глобальной переменной DBGridEhDataService. Эти события
// имеют тип TNotifyEvent, где в качестве Sender'а выступает TCustomDBGridEh.
implementation
uses
EhLibADO; // Модуль EhLib... зависит от типа подключения
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
// Включаем сортировку в заголовках всех колонок
for i := 0 to DBGridEh1.Columns.Count - 1 do
DBGridEh1.Columns[i].Title.TitleButton := True;
// Или так
// DBGridEh1.IndicatorTitle.TitleButton := True;
// Включаем локальную сортировку и множественную сортировку
DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghAutoSortMarking, dghMultiSortMarking];
DBGridEh1.SortLocal := True;
end;
|
Как в DBGridEh настроить локальную фильтрацию?
// Локальная фильтрация в DBGridEh поддерживается не всеми типами DataSet. Для работы
// с компонентами ADOQuery и ADODataSet необходимо подключить библиотеку EhLibADO.
// Для фильтрации DataSet цепочка подключения которой выглядит следующим образом:
// TDBGridEh -> TDataSource -> TMemTableEh -> TDataSetDriverEh -> TClientDataSet -> TFDConnection
// необходимо подключить библиотеку EhLibMTE. Если используются другие типы, такие как
// TIBQuery или TIBDataSet, подключение локальной сортировки может не работать.
//
// Unit | DataSet | Local | Server | Local | Server
// | | sorting | sorting | filtering | filtering
// ---------|------------------------|---------|---------|-----------|----------
// EhLibBDE | TQuery, TTable | N | Y | Y | Y
// EhLibADO | TADOQuery, TADODataSet | Y | Y | Y | Y
// EhLibCDS | TClientDataSet | Y | Y | Y | Y
// EhLibDBX | TSQLQuery, TSQLDataSet | N | Y | N | Y
// EhLibIBX | TIBQuery, TIBDataSet | N | Y | Y | Y
//
// Для DataSet'ов сторонних разработчиков можно написать и зарегестрировать свой собственный класс
// или написать обработчики событий OnApplyFilter для каждого требуемого grid'а. Кроме того можно
// написать OnApplyFilter для глобальной переменной DBGridEhDataService. Эти события имеют тип
// TNotifyEvent, где в качестве Sender'а выступает TCustomDBGridEh.
implementation
uses
EhLibCDS; // Модуль EhLib... зависит от типа подключения
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
// Включаем кнопку в заголовках всех колонок
for i := 0 to DBGridEh1.Columns.Count - 1 do
DBGridEh1.Columns[i].Title.TitleButton := True;
// Или так
// DBGridEh1.IndicatorTitle.TitleButton := True;
// Включаем локальную фильтрацию
DBGridEh1.STFilter.Local := True;
end;
// Когда grid настроен для локальной фильтрации, специальный объект строит выражение
// и присваивает его свойству Filter DataSet'а (перед этим нужно заранее выставить
// значение Filtered в True). Когда grid настроен для фильтрации на сервере, специальный
// объект строит выражение для предложения 'WHERE' SQL-строки DataSet'а. Он пытается
// найти строку, начинющуюся с ключевого выражения '/*Filter*/' (можно изменять это
// ключевое выражение используя глобальную переменную SQLFilterMarker) в SQL-выражении
// и добавляет выражение для фильтрации после ключа в той же строке. Так что, SQL-запрос
// должен содержать строку, начинающуюся с '/*Filter*/'. Например:
//
// 'select * '#13 +
// 'from table1 '#13 +
// 'where '#13 +
// /*Filter*/ 1=1 ';
|
|
При использовании материала - ссылка на сайт обязательна
|
|