:: Visual Foxpro, Foxpro for DOS
Anchor для 3х Grid-ов
VeterVFP

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
На форме 3 Грида друг под другом + куча объектов.
Нужно их одинаково масштабировать при растягивании формы, изменяя взаимное положение, чтоб не перекрывать др друга.
Можно ли обойтись стандартным Anchor или как-то придется городить свой ресайз?

Вот репро:
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
VeterVFP
Можно ли обойтись стандартным Anchor или как-то придется городить свой ресайз?

А как обойдешься стандартным, если должна быть привязка не к форме, как внешнему контейнеру, а к другим таким же по рангу объектам?
Ведь они должны менять top-height пропорционально друг другу?
Т.е. без своих вычислений в ресайзе формы тут не обойтись.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
Taran
Автор

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Да все можно привязать через Anchor и к низу формы и высота гридов чтоб менялась.
Если мелких объектов мильен и они все синхронно двигаются, то лучше в контейнер положить.
А вот допустим высоту и положение гридов в некоторых случаях лучше прописать руками. Ибо расстояние между ними будет меняться если делать через Anchor. Что порой выглядит неэкономно и небрежно.
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Taran
Да все можно привязать через Anchor и к низу формы и высота гридов чтоб менялась.

Если менять высоту, то смысла в вертикальных якорях вообще нет. Там будет непропорционально и лишнее дергание только.
Если только горизонтальные якоря оставить. Это может пригодиться при растягивании в стороны.
А новые top-height гридов вычисляются в принципе элементарно, и в ресайз формы просто их меняем.
Делал что-то подобное когда-то. Кажется не для трех, а двух объектов. Хотя разницы большой нет.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
Taran
Автор

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Crispy
Taran
Да все можно привязать через Anchor и к низу формы и высота гридов чтоб менялась.

Если менять высоту, то смысла в вертикальных якорях вообще нет. Там будет непропорционально и лишнее дергание только.
Если только горизонтальные якоря оставить. Это может пригодиться при растягивании в стороны.
А новые top-height гридов вычисляются в принципе элементарно, и в ресайз формы просто их меняем.
Делал что-то подобное когда-то. Кажется не для трех, а двух объектов. Хотя разницы большой нет.

Бог ты мой, как все категорично.
Чего это "нельзя"?
И чем вертикальное растягивания отличается от горизонтального?
Можно все! И никаких дерганий нет.
И пропорции будут соблюдены.
Если высота одного постоянная, а другого меняется - вообще без проблем.
Если один занимает 1/3, а второй 2/3 высоты, то они зак и будут занимать.
Но если между грилаем есть просвет, то он тоже увеличится. О чем я выше и говорил.
Всё, других проблем нет.



Исправлено 1 раз(а). Последнее : Taran, 02.07.21 15:21
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
VeterVFP

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
В итоге сделал у себя примерно такой вариант.
Репро:
PUBLIC oFrm
oFrm = CREATEOBJECT("frm")
oFrm.SHOW()
DEFINE CLASS frm AS FORM
DATASESSION = 2
LEFT= 10
TOP= 10
WIDTH= 350
HEIGHT= 500
#DEFINE nnWidth 320
#DEFINE nnHeightGrid 80
#DEFINE nnHeightCmd 23
#DEFINE nnTop 60
#DEFINE nnTopDelta 140
ADD OBJECT StatLbl AS Label WITH WordWrap=.T., CAPTION= "Stat", TOP= 1, LEFT= 5, HEIGHT= 50, WIDTH= nnWidth,;
BorderStyle= 1
ADD OBJECT RefrCmd1 AS COMMANDBUTTON WITH CAPTION= "1", TOP= nnTop, LEFT= 50, WIDTH= 80, HEIGHT= 23
ADD OBJECT FiltGrp1 AS Label WITH CAPTION= " f1", TOP= nnTop+ nnHeightGrid + nnHeightCmd+ 5, LEFT= 1,;
WIDTH= 80, HEIGHT= 18, BorderStyle= 1
ADD OBJECT RefrCmd2 AS COMMANDBUTTON WITH CAPTION= "2", TOP= nnTop+ nnTopDelta, LEFT= 50, WIDTH= 80, HEIGHT= 23
ADD OBJECT FiltGrp2 AS Label WITH CAPTION= " f2", TOP= nnTop+ nnHeightGrid + nnHeightCmd+ nnTopDelta+ 5, LEFT= 1,;
WIDTH= 80, HEIGHT= 18, BorderStyle= 1
ADD OBJECT RefrCmd3 AS COMMANDBUTTON WITH CAPTION= "3", TOP= nnTop+ nnTopDelta*2, LEFT= 50, WIDTH= 80, HEIGHT= 23
ADD OBJECT FiltGrp3 AS Label WITH CAPTION= " f3", TOP= nnTop+ nnHeightGrid + nnHeightCmd+ nnTopDelta*2+ 5, LEFT= 1,;
WIDTH= 80, HEIGHT= 18, BorderStyle= 1
ADD OBJECT GridCntr1 AS grid WITH ;
Top = 85, ;
Left = 10, ;
Width = nnWidth, ;
Height = nnHeightGrid, ;
Anchor= 10,;
Name = "GridCntr1"
ADD OBJECT GridCntr2 AS grid WITH ;
Top = 85 + nnTopDelta, ;
Left = 10, ;
Width = nnWidth, ;
Height = nnHeightGrid, ;
Anchor= 10,;
Name = "GridCntr2"
ADD OBJECT GridCntr3 AS grid WITH ;
Top = 85 + nnTopDelta*2, ;
Left = 10, ;
Width = nnWidth, ;
Height = nnHeightGrid, ;
Anchor= 10,;
Name = "GridCntr3"
********************
* Резайс Формы
********************
PROCEDURE Resize
LOCAL nHFull, nHDelta, nHPart, nHGrid, nT
WITH This
nHFull= ThisForm.Height &&- .StatLbl.Height
nHDelta= .RefrCmd2.Top - .FiltGrp1.Top + .RefrCmd1.Height
nHPart= INT(nHFull/3 - nHDelta)- 5
nHGrid= nHPart - .RefrCmd2.Height
IF nHGrid < 20
RETURN
ENDIF
*Грид 1
.GridCntr1.Height= nHGrid
nT= .GridCntr1.Top + nHGrid
.FiltGrp1.Top= nT + 1
*
.RefrCmd2.Top= nT + 30
*Грид 2
nT= .RefrCmd2.Top + .RefrCmd2.Height + 2
.GridCntr2.Top= nT
.GridCntr2.Height= nHGrid
nT= .GridCntr2.Top + nHGrid
.FiltGrp2.Top= nT + 1
*
.RefrCmd3.Top= nT + 30
*Грид 3
nT= .RefrCmd3.Top + .RefrCmd2.Height + 2
.GridCntr3.Top= nT
.GridCntr3.Height= nHGrid
nT= .GridCntr3.Top + nHGrid
.FiltGrp3.Top= nT + 1
** TEST **
.StatLbl.Caption= ' Form h: '+ TRANSFORM(nHFull)+ ' \ Part h:'+ TRANSFORM(nHPart)+ ' \ Grid h:'+ TRANSFORM(nHGrid)+ CHR(13)+;
' Gr2. t:'+ TRANSFORM(.GridCntr2.Top)+ ' h:'+ TRANSFORM(.GridCntr2.Height)+ ' w:'+ TRANSFORM(.GridCntr2.Width)+ CHR(13)+;
' Gr3. t:'+ TRANSFORM(.GridCntr3.Top)+ ' h:'+ TRANSFORM(.GridCntr3.Height)+ ' w:'+ TRANSFORM(.GridCntr3.Width)
** TEST **
ENDWITH
ENDPROC
********************
PROCEDURE RefrCmd1.CLICK
ThisForm.Resize
ENDPROC
ENDDEFINE



Исправлено 1 раз(а). Последнее : VeterVFP, 07.07.21 09:03
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Не пишу Anchor, если не пустой Resize



Исправлено 1 раз(а). Последнее : Ydin, 07.07.21 21:39
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
VeterVFP

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
Ydin
Не пишу Anchor, если не пустой Resize
Тут Anchor удобен тем, что он настроен рулить шириной.
Поэтому в Resize рулю только высотой и положением - работает адекватно, судя по репро и моему проекту.
Ratings: 0 negative/0 positive
Re: Anchor для 3х Grid-ов
Taran
Автор

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Я бы каждый грид+лабел+команд запихал в контейнер и задал им анснор.
И логически-визуально правильней и ресайзить проще.

А в форм.ресизе позиционировал бы только эти 3 контейнера.
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 43 (Гостей: 43)

© 2000-2024 Fox Club 
Яндекс.Метрика