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

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

как изменить общее свойство разнотипных контролов [D7, XP]


Страницы:   1 2

Дмитрий ©   (2016-02-12 18:09:00) 

Перебираю в цикле контролы, чтобы установить свойство ReadOnly
Однако    
(Controls[i] as TCustomEdit)... не видит свойства ReadOnly

Как лучше установить ReadOnly для разнотипных полей?
В наличии
TDBEdit,TDBMemo,TDBDateEdit - общий предок TCustomEdit
TDBLookupComboBox   - ...


Юрий Зотов   (2016-02-23 07:18:00) [1]

Удалено модератором


Kilkennycat   (2016-02-22 01:30:00) [2]

http://www.delphimaster.ru/articles/comparray.html#e- мож тут че поможет?


Kilkennycat   (2016-02-22 01:15:00) [3]

Удалено модератором


DenisZ   (2016-02-21 23:43:00) [4]

Удалено модератором


Дмитрий   (2016-02-16 17:21:00) [5]

Про тэг уже думал.
Т.к. это требует вручную перебрать все контролы для установки тэга, вариант отложил.

> Плохая проверка. Завтра, к примеру, появляется какой-нибудь TButtonEdit - и этот Edit станет серым.

Он не станет серым, он станет РидОнли, если его не внести в строку.
Меня смущает Pos и текстовые сравнения внутри цикла.
Хочется что-то вроде Components[i].Name in [Name1, ..., NameN]
При отсутствии вариантов, возможно внесу в теги категорию доступа, тогда
if Components[i].Tag in [Cat1, ..., CatN] then
...
//либо
case Components[i].Tag of
 Cat1, ..., CatN :


Юрий Зотов   (2016-02-16 16:49:00) [6]

> Дмитрий   (16.02.16 16:07) [18]

Плохая проверка. Завтра, к примеру, появляется какой-нибудь TButtonEdit - и этот Edit станет серым.

Используйте свойство Tag. Ноль - не делать серым, единица - делать.


Дмитрий   (2016-02-16 16:07:00) [7]


> Вы бы описали изначальную задачу, простыми русскими словами.  Обычно после этого находится самое простое и самое правильное решение.

Одну форму могут открывать юзеры с разными полномочиями.
Соответственно категории активирую свои элементы.


> Самое "изящное" - это выбросить вообще все проверки класса.  Дело в том, что  при этом способе никакие проверки класса вообще не нужны. Это универсальный способ, он работает для любых объектов.

Проверяю здесь тип для того, чтобы Едиты не становились "серыми".
if Pos(Components[i].ClassName, 'TButton,TBitBtn,TMenuitem')>0 then


Юрий Зотов   (2016-02-15 22:17:00) [8]

> Дмитрий   (15.02.16 17:55) [14]

> Элементы меню и контролы, расположенные на панелях - внезапно
> отсутствуют в списке контролов формы.


Ничего внезапного. Меню - это вообще не контрол. А те контролы, которые лежат на панели - они входят в список Controls своего родительского контрола. То есть панели, а не формы.

Но все компоненты (и контролы, и неконтролы) входят в список Components своего Owner'а. То есть, формы - если они накладывались на форму в design-time.

> Похоже, трудоемкость будет одинаковая, что присвоить
> все контролы в циклах, что вручную.


Вы бы описали изначальную задачу, простыми русскими словами. Обычно после этого находится самое простое и самое правильное решение.

> Какие существуют "изящные" проверки

Самое "изящное" - это выбросить вообще все проверки класса. Дело в том, что  при этом способе никакие проверки класса вообще не нужны. Это универсальный способ, он работает для любых объектов. Переведите код на русский язык - что получится?

Если некий_объект имеет свойство Enabled, // А класс объекта безразличен
 то установить ему это свойство в true


for i:=0 to ComponentCount - 1 do
 if GetPropInfo(Components[i].ClassInfo, 'Enabled') <> nil then
      SetPropValue(Components[i], 'Enabled', false)
 else // Кстати, это else тоже можно убрать
    if GetPropInfo(Components[i].ClassInfo, 'ReadOnly') <> nil then
      SetPropValue(Components[i], 'ReadOnly', true);
// Работу можно немного ускорить, если Components[i].ClassInfo
// вычислять только один раз и запоминать в переменной.


Игорь Шевченко   (2016-02-15 21:43:00) [9]


> внезапно отсутствуют в списке контролов формы.


Они внезапно присутствуют в списке компонентов формы.


Дмитрий   (2016-02-15 20:02:00) [10]

Перешел от списка контролов к списку компонентов
 for i:=0 to ComponentCount -1 do
 begin
   if Pos(Components[i].ClassName, 'TButton,TBitBtn,TMenuitem')>0 then // <==
   begin
     if GetPropInfo(Components[i].ClassInfo, 'Enabled') <> nil then
       SetPropValue(Components[i], 'Enabled', false);
   end
   else
     if GetPropInfo(Components[i].ClassInfo, 'ReadOnly') <> nil then
       SetPropValue(Components[i], 'ReadOnly', true);
 end;


Какие существуют "изящные" проверки со множеством вместо
if Pos(Components[i].ClassName, 'TButton,TBitBtn,TMenuitem')>0 then


Дмитрий   (2016-02-15 17:55:00) [11]

Спасибо, метод
Юрий Зотов ©   (12.02.16 23:45) [4]
if GetPropInfo(Controls[i].ClassInfo, 'ReadOnly') <> nil then
 SetPropValue(Controls[i], 'ReadOnly', true);


замечательно работает.
Споткнулся на двух (одном) моментах:
Элементы меню и контролы, расположенные на панелях - внезапно отсутствуют в списке контролов формы.
)
Похоже, трудоемкость будет одинаковая, что присвоить все контролы в циклах, что вручную.


Германн   (2016-02-14 01:33:00) [12]


> Юрий Зотов ©   (13.02.16 11:39) [10]
>
> > Германн ©   (13.02.16 01:36) [6]
>
> Можно и в D7.

Не знал. Буду теперь "программистом" чуть-чуть более гдубокого профиля. :)
До сих пор я знал только способ "
> или просто
".


Германн   (2016-02-14 01:28:00) [13]


> Leonid Troyanovsky ©   (13.02.16 10:13) [8]


Юрий Зотов   (2016-02-13 11:42:00) [14]

Почему я рекомендую RTTI ?

1. Самый компактный способ.

2. Универсальность. Можно менять состав контролов как угодно - код при этом не меняется.


Юрий Зотов   (2016-02-13 11:39:00) [15]

> Германн ©   (13.02.16 01:36) [6]

Можно и в D7.


Leonid Troyanovsky   (2016-02-13 10:16:00) [16]


> Leonid Troyanovsky ©   (13.02.16 10:10) [7]

> Тогда   if Controls[i] is TCustomEdit then     TMySimpleHackEdit
> (Controls[i]) := False;


 if Controls[i] is TCustomEdit then
   TMySimpleHackEdit (Controls[i]).ReadOnly := False;

Sorry.

--
Regards, LVT.


Leonid Troyanovsky   (2016-02-13 10:13:00) [17]


> Германн ©   (13.02.16 01:36) [6]

> В Д7?

Буквально - D5+.
Принципиально - D2+, IMHO.

--
Regards, LVT.


Leonid Troyanovsky   (2016-02-13 10:10:00) [18]


> Дмитрий   (12.02.16 18:09)

>     (Controls[i] as TCustomEdit)... не видит свойства ReadOnly

Есть простой способ - объявить

type
 TMyHackEdit = class(TCustomEdit)
 public
    property ReadOnly;
 end;

или просто:

type
 TMySimpleHackEdit = class(TCustomEdit);

Тогда

  if Controls[i] is TCustomEdit then
    TMySimpleHackEdit (Controls[i]) := False;


> Как лучше установить ReadOnly для разнотипных полей?

Универсальный способ показал ЮЗ.

Вполне жизнеспособны варианты с размещением полей
на панели или груп-боксе с управлением их Enabled or Visible.

Более гибкие схемы могут задействовать TAction

Но, в любом случае группирование контролов облегчает жизнь.

--
Regards, LVT.


Германн   (2016-02-13 01:36:00) [19]


> Юрий Зотов ©   (12.02.16 23:49) [5]
>
> И больше ничего не надо, никаких предков и никаких сообщений.
>  Только в uses добавить TypInfo.

В Д7?


Юрий Зотов   (2016-02-12 23:49:00) [20]

И больше ничего не надо, никаких предков и никаких сообщений. Только в uses добавить TypInfo.


Страницы:   1 2

Наверх

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