Подсветка строки в dbgrideh

Разноцветный DBGrid. 8 лет спустя.

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Разноцветный DBGrid. 8 лет спустя.

Почти восемь лет назад, появилась на свет Borland Delphi 1. Все эти восемь лет программисты во всем мире, связанные с базами данных, решали несколько сложнейших задач, которые (вместе с решениями) описаны здесь:

  • Разноцветный DBGRID
  • Что можно поместить в DBGrid
  • НеОбычный TDBGrid

Рассмотрим, как их можно решить в наши дни. Воспользуемся бесплатной для exUSSR библиотекой EhLib Дмитрия Большакова. В настоящее время это лучшие компоненты в exUSSR по соотношению функциональность+качество/цена. Вся настройка грида для большей наглядности делается в исходном коде. В ваших приложениях большинство действий можно проделать визуально в дизайнере.

1. Демонстрационный проект

Время идет, BDE официально признан мертвым, поэтому мы в качестве движка будем использовать ADO. Почитать подробнее можно здесь: «Немного об использовании ADO в Delphi» (из этой же статьи взята базка в MS ACCESS). Никаких проблем связка TADOConnection – TADODataSet не вызывает. Интересным моментом в программе является редактирование свойства TADOConnection.ConnectionString в run-time:

2. Раскрашиваем строку

Пишется обработчик события OnGetCellParams:

Никакого рисования на канве, никаких тонкостей с вызовом методов, просто указываем гриду свойства ячейки, передаваемые в аргументах – и всё, остальное он делает сам!

Если нужно просто подсветить строку на которой стоит курсор, то это ещё проще:

3. CheckBox в поле DBGrid

Если поле DataSet’а имеет тип Boolean, то никаких дополнительных усилий делать не придется, грид сам будем отображать checkbox. Для полей других типов нужно настроить свойства столбца DBGridEh следующим образом:

4. Картинка в поле DBGrid

Чтобы показать вместо значения поля картинку, зависящую от значения поля, необходимо сделать следующее: Column[i].ImageList – ImageList с картинками, Column[i].KeyList свойство типа Strings — каждая строка – значение поля, вместо которого будет подставляться картинка из ImageList с соотвествующим индексом; свойствоColumn[i].NotInKeyListIndex должно содержать индекс картинки сопоставляемый значениям поля, которых нет в KeyList (например, это удобно для значения NULL). Список из свойства PickList используется для сопоставления картинкам всплывающих подсказок (для этого необходимо также выставить в TRUE свойства Column.Tooltips и DBGridEh.ShowHint).

5. Полосатое окно

Код взят из примеров к EhLib, обработчик OnGetCellParams:

6. MultiSelect

Для начала нужно выставить

После этого любое выделение сделанное пользователем доступно через свойство TDBGridEh.Selection. Selection.SelectionType указывает на тип выделения:

Более подробный пример есть в Справке в EhLib, а для копирования/вырезания/вставки уже есть готовые процедуры.

7. Сложные заголовки

Это то, чего так не хватает в стандартном гриде и из-за чего с завистью начинаешь посматривать на 1С ;-).
Показать как это делается ещё проще, чем объяснить:

После этого столбцы с заголовками Subtitle>1 и Subtitle>2 будут объединены под заголовком title>1.

8. Быстрый (инкрементальный) поиск

Это то, что поражает в DBGridEh после обычного грида (как демка BioLife в Delphi после TurboPascal).

Указывает гриду на то, что после нажатия Ctrl+F следует перейти в режим быстрого поиска.

Указывает на то, что режим «быстрого» поиска является основным, нажатия цифро-буквенных клавиш будут восприниматься гридом как часть строки, которую он будет искать в текущем столбце. Перейти к режиму редактирования можно нажатием F2.

9. Авто-Сортировка

Для того, чтобы сделать сортировку по столбцам в обычном гриде, нужно проделать длительную кропотливую работу, с EhLib это займет несколько секунд:

в USES надо добавить один из модулей: EhLibADO, EhLibBDE, EhLibCDS, EhLibDBX или EhLibIBX в зависимости от типа DataSet’ов которые вы используете. Данные модули, при включении их в приложение, автоматически регистрируют объект-сортировщик.

