Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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', 'имя_фонта')


Наверх

Титульная страница Поиск, карта сайта Написать письмо