![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как проверить наличие свойства компонента
Nil © (2009-06-19 12:45:00)прохожу по всем компонентам формы
for I := 0 to MainForm.ControlCount - 1 do
....
как проверить есть ли у очередного MainForm.Controls[I] свойство Font?
заранее благодарен!
Nil (2009-06-20 13:00:00) [1]оно!! спасибой огромное!
я думал чтобы получить доступ к protected свойству, всё должно быть гораздо сложнее))
Юрий Зотов (2009-06-19 18:36:00) [2]Такой предок есть - именно 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-19 18:31:00) [3]так нельзя, у LControl.Controls[i] свойство Font protected... если не проверять доступно ли свойство Font у очередного контрола, то я так понимаю нужен какой то общий предок для всех контролов у которых хочу менять TFont, а такого к сожалению нет...
Юрий Зотов (2009-06-19 18:24:00) [4]Именно потому, что оно TClass и есть. Сам класс, а не объект этого класса.
Юрий Зотов (2009-06-19 18:22:00) [5]> появилась необходимость сделать сглаженный текст не только у TLabel но
> у всех контролов у которых есть TFont,
То есть, у всех объектов - потомков класса TControl (потому что свойство Font появляется именно в этом классе). Тогда задача решается гораздо проще:
Fnt.lfQuality := 5;
for i := 0 to LControl.ControlCount - 1 do
LControl.Controls[i].Font.Handle := CreateFontIndirect(Fnt);
И всех дел.
Nil (2009-06-19 18:16:00) [6]а поясните пож не понимаю, как с1 может быть самим классом TFont если оно объявлено как TClass, а не TFont?..
Nil (2009-06-19 18:15:00) [7]не меняется пробовал, поэтому и пришлось рекурсией идти. меняется только если поставить ParentFont, но у лейблов шрифт разный, нужно поменять не весь TFont, а только одно его свойство lfQuality у всех лейблов
но опять же, я не знаю как мне обратиться к объекту TFont у с1..
Юрий Зотов (2009-06-19 18:14:00) [8]Насчет приведения типа я ввел Вас в заблуждение, сорри. Дело в том, что c1 является не экземпляром класса TFont, а самим классом TFont. Поэтому приведение и не работало.
Юрий Зотов (2009-06-19 18:10:00) [9]if Assigned(c1) and c1.InheritsFrom(TFont) then
begin
Font := TFont(GetObjectProp(...));
Fnt.lfQuality := 5;
Font.Handle := CreateFontIndirect(Fnt)
end;
Возможно, достаточно будет сменить фонт только у LControl (у дочерних объектов он сменится автоматически) - тогда будут не нужны ни цикл, ни рекурсия.
Nil (2009-06-19 17:56:00) [10]нужно в 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 17:38:00) [11]А в чем смысл этого кода? Что он должен делать?
Nil (2009-06-19 17:31:00) [12]пробовал с приведением ещё так
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 все свойства остаются со значениями по умолчанию..
Nil (2009-06-19 17:26:00) [13]
> Это что-то называется приведение типа: 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...
Юрий Зотов (2009-06-19 17:05:00) [14]> вот тут что-то надо, что из c1 сделает TFont найденной компоненты
Это что-то называется приведение типа: TFont(c1)
Nil (2009-06-19 16:07:00) [15]сори за глуповатые вопросы, но в дебри ООП лазить не приходилось...
Nil (2009-06-19 16:06:00) [16]трудноразличимый мат: 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;
Ega23 (2009-06-19 15:47:00) [17]А TLabel у нас уже TWinControl?
Сергей М. (2009-06-19 15:46:00) [18]
> ругается
Матерно ?
Nil (2009-06-19 15:24:00) [19]пасиба всем, попутный вопрос возник, как обратиться к компоненту который содержит 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);
поясните пож почему, запутался совсем..
Ega23 (2009-06-19 14:58:00) [20]
> Или {$B–} ?
в VCL как раз с прицелом на это пишут.