Есть одно НО: на текущий момент (июль 2003) версия EhLib c сайта разработчика может сортировать только DataSet со словом Query: TIBQuery, TSQLQuery, TADOQuery и тд. Кроме того возможность грида SortLocal реализована только для ClientDataSet. Нам же требуется работа с TADODataSet и хотелось бы реализовать локальную сортировку recordset’а, которую умеет делать ADO.

Помогли исходники. Код EhLib красивый, удобно разбит на модули. В результате его изучения возникли следующие исправления:

Теперь в любом проекте кодирование сортировки TADODataSet будет занимать мгновения 😉

X.Подведение итогов.

Безусловно, все эти годы прогресс не стоял на месте. 😉
То, на что раньше требовались часы кропотливого труда, теперь занимает минуты.
Хочется сказать БОЛЬШОЕ СПАСИБО Дмитрию Большакову, автору EhLib, за великолепный продукт и идеальную ценовую политику!

Исходный код примера, демонстрационная базка и исправленные модули EhLib здесь (19.8K).

Читайте так же:  Чем вырезать круглое отверстие в пластиковой панели под светильник

Copyright© 2003 Андрей Финк Специально для Delphi Plus

Источник

Раскраска активной строки в DBGridEh

Здравствуйте уважаемые программисты нужна помощь, у меня реализована раскраска двух столбцов с помощью OnGetCellParam, а также сделано событие на OnDrawColumn в котором при активной записи в верхнем dbgrideh она также раскрашивается в нижнем dbgrideh. Подскажите пожалуйста как сделать чтобы при выборе записи которая станет активной цвет колонок не изменялся?

Редактирование строки в DbGridEh
Добрый день! скажите, возможно ли редактирование строки вручную в dbgrideh (на строку нажал и с.

Цвет строки в DBGrideh
Мир всем и добрый день ! скажите пожалуйста как сделать нужную строку красного цвета например .

Фон строки DBGridEh
Как изменить фон строки DBGridEh на которой стоит указатель?

Размер строки DbGridEh
Помогите разобраться с проблемой! База Access, есть поле Memo, в него добавляю данные из TMemo В.

DBGridEh выделение строки
Привет! начал пользоваться DBGridEh, и в отличии от обычного DBGrid у DBGridEh при выставлении.

Запрет выделения текущей строки в DBGridEh
Как можно сделать что бы не выделялась текущая строка в DBGridEh?

Выделение активной строки
Добрый день! Подскажите пожалуйста, как можно реализовать подсветку цветом или иным способом.

Подсветка активной строки
Задача проста — подсвечивать активную строку. Для этого написан следующий код: Private Sub.

Источник

Программирование Delphi

Все о программировании.

Главное меню

Разноцветные строки в DBGrid

Эта статья предполагает, что Вы знаете как подключить базу данных к компоненту DBGrid. Самый легкий способ состоит в том, чтобы использовать Database Form Wizard. Выберите employee.db из DBDEMOS. Выделите все поля,кроме EmpNo.

Окрашивание столбцов

Мы сделаем это через свойство TColumns сетки. Выберите компонент сетки на форме и вызовите Columns Editor, дважды щелкнув на свойстве Columns в Инспекторе Объектов.

Теперь все, что Вы должны сделать — это определить цвет фона ячеек определенного столбца. Для цвета символов, см. свойства шрифта.

Это все можно сделать за несколько щелчков. Это, конечно, лучше стандартной черно-белой сетки (если это, конечно, нужно).

Окрашивание строк

Если Вы хотите окрасить выбранную строку в DBGrid, но не хотите использовать опцию dgRowSelect, потому что хотите редактировать данные, Вы должны использовать событие DBGrid.OnDrawColumnCell .

Этот пример демонстрирует, как динамически изменить цвет текста в DBGrid.

Если зарплата служащего более 36 тысяч, ее строка отображается бордовым цветом.

Следующий пример показывает, как динамически изменить цвет строки в DBGrid.

Если зарплата служащего более 36 тысяч, эта строка отображается белым.

Окрашивание ячеек

И, наконец, если Вы хотите изменить цвет фона ячеек определенного столбца и цвет шрифта, Вы должны будете сделать:

Если зарплата служащего более 40 тысяч, эта ячейка отображается черным, а цвет шрифта белым.

Источник

Программирование Delphi

Все о программировании.

Главное меню

Разноцветные строки в DBGrid

Эта статья предполагает, что Вы знаете как подключить базу данных к компоненту DBGrid. Самый легкий способ состоит в том, чтобы использовать Database Form Wizard. Выберите employee.db из DBDEMOS. Выделите все поля,кроме EmpNo.

Окрашивание столбцов

Мы сделаем это через свойство TColumns сетки. Выберите компонент сетки на форме и вызовите Columns Editor, дважды щелкнув на свойстве Columns в Инспекторе Объектов.

Теперь все, что Вы должны сделать — это определить цвет фона ячеек определенного столбца. Для цвета символов, см. свойства шрифта.

Это все можно сделать за несколько щелчков. Это, конечно, лучше стандартной черно-белой сетки (если это, конечно, нужно).

Окрашивание строк

Если Вы хотите окрасить выбранную строку в DBGrid, но не хотите использовать опцию dgRowSelect, потому что хотите редактировать данные, Вы должны использовать событие DBGrid.OnDrawColumnCell .

Этот пример демонстрирует, как динамически изменить цвет текста в DBGrid.

Если зарплата служащего более 36 тысяч, ее строка отображается бордовым цветом.

Следующий пример показывает, как динамически изменить цвет строки в DBGrid.

Если зарплата служащего более 36 тысяч, эта строка отображается белым.

Окрашивание ячеек

И, наконец, если Вы хотите изменить цвет фона ячеек определенного столбца и цвет шрифта, Вы должны будете сделать:

Если зарплата служащего более 40 тысяч, эта ячейка отображается черным, а цвет шрифта белым.

Источник

Подсветка строки в dbgrideh

Здравствуйте! В гриде RawSelect = False, AlwaysShowSelecton = True. По определенным причинам, могу использовать только RawSelect = false, но необходимо какое-то выделение текущей строки. Хотелось бы перекрашивать текущую строку в какой-то определенный цвет. Подскажите пожалуйста, как это реализовать. Если можно с кодом, заранее благодарен.

Сходи на сайт Королевство Делфи. Там была статья «Полосатый грид».

В OnDrawCell сравнивать TStringGrid(Row).Row и ARow, переданное в качестве парметра.

Читал статью в королевстве, но не разобрался 🙁 Можно маленький примерчик, просто как изменить цвет какой-либо ячейки. Дальше я разберусь со строкой. Если не затруднит, конечно 🙂

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
cl: TColor;
begin
if StringGrid1.Row = ARow then
cl := clYellow
else
cl := StringGrid1.Color;
StringGrid1.Canvas.Brush.Color := cl;
StringGrid1.Canvas.FillRect(Rect);
DrawText(
StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[ACol, ARow]),
Length(StringGrid1.Cells[ACol, ARow]),
Rect,
0
);

Читайте так же:  Immortality клавиатура настройка подсветки

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
StringGrid1.Invalidate;
// иначе не перекрасится покинутая и новая строка,
// а только покинутая и новая ячейки

Спасибо за отзыв! Только вот не нашел в DBGride моем OnDrawCell 🙁
Есть OnDrawDataCell и OnDrawColumnCell.

procedure TForm1.DBGridUridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);

procedure TForm1.DBGridUridDrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);

Может их и не надо использовать. Помогите разобраться, пожалуйста.

дада! для DBGrid если не затруднит )

У DBGridEh есть dghRowHighLight OptionsEh для этих целей.


> Tex (18.12.06 10:20) [7]

А чем пример из справки не устраивает?

EhLib — shareware компонент. Хотелось бы своими руками. Помогите плиз!

Не подскажете точнее? Не могу найти ((


> Tex (18.12.06 11:07) [12]

OnDrawDataCell (Ereignis von TCustomDBGrid)

TCustomDBGrid Siehe auch Delphi-Beispiel C++ Beispiel

dghRowHighLight OptionsEh прпробовал?


> ЮЮ © (18.12.06 11:23) [14]
> dghRowHighLight OptionsEh прпробовал?

это же DBGridEh. нужно на обычном гриде.

по OnDrawDataCell в справке нет примера.

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
cl: TColor;
begin
if Field.DataSet.Fields[0].AsInteger = Field.DataSet.tag then begin
if TDBGrid(Sender).SelectedField = Field then
cl := clRed
else
cl := clYellow;
end
else
cl := TDBGrid(Sender).Color;

TDBGrid(Sender).Canvas.Brush.Color := cl;
TDBGrid(Sender).Canvas.FillRect(Rect);
TDBGrid(Sender).DefaultDrawDataCell(Rect, Field, State);

procedure TForm1.Query1AfterScroll(DataSet: TDataSet);
begin
DataSet.Tag := DataSet.Fields[0].AsInteger;
// запоним значение ключевого поля текущей записи
end;

В списке параметров обработчика есть State и Column — в зависимости от их значений присваиается нужный цвет фона и фонта ТЕКУЩЕЙ ячейки, а прорисовывается методом DefaultDrawColumnCell.
На этом компе нет проектов поэтому код привести не могу, но, как правильно тут было сказано, на Королевстве естиь венликолепная статья с примерами — возьмите ее в качестве учебного пособия


> MsGuns © (18.12.06 11:51) [17]

1) Только один Column имеет gdSelected, а красить нужно всю строку.
2) в DrawDataCell «текущей» записью DataSet-а является именно рисуемая, а не настоящая текущая.


Anatoly Podgoretsky © ( 2006-12-18 12:42 ) [19]

Зачем еще какие то примеры, когда там самые подробные, если те не понял и примеры из справки, то давать еще какие то нет смысла.

Изложенно с примерами, разобраны фрагменты кода.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=170
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1193


> Tex (18.12.06 11:30) [15]

.
type
TDummyGrid = class(TDBGrid)
end;
.
procedure TfrmMain.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with TDummyGrid(Sender) do
begin
if (DataLink.ActiveRecord = Row-1) and not (gdFocused in State) then
begin
Canvas.Brush.Color := clYellow;
Canvas.Font.Color := Font.Color;
end;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;

>ЮЮ © (18.12.06 11:59) [18]
>1) Только один Column имеет gdSelected, а красить нужно всю строку.
>2) в DrawDataCell «текущей» записью DataSet-а является именно рисуемая, а не настоящая текущая.

А в чем [17] противоречит обоим пунктам ?

Тем только, что [17] никак не поможет решить subj-евую проблему. Причем из-за причин в [18].

> [13] Плохиш © (18.12.06 11:14)

Ух, ты! Где это немецкий хелп раздобыл? 🙂


> evvcom © (19.12.06 08:34) [24]
> > [13] Плохиш © (18.12.06 11:14)
>
> Ух, ты! Где это немецкий хелп раздобыл?

В делфи 😉

>ЮЮ © (19.12.06 02:53) [23]
>Тем только, что [17] никак не поможет решить subj-евую проблему. Причем из-за причин в [18].

Ну конкретно, что из того что ты отписал в [17] поможет разукрасить все ячейки текущей записи?

>ЮЮ © (19.12.06 12:17) [27]
>Ну конкретно, что из того что ты отписал в [17] поможет разукрасить все ячейки текущей записи?

dgSelected in State, Column по боку


> MsGuns © (19.12.06 15:19) [28]

При отключённых RowSelect и MultiSelect, будет закрашиваться только текущая выделенная ячейка.

>Плохиш © (19.12.06 15:36) [29]
>При отключённых RowSelect и MultiSelect, будет закрашиваться только текущая выделенная ячейка.

Товарищи Мастера!
Благодарю за помощь (осбенно тов. Плохиша), со всем разобрался, все работает!
Всем огромное спасибо.

Еще один вопросик )) Код из [21] замечательно работает, текущая строка подсвечивается. При щелчке мышкой по какой-либо ячейке происходит также, помимо выделения строки заданным цветом, стандартное выделение этой ячейки. Но, например, при сортировке сандартное выделение не видно — видна только подсвеченная строка. Подкажите как с этим справиться, нужно чтобы при любых действиях была видна также и текущая ячека.

возможно у грида не включено dgAlwaysShowSelection и при потере фокуса ячейка по умолчанию никак не выделяется цветом

вместо
not (gdFocused in State)
поставь
not (gdSelected in State)

Ура!
Вот теперь, наконец-то, все работает отлично ))
Надеюсь эта ветка будет полезна людям!

Благодарю за помощь и внимание!

Источник

Оцените статью
Охраны в доме нет
Adblock
detector