Как сделать форму невидимой в delphi
Также приветствуются любые другие идеи.
3 ответа
Современные компьютеры очень быстрые. На вашем месте я бы точно каждую секунду рисовал все часы с нуля. Задача решена. Кроме того, если вам нужно сглаживание, то простой трюк в режиме пера никогда не сработает.
(Если вы не используете удаленный рабочий стол, вы можете использовать двойную буферизацию.)
Вы были близки. Вам нужно использовать pmXOR .
Создайте новое приложение Delphi VCL Forms. Поместите TButton в нижнюю часть формы (Button1). Добавьте приведенный ниже код в событие Button1Click.
Все рисование обычно должно выполняться в событии OnPaint; Я намеренно рисую событие Button1Click только для демонстрации.
Просто примечание: вы никогда не должны использовать Form1 внутри обработчика событий для этой формы. Ссылка на переменную Form1 не позволяет вам создать более одного экземпляра формы. Вместо этого используйте Self , и это автоматически будет относиться к экземпляру, в котором выполняется код.
Бывает, знаете ли, полезно скрывать часть информации от пользователя, если она ему в данный момент не нужна. Для этого у контролов в VCL есть свойство Visible, и есть ещё два метода – Show и Hide. Эта троица призвана управлять видимостью контролов на форме.
А вопрос такой. Как лучше писать:
или
?
Как пишете Вы? Почему?
8 коммент.:
Я пишу:
LabelSomeInfo.Visible := True;
Правильно или нет, даже не задумывался. :)
Я тоже через visible
Смотрим код метода 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;
То что ты сделал его невидимым не помешает сделать мне его видимым))
Надо удалять с родителя
Для форм Show, Hide.
А для контролов Visible. (для edit-oв и кнопок еще и enabled заодно).
Почему?
Потому что такой способ меня вполне устраивает.
Давайте поднимем вопрос на уровень выше.
Смена значения LabelSomeInfo.Visible не есть просто проблема "сделать компонент невидимым".
Это суть смены состояние интерфейса. Речь идёт о синхронизации состояния (данных) приложения и интерфейса. Вот это - как-кто это решает - интересно было бы поговорить.
Ну и классика - "скрывать/отображать" компоненты не есть "хорошо". Сильно мешает "стабильности" интерфейса, что может порождать проблемы "ориентации". Пользователь и так нагружен "изменением" данных, а тут мы ему ещё поддаёт "изменение" внешнего вида интерфейса - грубо говоря - что-то было, а потом исчезло.
Я как-то писал (обзову по-своему, чтобы на налететь на термины) формализованную модель состояний с правилами перехода, но проблемы повалили толпой при повышении эргономики интерфейса, т.е. тонкая реакция на микродействия ползьователя. А какие подходы пробовали вы?
Всем
Спасибо, что не поленились написать комментарии. Моё видение вопроса читайте в следующей заметке.
Всеволод, я понимаю о чём Вы, но бывают случаи, когда по другому - никак. У меня такое постоянно - при работе с базами данных. Приложение одно, а баз у клиентов несколько, и они "немного" разных версий (кто-то успел обновить БД, а кто-то базу ещё не обновил, но уже хочет использовать новое приложение). В этом случае проще скрыть кусок интерфейса по условию в момент отображения формы.
Ну или вот ещё вариант - у пользователя нет прав для какого-то действия над объектом - скрываем (чтобы даже не задавался вопросом, мол а что это такое), появились права - отображаем. Конечно это противоречит "стабильности интерфейса", но порой свойство Visible предпочтительнее свойства Enabled.
На самом деле там по меньшей мере 4 метода/свойства, которые весьма сильно различаются по своему функциональному назначению. Собственно, путаница возникает скорее всего из-за того, что мы не носители языка и тонкости перевода зачастую ускользают от нас.
1) Visible -- свойство, которое означает, имеет ли контрол возможность быть видимым. Т.е. если мы установим его в True, это ещё не значит что контрол отобразится. Например, его родитель может быть скрыт и быть слишком мал. С другой стороны, установив свойство в Hide, мы отнимаем у него возможность быть отображенным и он обязательно "спрячется".
2) Hide -- по сути, просто скрывает контрол. Работает всегда.
3) Show -- контролу разрешается быть видимым; кроме того, вызывается метод ShowControl у родителя который может (теоретически) выполнять некую работу, чтобы убедиться что контрол действительно будет показан. Например, контрол-родитель может прокрутить свою клиентскую область чтобы контрол попал на экран.
4) Showing -- функция позволяет проверить, действительно ли контрол отображается на экране в данный момент. (аналогично п.1: если Visible установлен в True, это ещё не значит что он он виден).
Вообще, в этих методах скрыты ещё некоторые плюшки и подводные камни, связанные с Design-time, перекрыванием нашего окна другим etc. Но это уже другой разговор)
Апрель 18th, 2013 admin
Продолжаем рассматривать Delphi, все полное описание свойств Вы можете узнать, если нажмете F1. Итак, модуль Forms, класс TCustomForm является базовым для класса форм Tform и некоторых других форм диалоговых окон. По сути получается, что наследники класса могут содержать в себе такие компоненты, как кнопки CheckBox, списки ComboBox (из палитры компонентов) и другие объекты.
Получается, что основные свойства класса TCustomForm можно представить в следующем виде:
Описание
Некоторые события формы:
Описание
. делфи событие формы onActivate виды событий в делфи delphi события формы delphi form события delphi 7 прорисовка формы
. delphi события формы Свойства формы pASCAL дельфи ее делфи событие формы onActivate delphi 7 форма на у него свойства
На этом шаге мы перечислим основные события, которые могут быть обработаны формой.
Так как форма (компонент типа TForm ) является базовым интерфейсным элементом для всех программ, создаваемых в среде Delphi , уместно начать знакомство с обработчиков, имеющихся у компонента TForm . Напомним, что их перечень можно увидеть в Инспекторе Объектов на вкладке Events :
Рис.1. Перечень событий, обрабатываемых формой
- OnActivate - возникает при активизации формы;
- OnClose - возникает при закрытии формы;
- OnCloseQuery - разрешает/отменяет закрытие формы;
- OnCreate - возникает при создании формы;
- OnDestroy - возникает при закрытии формы;
- OnHide - возникает при "скрытии" формы;
- OnPaint - возникает при необходимости перерисовки формы;
- OnResize - возникает при изменении размеров формы;
- OnShow - возникает при отображении формы.
Большинство событий и их обработчиков присущи и другим компонентам, поэтому они рассматриваются в следующих шагах. Здесь мы остановимся на событиях, характерных непосредственно для формы. Отметим, что эти события носят в большинстве своем нотификационный (уведомляющий) характер и имеют тип TNotifyEvent , описанный следующим образом:
Событие OnActivate
Форма получает событие OnActivate при ее активизации. Активизация формы может произойти при получении ею фокуса, например, когда пользователь нажал кнопку мыши в рабочей области формы. Для дочерних окон MDI-форм (форм, созданных со значением свойства FormStyle , равным fsMDIChild ) событие OnActivate возникает при переключении фокуса на данное окно. Если же происходит переключение фокуса с обычного дочернего окна на MDI-дочернее окно, то это событие получает родительское MDI-окно.
Событие OnActivate носит нотификационный характер.
Событие OnClose
Событие OnClose наступает при закрытии формы. Форма получает это событие перед закрытием формы, которое может наступить либо при вызове метода Close , либо при выборе команды Close из системного меню.
Событие OnClose имеет тип TCloseEvent , описанный следующим образом:
Параметр Action определяет тип закрытия формы и может принимать одно из следующих значений:
Проиллюстрируем использования параметра Action . Создадим новый проект, выполнив File | New | Application . Обработчик события OnClose выглядит следующим образом:
При закрытии формы на экран будет выведено диалоговое окно (рисунок 2):
Рис.2. Диалоговое окно, появляющееся при закрытии приложения
Текст этого примера можно взять здесь.
Событие OnCloseQuery
Пример закрытия формы с подтверждением в этом случае может выглядеть следующим образом:
Текст этого примера можно взять здесь.
Таким образом, событие OnCloseQuery имеет тип TCloseQueryEvent , описанный следующим образом:
Событие OnCreate
- OnCreate;
- OnShow;
- OnActivate;
- OnPaint.
Это событие имеет тип TNotifyEvent .
Таким образом, в обработчике события OnCreate помещаются те действия, которые должны выполниться только один раз при создании формы. Приведем пример обработчика этого события, где задается цвет фона формы, равный системному цвету, определенному в ядре Windows :
Текст этого примера можно взять здесь.
Событие OnDestroy
Событие OnDestroy возникает на финальной стадии закрытия формы и может быть вызвано с помощью методов Destroy или Free либо закрытием главной формы приложения. Это событие имеет тип TNotifyEvent .
Событие OnHide
Событие OnHide возникает при "скрытии" формы, то есть когда ее свойство Visible принимает значение False . Это событие имеет тип TNotifyEvent .
Событие OnPaint
В следующем примере показано, как загружать графическое изображение в обработчике события OnPaint :
Текст этого примера можно взять здесь.
Событие OnResize
Событие OnShow
Событие OnShow возникает, когда форма отображается (то есть когда ее свойство Visible принимает значение True ). Это событие имеет тип TNotifyEvent .
Читайте также: