Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2015, 18:16   #1
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию Корректное изменение размеров фреймов

Доброе время суток!

В программе я динамически создаю фреймы (они, условно, состоят из заголовка и контента) и размещаю их в виде списка, один под другим. При нажатии на "заголовок" фрейма происходит скрытие/показ "контента" и, соответственно, изменение размеров самого фрейма.
У фрема задано Align = Top, а у компонентов внутри тоже хитрые привязки размеров.

Проблема: если фреймы не вмещаются в окне/scrollbox-e, то появляется полоса прокрутки и нарушается размеры заголовка/контента... либо часть всего фрейма скрывается под прокруткой, либо скрывается только заголовок/контент.... при исчезновение прокрутки иногда всё правильно растягивается, а иногда нет.

Как вообще делать адекватный динамический интерфейс? Не может же быть, что только одному мне понадобилось такое реализовать уже в 3й программе (в первых 2х я ещё мог закрыть глаза на такие глюки).
GreenWizard вне форума Ответить с цитированием
Старый 04.02.2015, 19:43   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

AutoScroll:=False не помогает?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.02.2015, 19:53   #3
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
AutoScroll:=False не помогает?
увы, не вариант... нужно, в худшем случае, чтоб скроллбар был виден всегда (как у TMemo), чтоб не менялся размер рабочей области
GreenWizard вне форума Ответить с цитированием
Старый 04.02.2015, 19:59   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Проблема: если фреймы не вмещаются в окне/scrollbox-e, то появляется полоса прокрутки и нарушается размеры заголовка/контента... либо часть всего фрейма скрывается под прокруткой, либо скрывается только заголовок/контент.... при исчезновение прокрутки иногда всё правильно растягивается, а иногда нет.
Рассчитывать размеры фрейма так, чтобы в минимальном состоянии он умещался на предложенном родителе. А уж Align = Top чтобы мог по крайней мере не уменьшить его размеры. По другому ни как. Как себе представляешь попытку засунуть футбольный мяч в бумажник? Или бумажник подходящего размера, или сдутый мяч, хотя все равно не влезет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.02.2015, 20:09   #5
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Рассчитывать размеры фрейма так, чтобы в минимальном состоянии он умещался на предложенном родителе. А уж Align = Top чтобы мог по крайней мере не уменьшить его размеры. По другому ни как. Как себе представляешь попытку засунуть футбольный мяч в бумажник? Или бумажник подходящего размера, или сдутый мяч, хотя все равно не влезет
ну, например, просто запускать заново процесс перерасчёта размеров всех фреймов, если размер родителя его изменился)
GreenWizard вне форума Ответить с цитированием
Старый 04.02.2015, 20:13   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Не давать уменьшить размер родителя ниже определенного уровня. Свойство Constraints. А программный пересчет приведет к тому, что текст с лупой нужно будет читать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.02.2015 в 20:16.
Аватар вне форума Ответить с цитированием
Старый 05.02.2015, 12:31   #7
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

сам спросил - сам и отвечай.
В общем, такой костыль:
Код:
.........................
const
  WM_HACK = WM_USER + 755;

type
  TfrmSelectOrder = class(TForm)
    scrlbx1: TScrollBox;
    procedure scrlbx1CanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
    procedure scrlbx1Resize(Sender: TObject);
  private
    scrlVisible: Boolean;
    procedure OnHack(var msg: TMessage); message WM_HACK;
  end;
.........................................
procedure TfrmSelectOrder.FormCreate(Sender: TObject);
// тут я заполняю scrlbx1 фреймами с Align = alTop
end;
................................
procedure TfrmSelectOrder.OnHack(var msg: TMessage);
var
  i: Integer;
begin
  for i := 0 to scrlbx1.ControlCount - 1 do
    scrlbx1.Controls[i].Width := 5; // принуждаем фреймы пересчитать размеры
end;

// запоминаем была ли видна прокрутка до изменения размеров scrlbx1
procedure TfrmSelectOrder.scrlbx1CanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  scrlVisible := scrlbx1.VertScrollBar.IsScrollBarVisible;
end;

procedure TfrmSelectOrder.scrlbx1Resize(Sender: TObject);
begin
  // если прокрутка только появилась, то нужно принудительно фреймы обновить
  if scrlbx1.VertScrollBar.IsScrollBarVisible <> scrlVisible then
    PostMessage(Handle, WM_HACK, 0, 0);
end;
Костыль, увы, но как правильно - не понятно.
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размеров TListView cosmic_call Общие вопросы Delphi 2 10.02.2013 14:02
изменение размеров рамки Алек Помощь студентам 0 16.12.2011 17:19
Изменение размеров окна Liones Общие вопросы Delphi 4 15.10.2010 09:01
Изменение размеров pinksky Microsoft Office Excel 3 18.04.2008 15:52
Изменение размеров элементов romets Win Api 2 18.02.2008 23:28