Последняя сборка – VFP8, SP1.
Класс Resizer библиотеки классов Resizer способен пересчитывать размеры и позиции ВСЕХ объектов ЛЮБОЙ ВЛОЖЕННОСТИ, находящихся на форме.
Возможности:
1. Установление зависимости размеров формы от размеров экрана монитора.
2. Сохранять или не сохранять пропорции формы (соотношение высоты и ширины) при изменении размеров формы.
Resizer1.Lock_proportion = .T. && Сохранять
Resizer1.Lock_proportion = .F. && Не сохранять
3. Можно задать минимальную высоту формы при Resizer1.Lock_proportion = .T.
Resizer1.min_height = Минимальная высота && (По умолчанию = 0)
4. Есть возможность выбора - при изменении размеров объектов пересчитывать FontSize или нет.
Resizer1.font_size = .T. && Пересчитывать
Resizer1.font_size = .F. && Не пересчитывать
5. Можно задать список базовых классов (через пробел), для которых запрещено масштабирование. По умолчанию масштабируются все базовые классы.
Resizer1.FixSizeBaseClass = 'image column'
6. Можно задать список объектов, запрещенных для масштабирования (через пробел). Будет изменяться только месторасположения этих объектов. Размер и содержимое объектов изменяться не будут.
Resizer1 . ObjNotMove = ‘container1’
7. Восстановление первоначальных размеров формы
Resizer1.Reset()
Как использовать:
1. Поместить объект класса Resizer на форму (напр., Resizer1)
2. В Init() формы написать:
* Если задаем список объектов, запрещенный для масштабирования:
Thisform.ObjNotMove = ‘container1’
* Без привязки к размерам экрана
Thisform.Resizer1.get_sizes()
или
* С привязкой к размерам экрана
m.kW = 90 && Желаемый размер вашей формы относительно размера экрана, %.
Thisform.Resizer1.ToScreen(m.kW)
Примечание:
Коэффициент m.kW будет применен к той стороне формы, для которой коэффициент пропорциональности выше, например:
Ширина формы = 500
Высота формы = 400
Ширина экрана = 640
Высота экрана = 480
Кш = 500/640=0,78125
Кв = 400/480=0,83333
Кв > Кш => пропорции расчитываются, исходя из значения высоты формы.
3. В Resize() формы написать - Thisform.Resizer1.set_sizes()
Дополнительная информация по использованию класса:
1. После программного добавления или удаления объектов формы писать - Thisform.Resizer1.get_sizes()
2. При использовании ресайзера в версиях VFP ниже седьмой необходимо откорректировать класс следующим образом:
- в классе использовано свойство объекта Header (в колонках грида) - HeaderHeight, которое появилось только в VFP7. Поэтому, надо убрать код, относящийся к этому свойству:
Метод ADDTOARRAY, строки:
IF TYPE("oControl.HeaderHeight") = "N"
.aControlStats[nLen,6] = oControl.HeaderHeight
ENDIFМетод SET_SIZES, строки:
* Работаем с заголовками гридов
IF TYPE("oControl.HeaderHeight")="N"
oControl.HeaderHeight = THIS.aControlStats[nPos,6]
ENDIF - Для VFP5 (для шестой версии - не тестировалось) обнаружено, что команда oControl # Thisform выдает несовпадение типа оператора. Для обхода глюка корректируем следующие коды:
1.в методе Get_sizes вместо This.Recurs(Thisform) написать This.Recurs(Thisform, 0)
2. в методе Recurs добавить параметр nn - LPARAMETERS oControl, nn
3. строку метода Recurs IF oControl # Thisform заменить на IF nn = 1;
4. конструкцию (тот же метод)
IF TYPE("."+aMems[m.i]) = "O"
this.recurs(oControl)
ENDIFзаменить на
IF TYPE("."+aMems[m.i]) = "O"
nn = 1
this.recurs(oControl, nn)
ENDIF
Глюки:
1. Vladimir V. Ten: "При смене RecordSource в гриде слетают Caption введенные заранее руками, а востанавливаются те которые относяться к RecordSource."
Да, оказалось, что ресайзер как-то неадекватно реагирует на изменение RecordSource в гриде. И причина возникает где-то еще при самой первой рекурсии, что из Init'а формы. Даже если дальше нигде не писать Thisform.Resizer1.set_sizes().
Почему - не знаю, ресайзер при сборе данных об объектах вроде ничего в форме менять не должен. Ошибка - после смены RecordSource реальные объекты в гриде как бы не соответствуют тем данным о них, которые содержатся в массиве ресайзера. На форме они отражаются правильно, а обратиться программно к ним не получается. Любители шарад и ребусов, подключайтесь - Родина вас не забудет!
Вообще, от многих слышала, что динамические изменения RecordSource чреваты непредсказуемостями. Лично я предпочитаю при открытии необходимых таблиц присваивать им конкретный псевдоним и указываю его в качестве источника один раз.
Но для этого случая, все-таки хоть и огородами, но выход есть (в проекте пример прилагается - форма pr1_r). Может, со временем, будет что-нибудь более элегантное.
Условия использования и распространения:
Ресайзер опубликован на сайте Visual Foxpro Club в знак глубокой признательности этому сайту и его посетителям за массу ценнейшей информации, идей и советов, полученных и успешно примененных автором этого класса.
Использование класса - бесплатное, распространение - свободное. Следовательно, автор не несет никакой ответственности за последствия применения ресайзера и не гарантирует его идеальной работоспособности :).
Доработки и обновления:
29.01.02 | Публикация решения. |
27.02.02 | Пересмотрена и оптимизирована большая часть кода. Получена возможность работы ресайзера со всеми объектами любой вложенности. Особая благодарность Василию Поторочину за невольную помощь (путем изучения работы его решения "ресайзинг формы") в написании рекурсии. |
18.04.02 | Добавлено описание метода пересчета размеров формы в зависимости от разрешения монитора. |
20.05.02 | Устранены недочеты работы ресайзера с колонками гридов. Пропорциональное изменение их ширины теперь достигается в любых условиях. (За выявление недочета спасибо Дмитрию Петрову) | 21.05.02 | Оптимизированы некоторые коды, добавлены комментарии к методам, добавлен список базовых классов, для которых запрещено масштабирование. (За идеи, подсказку и критику спасибо Владимиру Максимову)
При работе ресайзера с заголовками гридов (более одной строки) организован пересчет высоты заголовков. (Пожелание Саши из форума) |
05.06.02 | Выявлен недочет: при установке формы с фреймами в очень маленькие размеры возникала ошибка, что высота фрейма некорректна. Недочет исправлен путем проверки новых размеров фреймов при изменении размеров формы. Если новая высота (ширина) фрейма меньше допустимой, размеры формы пересчитываются из расчета минимально допустимой высоты (ширины) самого маленького фрейма на форме. |
26.08.02 | Расчет зависимости размеров формы от размеров экрана оформлен как метод.
Коэффициент m.kW теперь применяется к той стороне формы, для которой коэффициент пропорциональности выше (пожелание Николая, дополнение пользователей) |
06.09.02 | Добавлено описание корректировки класса для версий VFP ниже, чем седьмая (поднял проблему и протестировал класс в VFP5 Олег Славутин). |
25.10.02 | Откорректированы недочеты:
- при установке формы с гридами в очень маленькие размеры возникала ошибка, что высота гридов некорректна. Исправлено. Если новая высота (ширина грида меньше допустимой, размеры формы пересчитываются из расчета минимально допустимой высоты (ширины) самого маленького грида на форме. Минимально допустимые значения - 30х30 пикселей. (Обнаружил Dmitry Shvaika) - при изменении размера формы высота строк в гриде принимала какое-то странное неизвестно откуда взявшееся значение, одинаковое для любых изменений. Сейчас высота строк в гриде почему-то все-равно не изменяется пропорционально размерам формы, но хотя бы держатся заданные размеры. - При большом увеличении надписи с приличным размером фонтов пересчитывались некорректно. Видимо, это связано с общим ограничением размера шрифта = 127. Допустимые для установки размеры шрифтов = [4,127]. - В методе toscreen введена переменная, по которой предварительно запоминается, а потом восстанавливается свойство Visible формы. Это имеет смысл, если такая форма содержится в наборе форм и мы до поры до времени не хотим ее показывать. (Предложение Валерия.) |
10.09.03 | Исправлен глюк, возникаюший при переключении режимов экрана. (Решение Малышева Д.А.) |
26.10.03 | Добавлена возможность запрещать масштабирование конкретных объектов и их содержимого. (Идея решения Влада) |
Пример использования класса прилагается.
Е.В.Белюкова
Вложенные файлы
# |
Название |
Тип файла |
Размер |
---|---|---|---|
1 | 169resizer | .zip | 52,85 КБ |