Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

SetOrdProp и составное свойтво   Найти похожие ветки 

 
мтк   (2012-05-09 19:56) [0]

Добрый день.

Помогите, пожалуйста, как можно в процедуре TypInfo.SetOrdProp использовать составное свойство? Например:


SetOrdProp(Component_, "Font.Name", Ord("..."));


 
Юрий Зотов ©   (2012-05-10 02:34) [1]

Font.Name - строковое свойство, а SetOrdProp устанавливает порядковое значение. Строке нельзя присвоить число.

Используйте SetStrProp:
SetStrProp(Component.Font, "Name", "имя_фонта")


 
мтк   (2012-05-10 10:30) [2]


> Юрий Зотов


Спасибо за ответ.


>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 :(


 
AV ©   (2012-05-10 10:49) [3]

Можно через Паблик Морозова попробовать а-ля так

 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 11:46) [4]

Спасибо, получилось :))


 
Inovet ©   (2012-05-10 12:07) [5]

> [3] AV ©   (10.05.12 10:49)
> Паблик Морозова

Это предатель который?:)


 
AV ©   (2012-05-10 12:32) [6]


> Это предатель который?:)

Ну, да про Павлика

 
Шуточные анти-паттерны
 Паблик Морозов: Класс-потомок, созданный в соответствии с этим антипаттерном, выдает по запросу все данные класса-предка, независимо от степени их сокрытия. Название данного анти-паттерна — это каламбур, основанный на созвучии ключевого слова public (паблик), часто означающего открытый доступ к методам и полям класса в объектно-ориентированных языках программирования, и имени пионера-героя Павлика Морозова, известного тем, что он выдал своего отца-кулака занимавшегося вредительством будучи на руководящей должности в советской системе. Источником данного определения является блог пропагандистской направленности.


 
Юрий Зотов ©   (2012-05-10 12:47) [7]

Это не совсем корректно - свойство 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, либо любой его наследник.


 
мтк   (2012-05-10 14:07) [8]

Юрий Зотов ©   (10.05.12 12:47) [7]

Спасибо!

Теперь работает и с нестандартными компонентами.

))


 
Давайте будем жрать!   (2012-05-10 14:17) [9]


> 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:33) [10]


> Давайте будем жрать!   (10.05.12 14:17) [9]

1. Проверка Obj is TFont лишняя. В первой строке уже сказано, что надо искать свойство класа TFont (либо его наследника). Поэтому, если свойство будет найдено, то это гарантированно будет именно TFont (либо его наследник) - и проверка не нужна.

2. Если эту лишнюю проверку убрать, то получаем точно [7], вариант 1.

3. Так действительно проще. Но в первой строке может возникнуть исключение. Если оно не нужно, то надо делать по [7], вариант 2. О чем, кстати, было написано.


 
Давайте будем жрать!   (2012-05-10 15:59) [11]

Понял, слона-то я и не приметил (третий параметр GetObjectProp). Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.174 c
15-1350908665
Grimm375
2012-10-22 16:24
2013.03.22
перевести на английский


15-1351197002
Юрий
2012-10-26 00:30
2013.03.22
С днем рождения ! 26 октября 2012 пятница


15-1339590107
Хригорий
2012-06-13 16:21
2013.03.22
Что такое нативный язык программирования?


8-1202127408
sssyura
2008-02-04 15:16
2013.03.22
Форма без фона


2-1342725812
Wadimka
2012-07-19 23:23
2013.03.22
Помогите сделать персер строки