Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.099 c
15-1350567983
ES
2012-10-18 17:46
2013.03.22
Кодировка в XML (движок msxml)


15-1349261272
Jeer
2012-10-03 14:47
2013.03.22
Визуализация данных


15-1353423286
0xDEADBEEF
2012-11-20 18:54
2013.03.22
неадекватно отображаются компоненты в Windows7


2-1341819656
Remand
2012-07-09 11:40
2013.03.22
Зависание на function InitAllocator


15-1333892049
xayam
2012-04-08 17:34
2013.03.22
mono ttf utf-8





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский