Форум: "Начинающим";
Текущий архив: 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.09 c