![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SetOrdProp и составное свойтво
мтк © (2012-05-09 19:56:00)Добрый день.
Помогите, пожалуйста, как можно в процедуре TypInfo.SetOrdProp использовать составное свойство? Например:
SetOrdProp(Component_, ' Font.Name', Ord('...'));
Давайте будем жрать! (2012-05-10 15:59:00) [1]Понял, слона-то я и не приметил (третий параметр GetObjectProp). Спасибо.
Юрий Зотов (2012-05-10 14:33:00) [2]
> Давайте будем жрать! (10.05.12 14:17) [9]
1. ПроверкаObj is TFontлишняя. В первой строке уже сказано, что надо искать свойство класа TFont (либо его наследника). Поэтому, если свойство будет найдено, то это гарантированно будет именно TFont (либо его наследник) - и проверка не нужна.
2. Если эту лишнюю проверку убрать, то получаем точно [7], вариант 1.
3. Так действительно проще. Но в первой строке может возникнуть исключение. Если оно не нужно, то надо делать по [7], вариант 2. О чем, кстати, было написано.
Давайте будем жрать! (2012-05-10 14:17:00) [3]
> if (GetPropInfo(Sender, 'Font', [tkClass]) <> nil) and
> GetObjectPropClass(Sender, 'Font').InheritsFrom(TFont)
> then TFont(GetObjectProp(Sender, 'Font', TFont)).Name
> := 'имя_фонта'
Не проще ли
Obj := GetObjectProp(Sender, 'Font', TFont);
if Obj is TFont then
TFont(Obj).Name := 'имя_фонта'
? Или есть какие-то подводные камни?
мтк (2012-05-10 14:07:00) [4]
Юрий Зотов © (10.05.12 12:47) [7]
Спасибо!
Теперь работает и с нестандартными компонентами.
))
Юрий Зотов (2012-05-10 12:47:00) [5]Это не совсем корректно - свойство Font может быть не только у контролов. И оно не обязано иметь класс именно TFont.
Завтра кто-нибудь напишет класс, который не TControl, но свойство Font имеет, причем оно не TFont - и все, код не сработает.
Вот так надежнее - работает с любым объектом и именно с классом TFont:
procedure TForm1.FormCreate(Sender: TObject);
var
Obj: TObject;
begin
Obj := GetObjectProp(Sender, 'Font', TFont);
TFont(Obj).Name := 'имя_фонта'
end;
Если Sender свойства Font не имеет, или оно не TFont, то возникнет исключение. Если оно не нужно, то делаем проверку:
procedure TForm1.FormCreate(Sender: TObject);
begin
if (GetPropInfo(Sender, 'Font', [tkClass]) <> nil) and
GetObjectPropClass(Sender, 'Font').InheritsFrom(TFont) then
TFont(GetObjectProp(Sender, 'Font', TFont)).Name := 'имя_фонта'
end;
Этот код работает с любым объектом и со свойством Font, имеющим класс либо TFont, либо любой его наследник.
AV (2012-05-10 12:32:00) [6]
> Это предатель который?:)
Ну, да про Павлика
Шуточные анти-паттерны
Паблик Морозов: Класс-потомок, созданный в соответствии с этим антипаттерном, выдает по запросу все данные класса-предка, независимо от степени их сокрытия. Название данного анти-паттерна — это каламбур, основанный на созвучии ключевого слова public (паблик), часто означающего открытый доступ к методам и полям класса в объектно-ориентированных языках программирования, и имени пионера-героя Павлика Морозова, известного тем, что он выдал своего отца-кулака занимавшегося вредительством будучи на руководящей должности в советской системе. Источником данного определения является блог пропагандистской направленности.
Inovet (2012-05-10 12:07:00) [7]> [3] AV © (10.05.12 10:49)
> Паблик Морозова
Это предатель который?:)
мтк (2012-05-10 11:46:00) [8]Спасибо, получилось :))
AV (2012-05-10 10:49:00) [9]Можно через Паблик Морозова попробовать а-ля так
TC = class(TControl)
public
property Font;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses TypInfo;
procedure TForm1.btn1Click(Sender: TObject);
var
C:TControl;
begin
if Sender is TControl then
begin
C := TControl(Sender);
SetStrProp( TC(C).Font, 'Name', 'Arial');
end;
end;
мтк (2012-05-10 10:30:00) [10]
> Юрий Зотов
Спасибо за ответ.
>SetStrProp(Component.Font, 'Name', 'имя_фонта')
В этом и загвоздка Component_ объявлен как
Var
Component_:TComponent;
и ему присваиваюComponent_:=FindComponent(ComponentList_.Strings[I]);
т.е. к примеру в Component_ может оказаться и TDBEdit и TDBComboBox.
И чтобы указать Component.Font нужно привести к нужному типу объекта:
SetStrProp(TDBEdit(Component_).Font, 'Name', 'имя_фонта')
SetStrProp(TDBComboBox(Component_).Font, 'Name', 'имя_фонта')
Но тогда теряется сама суть SetStrProp :(
Юрий Зотов (2012-05-10 02:34:00) [11]Font.Name - строковое свойство, а SetOrdProp устанавливает порядковое значение. Строке нельзя присвоить число.
Используйте SetStrProp:
SetStrProp(Component.Font, 'Name', 'имя_фонта')