среда, 12 февраля 2014 г.

Вопросик про Show, Hide и Visible

Бывает, знаете ли, полезно скрывать часть информации от пользователя, если она ему в данный момент не нужна. Для этого у контролов в VCL есть свойство Visible, и есть ещё два метода – Show и Hide. Эта троица призвана управлять видимостью контролов на форме.
А вопрос такой. Как лучше писать:
LabelSomeInfo.Visible := True;
или
LabelSomeInfo.Show;
?
Как пишете Вы? Почему?

 

Ответ в следующей заметке.

8 коммент.:

Анонимный комментирует...

Я пишу:
LabelSomeInfo.Visible := True;

Правильно или нет, даже не задумывался... :)

Альберт комментирует...

Я тоже через visible

Unknown комментирует...

Смотрим код метода Show:

procedure TControl.Show;
begin
if Parent <> nil then Parent.ShowControl(Self);
if not (csDesigning in ComponentState) or
(csNoDesignVisible in ControlStyle) then Visible := True;
end;

Если есть уверенность, что компонент уже видим, то однозначно LabelSomeInfo.Visible := True;

Unknown комментирует...

То что ты сделал его невидимым не помешает сделать мне его видимым))

Надо удалять с родителя

Алексей Тимохин комментирует...

Для форм Show, Hide.
А для контролов Visible. (для edit-oв и кнопок еще и enabled заодно).
Почему?
Потому что такой способ меня вполне устраивает.

Всеволод комментирует...

Давайте поднимем вопрос на уровень выше.

Смена значения LabelSomeInfo.Visible не есть просто проблема "сделать компонент невидимым".
Это суть смены состояние интерфейса. Речь идёт о синхронизации состояния (данных) приложения и интерфейса. Вот это - как-кто это решает - интересно было бы поговорить.

Ну и классика - "скрывать/отображать" компоненты не есть "хорошо". Сильно мешает "стабильности" интерфейса, что может порождать проблемы "ориентации". Пользователь и так нагружен "изменением" данных, а тут мы ему ещё поддаёт "изменение" внешнего вида интерфейса - грубо говоря - что-то было, а потом исчезло.

Я как-то писал (обзову по-своему, чтобы на налететь на термины) формализованную модель состояний с правилами перехода, но проблемы повалили толпой при повышении эргономики интерфейса, т.е. тонкая реакция на микродействия ползьователя. А какие подходы пробовали вы?

Николай Зверев комментирует...

Всем
Спасибо, что не поленились написать комментарии. Моё видение вопроса читайте в следующей заметке.

Всеволод, я понимаю о чём Вы, но бывают случаи, когда по другому - никак. У меня такое постоянно - при работе с базами данных. Приложение одно, а баз у клиентов несколько, и они "немного" разных версий (кто-то успел обновить БД, а кто-то базу ещё не обновил, но уже хочет использовать новое приложение). В этом случае проще скрыть кусок интерфейса по условию в момент отображения формы.
Ну или вот ещё вариант - у пользователя нет прав для какого-то действия над объектом - скрываем (чтобы даже не задавался вопросом, мол а что это такое), появились права - отображаем. Конечно это противоречит "стабильности интерфейса", но порой свойство Visible предпочтительнее свойства Enabled.

balmo комментирует...

На самом деле там по меньшей мере 4 метода/свойства, которые весьма сильно различаются по своему функциональному назначению. Собственно, путаница возникает скорее всего из-за того, что мы не носители языка и тонкости перевода зачастую ускользают от нас.

1) Visible -- свойство, которое означает, имеет ли контрол возможность быть видимым. Т.е. если мы установим его в True, это ещё не значит что контрол отобразится. Например, его родитель может быть скрыт и быть слишком мал. С другой стороны, установив свойство в Hide, мы отнимаем у него возможность быть отображенным и он обязательно "спрячется".

2) Hide -- по сути, просто скрывает контрол. Работает всегда.

3) Show -- контролу разрешается быть видимым; кроме того, вызывается метод ShowControl у родителя который может (теоретически) выполнять некую работу, чтобы убедиться что контрол действительно будет показан. Например, контрол-родитель может прокрутить свою клиентскую область чтобы контрол попал на экран.

4) Showing -- функция позволяет проверить, действительно ли контрол отображается на экране в данный момент. (аналогично п.1: если Visible установлен в True, это ещё не значит что он он виден).

Вообще, в этих методах скрыты ещё некоторые плюшки и подводные камни, связанные с Design-time, перекрыванием нашего окна другим etc. Но это уже другой разговор)

Отправить комментарий

.

.