Когда люди используют Delphi для разработки приложений баз данных, они часто используют элементы управления таблицами для составления отчетов. Гибкое использование события OnDrawCell управления таблицей может завершить отображение некоторых спецэффектов, что может лучше удовлетворить потребности пользователей. В этой статье представлены три совета для гибкого использования событий OnDrawCell.
Динамически обновлять цвет строк таблиц
Иногда в отчете необходимо динамически обновить цвет строк таблиц. Например, в списке поставщиков поставщики, которые являются предпочтительными, отображаются зеленым, а другие поставщики отображаются красным. В настоящее время вы можете использовать следующий код для его реализации в событии OnDrawCell:
Если Table1.fieldbyName ('custno'). Asinteger> 1500, тогда
Dbgrid1.canvas.font.color: = clred;
Dbgrid1.defaultdrawcolumncell (rect, datacol,
Столбец, состояние)
Приведенный выше код может быть расширен в соответствии с потребностями приложения. Например, когда вам нужно отобразить его жирным шрифтом, просто измените соответствующую строку на:
Dbgrid1.canvas.font.style: = [fsbold];
Вставить другие визуальные элементы управления в таблице
В программировании базы данных ограничения внешнего ключа являются эффективным методом для обеспечения того, чтобы данные в базе данных хранятся в соответствии с требованиями пользователя. Например, в среде обработки заказов существует ограничение иностранного ключа между таблицей заказов и таблицей клиентов, то есть каждая запись в таблице заказа должна иметь соответствующий элемент в таблице клиентов. Таким образом, при заполнении формы заказа, если список клиентов предоставлен для пользователя, чтобы выбрать в фокусе ввода, правильность данных будет эффективно гарантирована.
Как управление DBGRID, так и элемент управления StringGrid получены из TCustomGrid, где управление DBGRID может вводить данные. Внутренний механизм Delphi для обработки DBGRID заключается в том, чтобы плавать контроль DBEDIT на сетке. Сетка, которая может получить фокусировку и входные данные, на самом деле представляет собой плавающее управление DBEDIT. Так что данные введены в таблице. Таким образом, способ вставить другие визуальные элементы управления в таблицу состоит в том, чтобы плавать визуальное управление на сетке. Таким образом, в принципе, любой контроль может быть вставлен в таблицу. В этой статье приведен пример вставки раскрывающейся коробки в таблицу, чтобы представить конкретные шаги для вставки других элементов управления в сетку.
1 Установить свойства
Прочитайте свойство элементов списка клиентов в раскрывающемся поле.
2 Настройка события OnDrawCell
Событие OnDrawCell запускается при рисовании ячейки таблицы. Когда поле, соответствующее ячейке, которая получает фокус, согласуется с полем, соответствующим раскрывающемуся коробке, переместите раскрывающуюся коробку в сетку, которая получает фокус и делает раскрывающуюся коробку видимой, тем самым достигая функции отображения раскрывающееся поле на указанном столбце таблицы. Событие OnDrawCell для установки таблицы выглядит следующим образом:
Если (GDFocusticed в состоянии), тогда
Начинать
// Если соответствующие поля согласованы, выполнить
if (grid.cells [acol, 0] = 'company') then
Начинать
// переместить раскрывающуюся коробку в указанную позицию
Combobox1.left: = rect.left + grid.left;
Combobox1.top: = rect.top + grid.top;
Combobox1.width: = rect.right-rect.left;
Combobox1.height: = rect.bottom-rect.top;
// Сделайте раскрывающуюся коробку видимой и набираем фокус
Combobox1.visible: = true;
Combobox1.setfocus;
конец;
конец;
3 Настройка мероприятия OnClick
Если поле, соответствующее ячейке, которая получает фокус, не соответствует поле, соответствующему раскрывающемуся коробке, раскрывающаяся коробка не видно. Для этого установите событие таблицы OnClick следующим образом:
If (grid.cells [grid.col, 0] <> 'company') then
Начинать
Combobox1.visible: = false;
конец;
4 Настройка события OnChange
В событии Ondrawcell только работа по рисованию ячеек и отображения раскрывающихся коробок, и данные не могут быть введены в таблицу. Для этого установите событие раскрывающегося ящика Onchange следующим образом:
Grid.cells [grid.col, grid.row]: = combobox1.
Элементы [combobox1.itemindex];
Это завершает работу по вставке раскрывающейся коробки в таблицу.
Показать графические поля в таблице
В разработке программ иногда необходимы некоторые нетрадиционные персонажи в отчетах. Например, поле для инспекции в отчете об инспекции в деталях содержит нетрадиционные символы, такие как частично обработка шероховатости и толерантность к обработке. Общая идея решения этой проблемы состоит в том, чтобы сохранить эти нетрадиционные символы в качестве графических полей, таких как поле изображения в базе данных SQL Server. Однако, будь то элемент управления StringGrid или управление DBGRID, он может только непосредственно отображать строки, что создает проблему отображения графических полей на управлении таблицей.
На первый взгляд, эта проблема может быть решена путем вставки управления dbimage в таблицу, используя приведенный выше метод. Тем не менее, это требует вставки управления с тем же числом, что и запись. , но также, очевидно, мерцание в графике. Лучшим решением является динамическое создание управления DBIMAGE при подключении к базе данных, используйте его для чтения поля изображения базы данных и сохранить его на жесткий диск клиента в качестве временного файла. Прочитайте временный файл в событии Ondrawcell таблицы и завершает работу по рисунку. Вот конкретные шаги для отображения полей графика в таблице.
1 Сохранить поле изображения
Прочитайте все поля изображения при выполнении запроса и сохраните на жесткий диск клиента.
Начинать
... // Опустите заявление запроса
Имя файла: = 'D: EMP';
Mydbimage: = tdbimage.create (self); // Создать dbimage
Mydbimage.parent: = self;
Mydbimage.datasource: = dataSource1;
Mydbimage .datafield: = 'description'; // укажите как поле «Описание»
Индекс: = 1;
В то время как ClientData.eof действительно начинать // Читать базу данных
s: = inttoStr (index);
Filename1: = имя файла+s;
Filename1: = filename1+'. Bmp';
// Сохранить временные файлы
Mydbimage .picture .bitmap .savetofile (filename1);
Grid.cells [1, index]: = '';
// заполнить форму
Grid.cells [2, index]: = clientData.fieldbyName ('измеренные данные'). Appring;
ClientData.next;
Индекс: = Индекс+1;
конец;
Mydbimage.destroy ();
конец;
2 Скопируйте графику
Установите событие OnDrawCell, прочитайте временный файл и скопируйте графику в указанный столбец таблицы:
if ((acol = 1) и (arow> 0) и (grid.colcount> 2)), затем начните
// таблица требует не менее двух столбцов
Имя файла: = 'D: EMP';
S: = inttoStr (arow);
Имя файла: = имя файла+s;
Имя файла: = имя файла+'. Bmp';
MyImage: = timage.create (self); // Создать элемент управления изображением
Myimage.parent: = self;
// Читать временные файлы
Myimage.picture.bitmap.loadfromfile (имя файла);
// скопировать графику
Grid.canvas.draw (rect.left, rect.top, myimage.
Picture.graphic);
Myimage.destroy ();
конец;