Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 438

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Вопрос у меня глупый: есть панель. На ней куча кнопок, лабелов, эдитов. Если поставить panel1.visible:= false, то и все принадлежащие ей компоненты при запуске программы станут visible:= false.
Внимание, вопрос: почему при panel1.enabled:= false, это свойство не работает на компонентах, принадлежащих панеле? Нужно перебирать всех и устанавливать им .Enabled:= false?

Тамара Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Тамара (статус: Посетитель)
Вопрос отправлен: 23 ноября 2009, 20:37
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, Тамара!

Проведём маленький эксперимент:
Запускаем дельфи, ставим на форму два флажка (CheckBox), одно поле для текста (Memo), кнопку.
Затем ставим панель, на неё ставим вторую кнопку (просто так, она ничего делать не будет).

Теперь прописываем обработчики флажков, первой кнопки и обработчик создания формы:

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  panel1.Enabled:=checkBox1.Checked;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if button2.Visible then memo1.Lines.Add('button is visible')
                     else memo1.Lines.Add('button is INvisible');
  if button2.Enabled then memo1.Lines.Add('button is enabled')
                     else memo1.Lines.Add('button is NOT enabled');
end;
 
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
  panel1.Visible:=checkbox2.Checked;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  checkbox1.Checked := panel1.Enabled;
  checkbox2.Checked := panel1.Visible;
  memo1.Clear;
end;

* при щелчке на первом флажке форма будет становиться доступной/недоступной (свойство Enabled)
* второй флажок - видимость (Visible)
* первая кнопка (которая не на панели) будет выводить в мемо состояние свойств кнопки 2 (той, которая находится на панели)

После запуска увидим, что при щелчке на первой кнопке будет выводиться

button is visible
button is enabled

Независимо от того, видима панель или нет и доступна ли она или нет.

Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 23 ноября 2009, 21:20
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Паровоз

Здравствуйте, Тамара!

При установке свойства Enabled панели в False все компоненты не панели также неявно запрещены -это гарантируется поведением окон в Windows. Вот справка из MSDN:

If the window is being disabled, the system sends a WM_CANCELMODE message. If the enabled state of a window is changing, the system sends a WM_ENABLE message after the WM_CANCELMODE message. (These messages are sent before EnableWindow returns.) If a window is already disabled, its child windows are implicitly disabled, although they are not sent a WM_ENABLE message.

Поэтому дополнительно ничего делать не нужно. Так решили разработчики Windows. А Delphi просто "проецирует" это решение.

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 24 ноября 2009, 00:27


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 24 ноября 2009, 19:07; участников в обсуждении: 2.
Егор

Егор (статус: 10-ый класс), 23 ноября 2009, 20:56 [#1]:

но доступ-то к этим элементам всё равно получить пользователю нельзя (кнопки не нажимаются, текст не вводится и т.д.)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 23 ноября 2009, 21:02 [#2]:

если поставить
panel1.visible:=false
то при запуске все элементы на этой панели будут невидимы, но их свойство visible будет равно true
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 23 ноября 2009, 21:28 [#3]:

или вопрос ставится так: "почему элементы панели исчезают, когда исчезает панель?"
исчезают потому, что им негде "рисовать себя" - они рисуют себя на родителе (панели), а она невидима. они "думают", что нарисовали себя (поскольку честно вывели своё изображение своему родителю - панели), но панель, такая нехорошая, невидима и не показывает себя (а заодно и то, что "нарисовали" на ней её дочерние элементы).
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Тамара

Тамара (статус: Посетитель), 24 ноября 2009, 18:28 [#4]:

а! Ясно! Они выглядят, как доступные, но остаются недоступными из-за недоступности панели-родителя. Так?
Егор

Егор (статус: 10-ый класс), 24 ноября 2009, 19:07 [#5]:

да, так и есть
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.03 сек.