Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как проверить наличие свойства компонента


Страницы:   1 2

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 как раз с прицелом на это пишут.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо