delphi dbgrid значение ячейки

5 philnext [2012-09-19 18:47:00]

Мне нужно отобразить некоторое модифицированное «замаскированное» значение в VCL TDBGrid (Delphi XE2), то есть: изменить «пароль» на «xxxxxxxx» или прописную букву «pass» на «PASS» или другие. Поскольку мои поля динамически создаются (но имя закодировано, поэтому я знаю, как и когда они маскируются: xxxx_PASSW для полей пароля) Я не могу использовать событие (я думаю) OnGetText.

Итак, каков наиболее эффективный способ сделать это (поскольку я еще использую OnDrawColumnCell для некоторой модификации презентации, я бы предпочел использовать его)?

delphi delphi-xe2 tdbgrid

4 ответа

10 Решение Hendra [2012-09-21 07:32:00]

Есть как минимум 3 способа сделать это, я проиллюстрирую, маскируя поле пароля из базы данных. Я использую sql-сервер для SQL-диалекта.

1. Определите вычисленное поле в строке sql.

Затем щелкните правой кнопкой мыши на dbgrid, выберите редактор столбцов. Внутри редактора столбцов dbgrid просто выберите столбец maskedPwd вместо реального столбца пароля. Теперь dbgrid отобразит замаскированное значение вместо пароля.

или

2. Определите вычисленное поле в наборе данных, используемом dbgrid.

Просто щелкните правой кнопкой мыши на наборе данных и используйте редактор полей для создания нового вычисленного поля (например, maskedPwd2). Затем событие onCalcField в наборе данных, напишите код, чтобы установить значение maskedPwd2, т.е.

Обязательно включите maskedPwd2 в редакторе столбцов dbgrid.

или

3. Напишите пользовательский текст в событии onDrawColumnCell для dbgrid.

Обратите внимание, что приведенный выше код показывает только маскированное значение, но если сетка доступна для редактирования, реальное значение пароля будет отображаться, когда ячейка будет сфокусирована/отредактирована.

Чтобы справиться с этим, отбросьте TEdit в форме, очистите свойство текста, установите для свойства PpasswordChar значение ‘*’ и видимое значение false. Теперь он готов к использованию в качестве замены встроенного редактора для ячейки. Теперь нам нужна некоторая логика склеивания, т.е.

Обратите внимание, что вышеприведенный код еще не совершенен, но сущность существует. Я оставлю это вам для упражнений.

Я бы написал OnGetText для поля пароля в моем наборе данных, так как значение поля не должно отображаться ни в каком элементе управления вообще

Нужно ли маскировать все значения во всем столбце? В этом случае, если вы знаете, для чего это TField (или имя поля): попробуйте динамически создать вычисленное поле с измененными значениями и отобразить это в столбце.

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

Не нужно много работать, чтобы превратить его в классное поле пароля.

Забыл одну вещь в событии Cell Column Draw DBGr ). AsString;

Я должен показать некоторое модифицированные «замаскированы» значение в VCL TDBGrid (Delphi XE2), а именно: изменение «пароль» до «XXXXXXXX» или «проход» верхнего регистра в «PASS» или другие. Поскольку мои поля создаются динамически (но имя кодируется таким образом, я знаю, как и когда маскировать их, а именно: xxxx_PASSW для пароля) Я не могу использовать (я думаю) OnGetText событие.

Так что это наиболее эффективный способ сделать это (как я еще использовать OnDrawColumnCell для некоторого представления модификации я предпочитаю использовать)?

Есть по крайней мере 3 способа сделать это, я проиллюстрирую маскирование поля пароля из базы данных. Я использую сервера SQL для SQL диалекта.

1. Определить вычисляемое поле на SQL строки.

Затем щелкните правой кнопкой мыши на DBGrid, выберите редактор столбцов. Внутри редактора колонок в DBGrid, просто выберите maskedPwd столбец вместо реального столбца паролей. Теперь DBGrid отобразит замаскированное значение вместо пароля.

или

2. Определить вычисляемое поле для набора данных, используемых в DBGrid.

Просто щелкните правой кнопкой мыши на наборе данных, а также использовать поля-редактор для создания нового вычисляемого поля (например, maskedPwd2). Тогда onCalcField событие набора данных, написать код, чтобы установить значение maskedPwd2, т.е.

Убедитесь в том, чтобы включить maskedPwd2 в редакторе столбцов в DBGrid.

или

3. Создать произвольный текст на событие onDrawColumnCell в DBGrid.

Обратите внимание, что приведенный выше код отображает только замаскированное значение, но если сетка редактируемая, реальное значение пароля будет виден, когда клетка ориентирована / под ред.

Чтобы справиться с этим, падение TEdit на форму, очистить свойства текста, установите PpasswordChar свойство в «*», и видна ложь. Теперь он готов быть использован в качестве замены для встроенного редактора для ячейки. Теперь нам нужны склейки логики, т.е.

Обратите внимание, что приведенный выше код не является совершенным, но, но суть там. Я оставлю это вам для физических упражнений.

Нередко при разработке приложений, использующих табличный вывод данных, требуется отобразить те или иные строки таблиц нестандартным образом, например, с целью привлечения внимания пользователя к этим строкам. В данной статье содержатся некоторые советы, касающиеся нестандартного отображения данных в компоненте TDBGrid.

Как изменить цвет строки в TDBGrid

Предположим, нам требуется изменить атрибуты текста и фона строки в компоненте TDBGrid, если значение какого-либо поля удовлетворяет заранее заданному условию. Для этой цели принято использовать обработчик события OnDrawColumnCell этого компонента. Отметим, что возможности, предоставляемые при его использовании, весьма разнообразны.

Рассмотрим простейшее приложение с TDBGrid, содержащее один компонент TTable, один компонент TDataSource и один компонент TDBGrid: Установим значения их свойств в соответствии с приведенной ниже таблицей:

Компонент Свойство Значение
Table1 DatabaseName BCDEMOS (или DBDEMOS)
TableName events.db
Active true
DataSource1 DataSet Table1
DBGrid1 DataSource DataSource1

Обычно для перерисовки изображения в ячейках используется метод OnDrawColumnCell.

Его параметр Rect – структура, описывающая занимаемый ячейкой прямоугольник; параметр Column — колонка DBGrid, в которой следует изменить способ рисования изображения. Для вывода текста используется метод TextOut свойства Canvas компонента TDBGrid.

Предположим, нам нужно изменить цвет текста и фона строки в зависимости от значения какого-либо поля (например, VenueNo). Создадим обработчик события OnDrawColumnCell компонента DBGrid1.

В случае Delphi соответствующий код имеет вид:

В результате на этапе выполнения при отображении строк, в которых значение поля VenueNo равно 1, фон ячеек будет окрашен в зеленый цвет, а текст выведен белым цветом.

При выводе выделенных строк все данные в ячейках оказались выровненными по левому краю. Если мы хотим более корректно отобразить выравнивание текста в колонке, следует слегка модифицировать наш код, учитывая значение свойства Alignment текущей (то есть рисуемой в данный момент) колонки:

Соответствующий код для Delphi имеет вид:

В этом случае выравнивание текста в колонках совпадает с выравниванием столбцов.

Отметим, что величина смещения (в данном случае два пиксела), вообще говоря, зависит от гарнитуры и размера шрифта, используемого в данной колонке, и должна подбираться индивидуально.

Если необходимо отобразить нестандартным образом не всю строку, а только некоторые ячейки, следует проанализировать имя поля, отображаемого в данной колонке, как в приведенном ниже обработчике событий.

Соответствующий код для Delphi имеет вид:

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

Как заменить данные в столбце компонента TDBGrid

Нередко в колонке DBGrid нужно вывести не реальное значение, хранящееся в поле соответствующей таблицы, а другие данные, соответствующие имеющимся (например, символьную строку вместо ее числового кода). В этом случае также используется метод TextOut свойства Canvas компонента TDBGrid:

Соответствующий код для Delphi имеет вид:

Еще один пример – использование значков из шрифтов Windings или Webdings в качестве подставляемой строки.

Соответствующий код для Delphi имеет вид:

Как поместить графическое изображение в TDBGrid

Использование свойства Canvas компонента TDBGrid в методе OnDrawColumnCell позволяет не только выводить в ячейке текст методом TextOut, но и размещать в ячейках графические изображения. В этом случае используется метод Draw свойства Canvas.

Модифицируем наш пример, добавив в форму компонент TImageList и поместив в него несколько изображений.

Модифицируем код нашего приложения:

Соответствующий код для Delphi имеет вид:

Теперь в TDBGrid в колонке VenueNo находятся графические изображения.

Оцените статью