FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9265
Вход
Рисайзинг формы.

Теперь добиться изменения размеров всех элементов формы пропорционально её изменяющимся размерам не просто просто, а очень просто.


 
Прислал: Василий Поторочин.   Категория: Интерфейс


Рисайзинг формы.


* Рекурсивный метод изменения размеров
* элементов формы. Количество элементов
* на форме и уровень вложенности объектов -
* неограничено.
* Кроме этого метода на форму необходимо
* поместить:
* Свойства: amas[1,1] - массив, для первонач.размеров
* всех элементов формы
* nkolm - фактическая его размерность
* FIRSTHEIGHT - первоначальные
* FIRSTWIDTH размеры формы
* nkofh - коэффициенты высоты
* nkofw и длины изменения
*
* nb1 - переменные для
* nb2 панимуляции с Fontsize
*
* ndelta - текущее смещение значения Fontsize

*
* В метод Init поместить:
THISFORM.firstheight=THISFORM.height
THISFORM.firstwidth=THISFORM.width
THISFORM.nkolm = 0
THISFORM.ndelta = 0
THISFORM.recurs (THISFORM,.F.)
* И в Resize :
THISFORM.nkofh = THISFORM.HEIGHT/THISFORM.FIRSTHEIGHT
THISFORM.nkofw = THISFORM.WIDTH/THISFORM.FIRSTWIDTH
thisform.nkolm = 0
THISFORM.nb1 = 0
THISFORM.nb2 = 1
THISFORM.recurs(THISFORM,.t.)
if (THISFORM.nb2 > 0 and THISFORM.ndelta > 0);
or (THISFORM.nb1 > 0)
THISFORM.ndelta = THISFORM.ndelta + THISFORM.nb1
THISFORM.ndelta = THISFORM.ndelta - THISFORM.nb2
endif
*
* и все...
*

Метод : Recurs

lparameters oObj, lP
LOCAL nTotMem,i,aMems[1],m1
m1 = 7
WITH oObj
if thisform.name # .name or thisform.baseclass # .baseclass
if type("oObj.top") = "N" or type("oObj.height") = "N";
or type("oObj.left") = "N" or type("oObj.width") = "N";
or type("oObj.fontsize") = "N"
thisform.nkolm = thisform.nkolm + 1
if !lP
dimension thisform.amas[thisform.nkolm,m1]

if type("oObj.top") = "N"
thisform.amas[thisform.nkolm,1] =oObj.top
endif
if type("oObj.height") = "N"
thisform.amas[thisform.nkolm,2] = oObj.height
endif
if type("oObj.left") = "N"
thisform.amas[thisform.nkolm,3] = oObj.left
endif
if type("oObj.width") = "N"
thisform.amas[thisform.nkolm,4] = oObj.width
endif
if type("oObj.headerheight") = "N"
thisform.amas[thisform.nkolm,5] =oObj.headerheight
endif
if type("oObj.rowheight") = "N"
thisform.amas[thisform.nkolm,6] = oObj.rowheight
endif
if type("oObj.fontsize") = "N"
thisform.amas[thisform.nkolm,7] =oObj.fontsize
endif

else

if type("oObj.top") = "N"
oObj.top = thisform.amas[thisform.nkolm,1]*THISFORM.nkofh
endif
if type("oObj.height") = "N"
oObj.height = thisform.amas[thisform.nkolm,2]*THISFORM.nkofh
endif
if type("oObj.left") = "N"
oObj.left = thisform.amas[thisform.nkolm,3]*THISFORM.nkofw
endif
if type("oObj.fontsize") = "N"
if (thisform.amas[thisform.nkolm,7]*THISFORM.nkofh)-THISFORM.ndelta > 4
oObj.fontsize = (thisform.amas[thisform.nkolm,7]*THISFORM.nkofh)-THISFORM.ndelta
else
oObj.fontsize = 4
THISFORM.ndelta = THISFORM.ndelta - 1
endif
endif

if type("oObj.width") = "N"
if (oObj.baseclass ="Label" and !.wordwrap);
or oObj.baseclass ="Checkbox"

if (TXTWIDTH(oObj.caption,oObj.fontname,oObj.fontsize))*;
FONTMETRIC(6,oObj.fontname,oObj.fontsize) > oObj.width


THISFORM.nb1 = 1
THISFORM.nb2 = 0
endif
if (TXTWIDTH(oObj.caption,oObj.fontname,oObj.fontsize+1))*;
FONTMETRIC(6,oObj.fontname,oObj.fontsize+1) > oObj.width
THISFORM.nb2 = 0
endif
endif

oObj.width = thisform.amas[thisform.nkolm,4]*THISFORM.nkofw
endif
if type("oObj.headerheight") = "N"
oObj.headerheight = thisform.amas[thisform.nkolm,5]*THISFORM.nkofh
endif
if type("oObj.rowheight") = "N"
oObj.rowheight = thisform.amas[thisform.nkolm,6]*THISFORM.nkofh
endif

endif
endif
endif
nTotMem = AMEMBERS(aMems,oObj,2)
FOR i = 1 TO m.nTotMem
oObj = EVAL("."+aMems[m.i])
IF TYPE("."+aMems[m.i]) = "O"
thisform.recurs(oObj,lP)
ENDIF
ENDFOR
ENDWITH



 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (5.079)
Дополнения пользователей
Рисайзинг формы.
[+][?]
Василий
24.02.02 19:15:11

Похоже, что народ с бодуна праздничного отходит постепенно. Вот и рейтинг стал расти...
Байгужа
12.04.02 15:01:09

Я новичок в VFP6. Не понял как сделать свойство amas массивом. И как на форму поместить
переменные? Плиз ответьте и не пинайте сильно.
Василий
17.04.02 18:42:30

Вызываешь: Form - New Property и добавляешь свойства. Массив так же и задаешь - в квадратных
скобках с размерностью [1,1]
Шумеев Сергей
03.10.02 21:32:57

Решение изящное, но подскажите как его использовать в такой ситуации.
 Есть много форм, разработанных разными программистам и в основном на основе базовых классов.
Очень хотелось внедрить в них Ваше решение. Но делать это "руками" слишком трудоемко, а как
программно решить не соображу.

Заранее благодарен SD. 

Шумеев Сергей
06.07.03 15:13:06

При размещениии в форме элемента treeview дает ошибку в recurs. Видимо Activ-X не учтены.
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика