Отключить изменение размера формы в delphi
Есть ли способ остановить изменение размера формы пользователем?
В настоящее время я использую:
При изменении размера формы.
Но это выглядит ужасно, так как мерцает, когда пользователь пытается изменить размер формы.
задан 29 марта ’10, 11:03
Разве вы не можете перехватить событие WM_RESIZE и проглотить его? Бьюсь об заклад, кто-то еще опубликует код, прежде чем я смогу вернуться домой сегодня вечером, но если нет, то я опубликую что-нибудь позже. Я на 99% уверен, что делал это где-то раньше. 🙂 — robsoft
Событие, которое вы имеете в виду, wm_Size , @Robsoft, но это уведомление, а не команда. Как только вы получили это сообщение, уже слишком поздно, потому что размер окна уже изменился. — Rob Kennedy
3 ответы
Фиксация размера легко, у вас есть два варианта:
Формы Delphi имеют BorderStyle собственность и BorderIcons свойство. Если вы установите BorderStyle в bsDialog BorderIcons в biSystemMenu только пользователь не может изменить размер формы.
Вы можете указать значение для Constraints свойство. Если вы напишете одно и то же число MinWidth и MaxWidth , ширина будет фиксированной.
Предотвращение перемещения является более сложным. Я могу придумать только эти решения сейчас:
Поставьте BorderStyle в bsNone . При необходимости вам нужно будет нарисовать заголовок формы самостоятельно.
Напишите обработчик сообщений WM_NCHITTEST , вызовите сначала наследуемый, затем проверьте Message.Result для HTCAPTION . Если это HTCAPTION , установите его на HTCLIENT вместо. Таким образом, вы обманываете Windows, думая, что пользователь не щелкнул заголовок, поэтому он не сможет перетаскивать. Попробуйте, может ли пользователь по-прежнему перемещать окно, открыв системное меню и выбрав «Переместить». Если это так, вы должны скрыть и системное меню ( BorderIcons ).
ответ дан 10 окт ’14, 10:10
+1 Я думаю, что самый простой способ добиться этого — использовать ограничения. — Джонни
Однако у ограничений есть одна действительно досадная ошибка: если вы установите MinWidth и MaxWidth и MinHeight и MaxHeight соответственно к тем же значениям, и попробуйте изменить размер формы с левой или верхней границей, тогда форма будет не изменена, а перемещена. Параметр bsSingle не имеет этой проблемы, а также лучше (последовательно) с точки зрения пользовательского интерфейса. Форма, размер которой не изменяется, также не должна иметь границы изменения размера. — мгие
@mghie. > . «тогда форма будет не изменена, а перемещена». Это ошибка VCL, которая, кажется, была исправлена. См. QC71595- qc.embarcadero.com/wc/qcmain.aspx?d=71595 для возможного обходного пути. — Сертак Акюз
@Sertac: Да, это ошибка VCL, которая возникла с момента введения ограничений и не исправлялась более десяти лет. В моем ответе на этот вопрос есть еще один обходной путь (без необходимости менять VCL), который я использовал. Хотя здорово, что они, кажется, исправили это наконец. — мгие
Если вы хотите, чтобы ваша форма вообще не изменяла размер, установите стиль границы формы на bsSingle это правильно, так как тогда курсор мыши не изменится на один из курсоров изменения размера при перемещении за границы формы, поэтому для пользователя очевидно, что эта форма не может быть изменена.
Если вы хотите установить минимальный и/или максимальный размер формы, то bsSizeable является правильным стилем границы, и вы можете использовать Constraints формы для указания пределов. Однако существует проблема, заключающаяся в том, что Constraints Свойство не предотвращает изменение размера формы, оно только приводит к тому, что размеры корректируются постфактум, чтобы ограничения не нарушались. Это будет иметь отрицательный побочный эффект, заключающийся в том, что изменение размера формы с левой или верхней границей приведет к ее перемещению. Чтобы этого не произошло, вам нужно предотвратить изменение размера в первую очередь. Windows отправляет WM_GETMINMAXINFO сообщение для получения минимального и максимального размеров отслеживания для окна верхнего уровня. Обработка этого и возврат правильных ограничений устраняет проблему с движущейся формой:
Disable form resizing in delphi
But this looks horrible as it flickers as the user tries to change the form size.
3 Answers 3
Fixing the size is easy, you have two options:
Delphi forms have a BorderStyle property and a BorderIcons property. If you set BorderStyle to bsDialog , and BorderIcons to biSystemMenu only, user can not resize the form.
You can specify value to Constraints property. If you write the same number to MinWidth and MaxWidth , the width will be fixed.
Preventing move is more tricky. I can come up with only these solutions now:
Set BorderStyle to bsNone . You will need to draw the form caption yourself, if needed.
Write a message handler to WM_NCHITTEST , call inherited first, then check the Message.Result for HTCAPTION . If it is HTCAPTION , set it to HTCLIENT instead. This way, you fool Windows to think the user didn’t click on caption, so he will not be able to drag. Please try if the user can still move the window opening the system menu, and choosing Move. If so, you have to hide the system menu too ( BorderIcons ).
If you want your form to not resize at all, then setting the form border style to bsSingle is the right thing to do, as then the mouse cursor will not change to one of the sizing cursors when moved over the form borders, so it is obvious to the user that this form can not be resized.
If you want to set a minimum and / or a maximum size for the form, then bsSizeable is the correct border style, and you can use the Constraints of the form to specify the limits. There is however the problem that the Constraints property doesn’t prevent the resizing of the form, it only causes the sizes to be adjusted after the fact so that the limits are not violated. This will have the negative side effect that sizing the form with the left or upper border will move it. To prevent this from happening you need to prevent the resizing in the first place. Windows sends the WM_GETMINMAXINFO message to retrieve the minimum and maximum tracking sizes for a top level window. Handling this and returning the correct constraints fixes the moving form issue:
Программирование на Delphi
Ограничение на изменение размера формы по размеру панели на ней
Программа и Интерфейс — Формы
Анимация окна — AnimateWindow
Анимация форм при сворачивании и разворачивании
Временно запретить форме перерисовываться
Временно запретить форме перерисовываться 2
Вывести окно на передний план
Динамическое создание формы
До динамического создания формы узнать, существует ли она
Если форма не существует — создать
Заблокировать перемещение формы
Закрыть форму с анимацией
Замена Form на FormIni
Заполнение фона формы рисунком 2
Из региона формы вычитается регион надписи
Изменить оконную процедуру для TForm
Изменить параметры создания формы — добавить прозрачность
Как найти окно по неполному названию
Как получить дескриптор текущего окна
Как сделать так, чтобы окно было во весь экран
Как создать новую форму, которая бы не отбирала фокус у существующей
Как сохранить всю форму в файл (как Delphi в .dfm)
Косвенный вызов формы
Менять главную форму во время выполнения
Минимизирование формы при запуске
Можно ли заблокировать обновление определенного окна
Можно ли рисовать на рамке формы
Можно ли создать форму, которая получает дополнительные параметры в методе Сreate
Как запретить изменять размер формы в delphi
Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.1.2009
Репутация: нет
Всего: нет
Профиль
Группа: Участник
Сообщений: 107
Регистрация: 8.3.2008
Репутация: 1
Всего: 1
ты про свойство borderstyle формы? в single например
а картинку можно align — alclient будет с формой тянуца
Это сообщение отредактировал(а) kr3v3tkus — 2.2.2009, 20:37
Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.11.2008
Репутация: нет
Всего: нет
| Код |
| procedure TForm1.FormCreate(Sender: TObject); begin Constraints.MaxHeight:=360; Constraints.MinHeight:=360; Constraints.MaxWidth:=360; Constraints.MinWidth:=360; end; |
Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков
Репутация: 5
Всего: 11
| Цитата(kr3v3tkus @ 2.2.2009, 20:36) |
| ты про свойство borderstyle формы? в single например а картинку можно align — alclient будет с формой тянуца |
Профиль
Группа: Участник
Сообщений: 107
Регистрация: 8.3.2008
Репутация: 1
Всего: 1
| Цитата(Christoph @ 3.2.2009, 13:04) |
| Она не будет тянутся) она будет на всю форму |
Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells
Репутация: 3
Всего: 54
Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.1.2009
Репутация: нет
Всего: нет
Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков
Репутация: 5
Всего: 11
| Цитата(SneG0K @ 3.2.2009, 14:52) |
| Создай обрабочик onResize и напиши в нем Resize := false; |

Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по Дельфи обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
[ Время генерации скрипта: 0.1132 ] [ Использовано запросов: 21 ] [ GZIP включён ]