Код ниже использует RTTI (информация типа во время выполнения), чтобы извлечь информацию свойства и использовать эту информаци, чтобы установить цвет шрифта в серый, когда управление заблокировано. Если управление разрешено, цвет текста устанавливается в стандартный цвет шрифта.
Теперь, шаг за шагом создание простого примера, который состоит из TForm с TButton и TDBRichEdit и демонстрирует это поведение.
- Выберите
File|New Application из меню Delphi
- Поместите TDataSource, TTable, TButton и TDBEdit на форму
- Установите свойство DatabaseName таблицы в DEMOS
- Установите свойство TableName таблицы в ORDERS.DB
- Установите свойство DataSet набора данных в Table1
- Установите свойство DataSource управления DBEdit в DataSource1
- Установите свойство DataField управления DBEdit в CustNo
- Установите свойство Active управления DBEdit в False
- Добавьте TypInfo в раздел Uses формы
Ниже фактическая процедура, которую поместите в Implementation:
// Эта процедура устанавливает цвет текста
// управления в серый или определенный пользователем
// константы цвета clInfoText.
procedure SetDBControlColor(aControl: TControl);
var FontPropInfo: PPropInfo;
begin
// Проверить, является ли управление знающим данные
if (GetPropInfo(aControl.ClassInfo, 'DataSource') = nil) then
exit
else
begin
// Извлеките свойство шрифта
FontPropInfo:= GetPropInfo(aControl.ClassInfo, 'Font');
// Проверьте управление включено/отключено
if (aControl.Enabled = false) then
// Если отключено, установите цвет текста в серый
TFont(GetOrdProp(aControl, FontPropInfo)).Color:=
clGrayText
else
// Если включено, установите цвет текста в цвет clInfoText
TFont(GetOrdProp(aControl, FontPropInfo)).Color:=
clInfoText;
end;
end;
Код для события ButtonClick должен содержать:
// Этот код циклически повторяется через массив Controls
// и вызывает SetDbControlColor для каждого управления на форме,
// чтобы убедиться, что цвет текста установлен правильно
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
// Цикл через массив управлений
for i:= 0 to ControlCount-1 do
SetDBControlColor(Controls[i]);
end;
|