Автоматическое изменение размеров объектов при изменении размеров формы
Используется для автоматического изменения размеров объектов на форме при изменении размеров формы. Вы не должны ничего менять в вашей форме.Только лишь поместите класс на форму, запустите ее,изменяйте размер и увидите, что получится
Автоматическое изменение размеров
объектов при изменении размеров формы
Vresize.vcx содержит только один класс 'vresizer'. Он используется
для автоматического изменения размеров объектов на форме при изменении размеров
формы. Вы не должны ничего менять в вашей форме.Только лишь поместите класс
на форму, запустите ее,изменяйте размер и увидите, что получится.
Известные ограничения: нет поддержки фонтов с дикретными размерами.
Копирайты и гарантии: распространяется as is и без гарантий.
Когда помещаю объект на форму то он почмуто теряетт свойство BaseClass и кучу прочих свойств
Порга на это ругается
Людмила
25.04.01 11:10:26
Если есть доступ к автору этой библиотеки, хотелось бы попросить его добавить свойство - изменять
размер шрифта или нет. Очень уж изменение размера шрифта не красит форму.
akudenzov@radon.ru
22.06.01 01:53:07
1. Попробуте добавить в такую форму Grid и поиграйтесь, полная муть!
2. Уменшим форму до минимума несколько раз - поля начинают перекрываться и не востанавливаются
3. По моему объектный код класса нужно делать, когда это работает
Didao
27.07.01 02:06:02
**********************************************************************
** Пропорциональная растяжка ФОРМЫ и ее объектов на разные разрешения монитора
** Obj - ссылка на Форму, nHi,nWi - начальная высота и ширина формы, nRez - ширина разрешения
** (c) DBRAD32(Obj,nHi,nWi,nRez,nH,nW,lSub)
Local nBuf,ni,np,nWWW,cBuf
IF EMPTY(nRez)
nRez=800
ENDIF
nWWW=SYSMETRIC(1)
IF !lSub
IF !(TYPE("obj.class")=="C" .AND. UPPER(obj.baseclass)=="FORM")
RETURN
ENDIF
IF nRez==nWWW
RETURN
ENDIF
Obj.LockScreen=.T.
** коэффициенты изменения
nW=nWWW/nRez
** ширина
IF nWi*nW>SYSMETRIC(21)-7
nW=(SYSMETRIC(21)-7)/nWi
ENDIF
** высота
nH=nW
IF nHi*nW>SYSMETRIC(22)-78
nH=(SYSMETRIC(22)-78)/nHi
ENDIF
Obj.Width=IIF(Obj.Width<0,0,Obj.Width)
Obj.Height=IIF(Obj.Height<0,0,Obj.Height)
Obj.Width=nWi*nW
Obj.Height=nHi*nH
Obj.Top=Obj.Top*nH
Obj.Left=Obj.Left*nW
ENDIF
** Обычные объекты
ni=1
DO WHILE TYPE("Obj.Objects(ni).Class")=="C"
IF TYPE("Obj.Objects(ni).Top")=="N"
** Запрет изм ширины колонок
IF !UPPER(Obj.Objects(ni).Class)="COLUMN"
Obj.Objects(ni).Width=Obj.Objects(ni).Width*nW
ENDIF
Obj.Objects(ni).Height=Obj.Objects(ni).Height*nH
Obj.Objects(ni).Top=Obj.Objects(ni).Top*nH
Obj.Objects(ni).Left=Obj.Objects(ni).Left*nW
ENDIF
IF TYPE("Obj.Objects(ni).FontSize")=="N"
nBuf=INT(Obj.Objects(ni).FontSize*nW)
IF nBuf>4 .AND. nBuf<100
Obj.Objects(ni).FontSize=nBuf
ENDIF
ENDIF
** вложенные объекты
IF TYPE("Obj.Objects(ni).Objects(1).Class")=="C"
=FormResize(Obj.Objects(ni),,,,nH,nW,.t.)
ENDIF
** PageFrame
np=1
DO WHILE TYPE("Obj.Objects(ni).Pages(np).Class")=="C"
nBuf=INT(Obj.Objects(ni).Pages(np).FontSize*nW)
IF nBuf>4 .AND. nBuf<100
Obj.Objects(ni).Pages(np).FontSize=nBuf
ENDIF
** вложенные объекты в странице
IF TYPE("Obj.Objects(ni).Pages(np).Objects(1).Class")=="C"
=FormResize(Obj.Objects(ni).Pages(np),,,,nH,nW,.t.)
ENDIF
np=np+1
ENDDO
IF LOWER(Obj.Objects(ni).ParentClass)=="container"
=Obj.Objects(ni).Resize()
ENDIF
ni=ni+1
ENDDO
IF !lSub
Obj.LockScreen=.F.
ENDIF
RETURN
Хорошее и удобное решение. Давно было нужно, но как-то руки не доходили. Спасибо.
Но есть маленькое замечание, даже не по классу, а по инициализации формы с привязкой к размеру
экрана.
1) о вылезании за границу экрана по высоте
В Вашем примере вы увеличиваете ширину формы до ширины экрана (с коэффициетом m.kw) , а затем
пропорционально изменяете длину формы. Если форма "толстая" (ширина больше высоты), то все хорошо.
Если же форма "длинная" - ширина меньше высоты - то высота формы становится больше высоты экрана.
Тут следует выбирать коэффициент допустимого увеличения формы как меньший из 2-х коэффициентов:
k1=ширина_экрана / ширина_формы
k2=высота_экрана / высота_формы
k=IIF(k1 m.kh , m.kh, m.kw)
&& выбираем меньший коэфф, чтобы форма не вылезла за границу экрана
*************************************************
.Resizer1.get_sizes()
&& получение размеров объектов на форме
*********************************
* новые размеры формы
.Width=.Width * m.scr_k_mod * m.scr_proc/100
&& привязка ширины к экранной области
.Height=.Height * m.scr_k_mod * m.scr_proc/100
&& привязка ширины к экранной области
.Resizer1.set_sizes()
.Resizer1.get_sizes()
.LockScreen=.F.
.Visible=.T.
*********************************
* новое положение формы
IF .AutoCenter=.T.
.AutoCenter=.T.
ELSE
.Left=.Left * m.scr_k_mod * m.scr_proc/100
.Top=.Top * m.scr_k_mod * m.scr_proc/100
ENDIF
.Refresh
ENDWITH
****************************************************
В остальном все ПОКА замечательно и удобно.
Спасибо и успехов!
С уважением, Николай (nik78@aport.ru)
Николай
01.07.02 13:12:09
Текст моего сообщения здорово исказился, потому повторяю.
*********************************************************
Хорошее и удобное решение. Давно было нужно, но как-то руки не доходили. Спасибо.
Но есть маленькое замечание, даже не по классу, а по инициализации формы с привязкой к размеру
экрана.
1) о вылезании за границу экрана по высоте
В Вашем примере вы увеличиваете ширину формы до ширины экрана (с коэффициетом m.kw) , а затем
пропорционально изменяете длину формы. Если форма "толстая" (ширина больше высоты), то все хорошо.
Если же форма "длинная" - ширина меньше высоты - то высота формы становится больше высоты экрана.
Тут следует выбирать коэффициент допустимого увеличения формы как меньший из 2-х коэффициентов:
k1=ширина_экрана / ширина_формы
k2=высота_экрана / высота_формы
k=IIF(k1 m.kh , m.kh, m.kw) && выбираем меньший коэфф, чтобы форма не вылезла за
границу экрана
*************************************************
.Resizer1.get_sizes() && получение размеров объектов на форме
*********************************
* новые размеры формы
.Width=.Width * m.scr_k_mod * m.scr_proc/100 && привязка ширины к экранной области
.Height=.Height * m.scr_k_mod * m.scr_proc/100 && привязка ширины к экранной области
.Resizer1.set_sizes()
.Resizer1.get_sizes()
.LockScreen=.F.
.Visible=.T.
*********************************
* новое положение формы
IF .AutoCenter=.T.
.AutoCenter=.T.
ELSE
.Left=.Left * m.scr_k_mod * m.scr_proc/100
.Top=.Top * m.scr_k_mod * m.scr_proc/100
ENDIF
.Refresh
ENDWITH
****************************************************
В остальном все ПОКА замечательно и удобно.
Спасибо и успехов!
С уважением, Николай (nik78@aport.ru)
Николай
01.07.02 13:14:20
К сожалению, почему-то искажается текст в середине.
Ну да ладно, идея понятна.
Успехов.