Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.023 c
2-1245605116
Женя
2009-06-21 21:25
2009.08.16
Програмка для определения типа инсталлятора программ.


15-1245011406
Юрий
2009-06-15 00:30
2009.08.16
С днем рождения ! 15 июня 2009 понедельник


15-1245044573
blurcode
2009-06-15 09:42
2009.08.16
Срубил меня остеохондроз, видимо.


2-1245496909
мимо
2009-06-20 15:21
2009.08.16
работа с файлом через папку.


2-1245426913
Alexander3
2009-06-19 19:55
2009.08.16
Структура в Dll