Текущий архив: 2009.08.16;
Скачать: CL | DM;
Вниз
как проверить наличие свойства компонента Найти похожие ветки
← →
Nil (2009-06-19 12:45) [0]прохожу по всем компонентам формы
for I := 0 to MainForm.ControlCount - 1 do
....
как проверить есть ли у очередного MainForm.Controls[I] свойство Font?
заранее благодарен!
← →
Сергей М. © (2009-06-19 12:47) [1]Для опубликованных свойств см. ф-цию TypInfo.IsPublishedProp
← →
MBo © (2009-06-19 12:47) [2]посмотреть подходящие функции в модуле typinfo.pas
← →
Palladin © (2009-06-19 12:48) [3]Uses
TypInfo;
IsPublishedProp
← →
{RASkov} © (2009-06-19 12:51) [4]http://www.delphisources.ru/pages/faq/base/set_props_values.html
← →
Ega23 © (2009-06-19 12:53) [5]
uses TypInfo
procedure TForm1.Button10Click(Sender: TObject);
var
p : PPropInfo;
begin
p := GetPropInfo(Timer1, "Font");
if Assigned(p) then
ShowMessage("Yea!")
else
ShowMessage("No!")
end;
Но тут есть нюанс - я ведь могу своё свойство
property Font : Integer read ... write ... задать
← →
Leonid Troyanovsky © (2009-06-19 14:44) [6]
> Ega23 © (19.06.09 12:53) [5]
> property Font : Integer read ... write ... задать
var
p: PPropInfo;
c: TClass;
..
p := GetPropInfo(xxx.ClassType, "Font");
if Assigned(p) then
if p^.PropType^.Kind = tkClass then
begin
c:= GetObjectPropClass(p);
if Assigned(c) then
if c.InheritsFrom(TFont) then
ShowMessage("Yea!");
end;
--
Regards, LVT.
← →
Ega23 © (2009-06-19 14:55) [7]
> Leonid Troyanovsky © (19.06.09 14:44) [6]
Ну да, как-то так.
← →
Германн © (2009-06-19 14:55) [8]
> Leonid Troyanovsky © (19.06.09 14:44) [6]
AND не любишь? Или {$B–} ?
:)
← →
Ega23 © (2009-06-19 14:58) [9]
> Или {$B–} ?
в VCL как раз с прицелом на это пишут.
← →
Nil (2009-06-19 15:24) [10]пасиба всем, попутный вопрос возник, как обратиться к компоненту который содержит TFont, после того как поменял я этот TFont?.
вот мой кусочек, чтобы понятнее было о чём хочу сказать:function SetLabelAntiAliasing(LControl: TWinControl): TWinControl;
var
i:integer;
Fnt: TLogFont;
p: PPropInfo;
c: TClass;
begin
for I := 0 to LControl.ControlCount - 1 do
begin
p := GetPropInfo(LControl.Controls[I].ClassType, "Font");
if Assigned(p) then
if p^.PropType^.Kind = tkClass then
begin
c:= GetObjectPropClass(p);
// ShowMessage(c.ClassName);
if Assigned(c) then
if c.InheritsFrom(TFont) then
begin
// ShowMessage("Yea! "+LControl.Controls[I].Name+" - "+IntToStr(TFont(c).Size));
GetObject(TFont(c).Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
TFont(c).Handle := CreateFontIndirect(Fnt);
SetObjectProp(LControl.Controls[I],"Font",TFont(c));
end;
end;
if (LControl.Controls[I] is TWinControl) then
if (LControl.Controls[I] as TWinControl).ControlCount>0 then
SetLabelAntiAliasing(LControl.Controls[I] as TWinControl);}
end;
{ for I := 0 to LControl.ControlCount - 1 do
begin
if LControl.Controls[I] is TLabel then
begin
GetObject((LControl.Controls[I] as TLabel).Font.Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
(LControl.Controls[I] as TLabel).Font.Handle := CreateFontIndirect(Fnt);
end;
if (LControl.Controls[I] is TWinControl) then
if (LControl.Controls[I] as TWinControl).ControlCount>0 then
SetLabelAntiAliasing(LControl.Controls[I] as TWinControl);
end;}
end;
так не работает, ругается на строчку
TFont(c).Handle := CreateFontIndirect(Fnt);
поясните пож почему, запутался совсем..
← →
Сергей М. © (2009-06-19 15:46) [11]
> ругается
Матерно ?
← →
Ega23 © (2009-06-19 15:47) [12]А TLabel у нас уже TWinControl?
← →
Nil (2009-06-19 16:06) [13]трудноразличимый мат: access violation.. не в этом суть..
if (LControl.Controls[I] is TWinControl) then ... это для компонентов которые лежат например на TPageControl
вопрос так и не решил.. я не знаю как из с1 которое объявлено как TClass, получить TFont
for I := 0 to LControl.ControlCount - 1 do
begin
p := GetPropInfo(LControl.Controls[I].ClassType, "Font");
if Assigned(p) then
if p^.PropType^.Kind = tkClass then
begin
c1:= GetObjectPropClass(p);
if Assigned(c1) then
if c1.InheritsFrom(TFont) then
begin
Font:=TFont.Create;
try
// вот тут что-то надо, что из c1 сделает TFont найденной компоненты чтобы я скопировал в новый TFont всё его свойства кроме lfQuality....
GetObject(Font.Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
Font.Handle := CreateFontIndirect(Fnt);
SetObjectProp(LControl.Controls[I],"Font",Font);
finally
Font.Free;
end;
end;
end;
← →
Nil (2009-06-19 16:07) [14]сори за глуповатые вопросы, но в дебри ООП лазить не приходилось...
← →
Юрий Зотов © (2009-06-19 17:05) [15]> вот тут что-то надо, что из c1 сделает TFont найденной компоненты
Это что-то называется приведение типа: TFont(c1)
← →
Nil (2009-06-19 17:26) [16]
> Это что-то называется приведение типа: TFont(c1)
в 10 посте написал что то подобное
GetObject(TFont(c).Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
TFont(c).Handle := CreateFontIndirect(Fnt);
SetObjectProp(LControl.Controls[I],"Font",TFont(c))
но судя по всему что то тут не так.. вот здесь TFont(c).Handle := CreateFontIndirect(Fnt); access vioaltion...
← →
Nil (2009-06-19 17:31) [17]пробовал с приведением ещё так
Font:=TFont.Create;
try
Font.Handle:=TFont(c1).Handle;
GetObject(Font.Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
Font.Handle := CreateFontIndirect(Fnt);
SetObjectProp(LControl.Controls[I],"Font",Font);
finally
Font.Free;
end;
ошибки нет, но должного эффекта тоже нет.. у Font все свойства остаются со значениями по умолчанию..
← →
Юрий Зотов © (2009-06-19 17:38) [18]А в чем смысл этого кода? Что он должен делать?
← →
Nil (2009-06-19 17:56) [19]нужно в Font получить точную копию класса Font найденного контрола LControl.Controls[I] изменить у него lfQuality (хочу чтобы текст всех контролов независимо настроек системы был сглаженным). не знаю насколько правильно я понял, но в с1 в данном коде как раз нужный мне экземпляр Font моего контрола, а как к нему обратиться не знаю..
вот код моей новой функции которая не работает...function SetLabelAntiAliasing(LControl: TWinControl): TWinControl;
var
i:integer;
Fnt: TLogFont;
p: PPropInfo;
c1, c2: TClass;
Font: TFont;
begin
for I := 0 to LControl.ControlCount - 1 do
begin
p := GetPropInfo(LControl.Controls[I].ClassType, "Font");
if Assigned(p) then
if p^.PropType^.Kind = tkClass then
begin
c1:= GetObjectPropClass(p);
if Assigned(c1) then
if c1.InheritsFrom(TFont) then
begin
Font:=TFont.Create;
try
Font.Handle:=TFont(c1).Handle;
GetObject(Font.Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
Font.Handle := CreateFontIndirect(Fnt);
SetObjectProp(LControl.Controls[I],"Font",Font);
finally
Font.Free;
end;
end;
end;
if (LControl.Controls[I] is TWinControl) then
if (LControl.Controls[I] as TWinControl).ControlCount>0 then
SetLabelAntiAliasing(LControl.Controls[I] as TWinControl);
end;
end;
вот так было раньшеfunction SetLabelAntiAliasing(LControl: TWinControl): TWinControl;
var
i:integer;
Fnt: TLogFont;
begin
for I := 0 to LControl.ControlCount - 1 do
begin
if LControl.Controls[I] is TLabel then
begin
GetObject((LControl.Controls[I] as TLabel).Font.Handle, SizeOf(TLogFont), @Fnt);
Fnt.lfQuality := 5;
(LControl.Controls[I] as TLabel).Font.Handle := CreateFontIndirect(Fnt);
end;
if (LControl.Controls[I] is TWinControl) then
if (LControl.Controls[I] as TWinControl).ControlCount>0 then
SetLabelAntiAliasing(LControl.Controls[I] as TWinControl);
end;
end;
но появилась необходимость сделать сглаженный текст не только у TLabel но у всех контролов у которых есть TFont, отсюда и все мои вопросы в ветке
← →
Юрий Зотов © (2009-06-19 18:10) [20]if Assigned(c1) and c1.InheritsFrom(TFont) then
begin
Font := TFont(GetObjectProp(...));
Fnt.lfQuality := 5;
Font.Handle := CreateFontIndirect(Fnt)
end;
Возможно, достаточно будет сменить фонт только у LControl (у дочерних объектов он сменится автоматически) - тогда будут не нужны ни цикл, ни рекурсия.
← →
Юрий Зотов © (2009-06-19 18:14) [21]Насчет приведения типа я ввел Вас в заблуждение, сорри. Дело в том, что c1 является не экземпляром класса TFont, а самим классом TFont. Поэтому приведение и не работало.
← →
Nil (2009-06-19 18:15) [22]не меняется пробовал, поэтому и пришлось рекурсией идти. меняется только если поставить ParentFont, но у лейблов шрифт разный, нужно поменять не весь TFont, а только одно его свойство lfQuality у всех лейблов
но опять же, я не знаю как мне обратиться к объекту TFont у с1..
← →
Nil (2009-06-19 18:16) [23]а поясните пож не понимаю, как с1 может быть самим классом TFont если оно объявлено как TClass, а не TFont?..
← →
Юрий Зотов © (2009-06-19 18:22) [24]> появилась необходимость сделать сглаженный текст не только у TLabel но
> у всех контролов у которых есть TFont,
То есть, у всех объектов - потомков класса TControl (потому что свойство Font появляется именно в этом классе). Тогда задача решается гораздо проще:
Fnt.lfQuality := 5;
for i := 0 to LControl.ControlCount - 1 do
LControl.Controls[i].Font.Handle := CreateFontIndirect(Fnt);
И всех дел.
← →
Юрий Зотов © (2009-06-19 18:24) [25]Именно потому, что оно TClass и есть. Сам класс, а не объект этого класса.
← →
Nil (2009-06-19 18:31) [26]так нельзя, у LControl.Controls[i] свойство Font protected... если не проверять доступно ли свойство Font у очередного контрола, то я так понимаю нужен какой то общий предок для всех контролов у которых хочу менять TFont, а такого к сожалению нет...
← →
Юрий Зотов © (2009-06-19 18:36) [27]Такой предок есть - именно TControl. А protected - не проблема.
type
TFriendControl = class(TControl);
=================
Fnt.lfQuality := 5;
for i := 0 to LControl.ControlCount - 1 do
TFriendControl(LControl.Controls[i]).Font.Handle := CreateFontIndirect(Fnt);
← →
Nil (2009-06-20 13:00) [28]оно!! спасибой огромное!
я думал чтобы получить доступ к protected свойству, всё должно быть гораздо сложнее))
Страницы: 1 вся ветка
Текущий архив: 2009.08.16;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.019 c