Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.09.2012, 17:20
andrey_60 andrey_60 вне форума
Прохожий
 
Регистрация: 01.09.2012
Сообщения: 3
Репутация: 10
Вопрос Проблема с изменением высоты формы

Доброе время суток.
Подскажите, пожалуйста.

На форме расположен ScrollBox: TScrollBox, со свойством Align = alClient, на котором расположена pnlPanel:TPanel, со свойствами:
Код:
  pnlPanel.Height = 250;
  pnlPanel.Align = alClient;
  pnlPanel.Constraints.MinHeight = 200.

Таким образом, при изменении высоты формы, панель будет занимать все свободное место на форме, НО нельзя будет установить высоту формы меньше минимальной высоты панельки (200).

Задача:
Необходимо добавить возможность пользователям уменьшать высоту формы до нуля, но высота панельки не должна быть меньше своей минимально возможной высоты, для этого при высоте формы меньшей высоты панельки должны появляться полосы прокрутки скроллбокса.

Для решения этой задачи на событии OnResize формы выполняется следующая процедура.
Код:
procedure TForm3.FormResize(Sender: TObject);
begin
  if ScrollBox.Height < pnlPanel.Constraints.MinHeight + 10 then
    pnlPanel.Align := alTop
  else
    pnlPanel.Align := alClient;
end;
Админ: Пользуемся тегами для оформления кода!

Но почему то, после запуска приложения, когда начинаешь уменьшать высоту формы и высота формы приближается к минимально допустимой высоте панельки, дальнейшее уменьшение невозможно, хотя pnlPanel.Align устанавливается в alTop. Но если в этот момент прервать уменьшение формы (отпустить левую кнопку мыши), а потом опять начать уменьшать форму, то форма будет без проблем уменьшаться до нужных размеров.

Подскажите, пожалуйста, как сделать возможным уменьшение формы до нужных размеров без прерывания.
PS: Извиняюсь, если описал проблему не совсем понятно.

Последний раз редактировалось Admin, 02.09.2012 в 15:50.
Ответить с цитированием
  #2  
Старый 01.09.2012, 18:23
icsander icsander вне форума
Новичок
 
Регистрация: 17.04.2011
Сообщения: 87
Репутация: 10
По умолчанию

Точно не уверен, но вроде у TForm есть св-ва HorzScroll и VertScroll. Т.е. вам не нужен к-т ScrollBar. Кидайте на форму все что вам надо и при уменьшении формы она сама покажет скролбары (ИМХО, дельфы нет под рукой)
Ответить с цитированием
  #3  
Старый 01.09.2012, 18:28
andrey_60 andrey_60 вне форума
Прохожий
 
Регистрация: 01.09.2012
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо за ответ, но все равно не получится установить высоту формы меньше минимальной высоты панельки
Ответить с цитированием
  #4  
Старый 01.09.2012, 21:45
andrey_60 andrey_60 вне форума
Прохожий
 
Регистрация: 01.09.2012
Сообщения: 3
Репутация: 10
По умолчанию

Всем спасибо, проблему решил, но сомнительным способом.
Как я уже писал выше "если в этот момент прервать уменьшение формы (отпустить левую кнопку мыши), а потом опять начать уменьшать форму, то форма будет без проблем уменьшаться до нужных размеров." Поэтому я генерирую программно отпускание и нажатие левой кнопки мыши:

Код:
procedure TForm3.FormResize(Sender: TObject);
begin
  if ScrollBox.Height < pnlAlClientOrAlTop.Constraints.MinHeight + 10 then
  begin
    if pnlAlClientOrAlTop.Align <> alTop then
    begin
      pnlAlClientOrAlTop.Align := alTop;
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    end;
  end
  else
  begin
    if pnlAlClientOrAlTop.Align <> alClient then
      pnlAlClientOrAlTop.Align := alClient;
  end;
end;

Буду благодарен за другие решения, а также за комментарий этого.
Ответить с цитированием
  #5  
Старый 02.09.2012, 19:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от andrey_60
Буду благодарен за другие решения, а также за комментарий этого.
Можно так же положить на ScrollBox ещё одну панель, которая будет лежать спрятанная за основной панелью (Send to Back) и служить своего рода ограничителем:
Код:
object Panel2: TPanel
  Align = alNone
  Left = 0
  Top = 0
  Width = 10
  Height = 200
  BevelInner = bvNone
  BevelOuter = bvNone
  Caption = ''
end
При этом убираешь обработчик "TForm3.FormResize" и обнуляешь "pnlPanel.Constraints.MinHeight"
Ответить с цитированием
  #6  
Старый 02.09.2012, 20:08
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

а так не катит? :
Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  if ClientHeight<=(Panel1.Constraints.MinHeight) then begin
     panel1.Align:=alTop;
  end else begin
     panel1.Align:=alClient;
  end;
end;
И без скроллбокса.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:59.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025