Вниз
Скачать: CL | DM;

Как скрыть все визуальные компоненты в зависимости от параметра ?   Найти похожие ветки 

← →
ORMADA ©   (2004-03-31 09:39) [0]

Не пойму чё-то как написать универсальный код который будет скрывать все ВИЗУЛЬНЫЕ компонеты
сейчас это делаю так что есть не совсем верно так как при добавлении нового типа компонентов надо лезть сюда и править ?
Пример:
 For i := 0 To ComponentCount - 1 Do
   If Components[ i ].Tag = -1 Then
     If Components[ i ] Is TMenuItem Then TMenuItem(Components[ i ]).Visible := ParamCount > 0
     Else
       If Components[ i ] Is TPanel Then TPanel(Components[ i ]).Visible := ParamCount > 0
и .т.д.
Как узнать что компонент ВИЗУЛЬНОГО класса ?


← →
Serge ©   (2004-03-31 09:42) [1]

Проверять объекты на наличие свойства Visible


← →
ORMADA ©   (2004-03-31 09:43) [2]

2 Serge
как ????


← →
Serge ©   (2004-03-31 09:45) [3]

Я делал так, мобыть мастера покажут что-то оптимальнее и правильнее.

p : pointer;
...
     p := TypInfo.GetPropInfo(TWinControl(Sender).Controls[i].ClassInfo, "Visible");
     If (p <> Nil) Then TypInfo.SetOrdProp(TWinControl(Sender).Controls[i], p, longint(state));
...


← →
Sun bittern ©   (2004-03-31 09:45) [4]

If Components[ i ] Is TPanel
на
If Components[ i ] Is TControl, TWinControl


← →
ЮЮ ©   (2004-03-31 09:46) [5]

Для всех наследников TControl достаточно одной строчки

 If Components[i] Is TСontrol Then TСontrol(Components[i]).Visible := ParamCount > 0

ну для TMenuItem (и ему подобным) придётся оставить свои проверки


← →
Serge ©   (2004-03-31 09:47) [6]

state (boolean) u menia bil parametrom functzii


← →
ORMADA ©   (2004-03-31 09:48) [7]

:))))))) ПАСИБА


← →
Sun bittern ©   (2004-03-31 09:49) [8]

Любимая RTTI :)

В uses TypInfo;

// Если некое свойство у некого объекта
Function HasProperty(AComponent: TObject; APropertyName: String): Boolean;
 var PropInfo: PPropInfo;
Begin
 PropInfo := GetPropInfo(AComponent.ClassInfo, APropertyName);
 Result := PropInfo <> Nil;
End;


← →
ORMADA ©   (2004-03-31 10:01) [9]

Sun bittern ©  а отключать потом визибл как ?


← →
Sun bittern ©   (2004-03-31 10:07) [10]

Также из технологии RTTI

SetPropValue(объект, имя свойства, значение);


← →
ORMADA ©   (2004-03-31 10:09) [11]

2 Sun bittern © Рулёз СПАСИБА :)


← →
Mike_Goblin ©   (2004-03-31 10:34) [12]

Использовать наличие свойства Visible как критерий принадлежности компонента к визуальным, это простое, удобное и неправильное решение данной проблемы. (Пример из VCL: класс TField, пример из жизни: никто не мешает мне написать наследника TComponent и объявить там свойство Visible).

Кусок из хелпа:
The TControl branch consists of components that descend from TControl but not TWinControl (TWidgetControl in CLX applications). Classes in this branch are controls: visual objects that the user can see and manipulate at runtime.

Придерживаясь данного определения: визуальный компонент - это наследник TControl.


← →
Sun bittern ©   (2004-03-31 11:04) [13]

Mike_Goblin ©   (31.03.04 10:34) [12]

Да удобно, но с граблями (упустил из виду).
Надежнее отслеживать TControl.
Так же нет гарантии что в
Sun bittern ©   (31.03.04 09:49) [8]
Visible действительно типа Boolean - еще одна грабля


← →
Sun bittern ©   (2004-03-31 11:26) [14]

Mike_Goblin ©
посмотрел ветку еще раз

ЮЮ ©   (31.03.04 09:46) [5] - TMenuItem (Невизуальный)
С RTTI похоже удобней (но надо быть внимательней) и не попасть в сиуацию  Mike_Goblin ©   (31.03.04 10:34) [12], особенно если Visible может оказаться не Boolean - это если разработчик уверен на 100%, что он не будет использовать классы с такими property в своем проекте. Так что похоже на свой страх и риск.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.023 c
14-1080197122
zx
2004-03-25 09:45
2004.04.18
сайт


14-1080321864
Kor@l
2004-03-26 20:24
2004.04.18
Socket


1-1080922357
Mim
2004-04-02 20:12
2004.04.18
Клоентно-OLAPные кубы


7-1076337539
Makhanev A.S.
2004-02-09 17:38
2004.04.18
Как получить название приложения?


3-1080022593
russko
2004-03-23 09:16
2004.04.18
Копирование БД




   Наверх