Ещё раз про масштабирование в MDI интерфейсе...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Ещё раз про масштабирование в MDI интерфейсе...

Сообщение Rojohn » 20.07.2005 (Ср) 9:25

Поделитесь опытом...
Как лучше масштабировать элементы на дочерних формах для любых разрешений? Пробую делать, используя "Move" и Разницу с координатами Form.ScaleWidth и Form.ScaleHeight, но при запуске они (особенно ScaleWidth) иногда обнуляются и выдаёт ошибку. Как правильно это делать?
Спасибо!

Alex_2005
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 242
Зарегистрирован: 07.04.2005 (Чт) 17:09
Откуда: Germany, Baden-Wurttemberg, Bietigheim-Bissingen

Сообщение Alex_2005 » 20.07.2005 (Ср) 9:32

Чтоб ошибку не выдовало в событии Form_Resize Введи строку
On Error Resume Next
ну а дальше твой код ресайзинга
Guten Morgen! А если не Guten, то тогда это и не Morgen...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Next

Сообщение Rojohn » 20.07.2005 (Ср) 9:35

Енто я сделал, но надо чтоб ещё и считало правильно, а то координаты вычисляются неверно...

Alex_2005
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 242
Зарегистрирован: 07.04.2005 (Чт) 17:09
Откуда: Germany, Baden-Wurttemberg, Bietigheim-Bissingen

Сообщение Alex_2005 » 20.07.2005 (Ср) 9:42

... если честно то у меня тут никогда ничё не обнуляется... но если всё таки это происходит то попробуй вместо Form.ScaleWidth использовать Form.Width. Тут уже точно никаких проблем не будет.
Guten Morgen! А если не Guten, то тогда это и не Morgen...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Next1

Сообщение Rojohn » 20.07.2005 (Ср) 9:51

Не получается так... Значение Width намного меньше ScaleWidth, наверное она как-то иначе считается, в отличие от ширины элементов управления на форме...
Пишу так:
Sub FormResize()
valLen = (FrameGROVD.Height - cbRayon.Height * 5 - txtTitle.Height * 2) / 9
lblRegion.Move cmdExitMe.Height, valLen * 2
txtRegion.Move cmdExitMe.Height * 1.5 + lblMR.Width, valLen * 2, Me.ScaleWidth - lblMR.Width - cmdExitMe.Height * 3
lblRayon.Move cmdExitMe.Height, lblRegion.Top + lblRegion.Height + valLen, txtRegion.Width
cbRayon.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblRayon.Top, txtRegion.Width * 0.6
End Sub()

Так вот, lblRayon всё время меняет своё положение. Расстояние между ним и lblRegion всё время разное. Может неправильно написал Resize?

-=TsA=-
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 21.09.2004 (Вт) 14:32
Откуда: Татарстан, Заинск

Сообщение -=TsA=- » 20.07.2005 (Ср) 9:59

Залей сюда свою формочку, разберемся

Alex_2005
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 242
Зарегистрирован: 07.04.2005 (Чт) 17:09
Откуда: Germany, Baden-Wurttemberg, Bietigheim-Bissingen

Сообщение Alex_2005 » 20.07.2005 (Ср) 10:04

если значение Width намного меньше, то прибвь к нему 100 200 или скока там тебе надо.

А вобще щас попробую разобраться в коде.
Guten Morgen! А если не Guten, то тогда это и не Morgen...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Next3

Сообщение Rojohn » 20.07.2005 (Ср) 10:09

Как залить формочку?) Лучше поясню задачу:
Есть форма с метками и комбобоксами на фрейме, причем количество и расположение их меняется при разных условиях. Для маштабирования я написал коэффициент valLen, равный одинаковым расстояниям между элементами по вертикали, учитывая, что сверху фрейма берётся 2 таких расстояния. Потом домножаю на ентот valLen, но между 1-м и 2-м верхними комбо расстояние всё время разное, а остальные более-менее сохраняют пропорции при ресайзе формы.

Alex_2005
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 242
Зарегистрирован: 07.04.2005 (Чт) 17:09
Откуда: Germany, Baden-Wurttemberg, Bietigheim-Bissingen

Сообщение Alex_2005 » 20.07.2005 (Ср) 10:12

он имел в виду выражаясь поэтичным языком "залей формачку", чтоб ты выложил свой проект. Тогда легче разобраться.
Guten Morgen! А если не Guten, то тогда это и не Morgen...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Next4

Сообщение Rojohn » 20.07.2005 (Ср) 10:22

Sub Me_Resize()
Dim valLen As Long

On Error Resume Next
lblUserName.Move Me.ScaleWidth - lblUserName.Width - cmdExitMe.Height * 0.5, 0
lblUser.Move lblUserName.Left - lblUser.Width - cmdExitMe.Height * 0.5, lblUserName.Height * 0.1
PicSave.Move Me.ScaleWidth * 0.5 - PicSave.Width * 0.5, lblUserName.Height
PicNSave.Move PicSave.Left, PicSave.Top
lblValSave.Move Me.ScaleWidth * 0.5 - lblValSave.Width * 0.5, lblUserName.Height + PicSave.Height
cmdExitMe.Move Me.ScaleWidth - cmdExitMe.Height * 0.5 - cmdExitMe.Width, Me.ScaleHeight - cmdExitMe.Height * 2.5
cmdSaveGROVD.Move cmdExitMe.Left - cmdSaveGROVD.Width - cmdExitMe.Height, cmdExitMe.Top
FrameGROVD.Move cmdExitMe.Height * 0.5, lblValSave.Top + lblValSave.Height, Me.ScaleWidth - cmdExitMe.Height, Me.ScaleHeight - lblUserName.Height - PicSave.Height - cmdExitMe.Height * 4.5
Select Case valSxem
Case 1
valLen = (FrameGROVD.Height - cbRayon.Height * 4 - txtTitle.Height * 2) / 8
lblRegion.Move cmdExitMe.Height, valLen * 2
lblRayon.Move cmdExitMe.Height, lblRegion.Top + lblRegion.Height + valLen
lblMR.Move cmdExitMe.Height, lblRayon.Top + lblRayon.Height + valLen
lblTitle.Move cmdExitMe.Height, lblMR.Top + lblMR.Height + valLen
lblAdr.Move cmdExitMe.Height, lblTitle.Top + lblTitle.Height + valLen
lblPhone.Move cmdExitMe.Height, lblAdr.Top + lblAdr.Height + valLen
Case 2
valLen = (FrameGROVD.Height - cbRayon.Height * 4 - txtTitle.Height * 2) / 8
lblRegion.Move cmdExitMe.Height, valLen * 2
lblRayon.Move cmdExitMe.Height, lblRegion.Top + lblRegion.Height + valLen
lblNasPun.Move cmdExitMe.Height, lblRayon.Top + lblRayon.Height + valLen
lblTitle.Move cmdExitMe.Height, lblNasPun.Top + lblNasPun.Height + valLen
lblAdr.Move cmdExitMe.Height, lblTitle.Top + lblTitle.Height + valLen
lblPhone.Move cmdExitMe.Height, lblAdr.Top + lblAdr.Height + valLen
Case 3
' MaxWidth = lblMR.Width
valLen = (FrameGROVD.Height - cbRayon.Height * 5 - txtTitle.Height * 2) / 9
lblRegion.Move cmdExitMe.Height, valLen * 2
txtRegion.Move cmdExitMe.Height * 1.5 + lblMR.Width, valLen * 2, Me.ScaleWidth - lblMR.Width - cmdExitMe.Height * 3
lblRayon.Move cmdExitMe.Height, lblRegion.Top + lblRegion.Height + valLen, txtRegion.Width
cbRayon.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblRayon.Top, txtRegion.Width * 0.6
cbRayon1.Move cmdExitMe.Height * 1.5 + lblMR.Width + cbRayon.Width, cbRayon.Top, txtRegion.Width * 0.4
lblNasPun.Move cmdExitMe.Height, lblRayon.Top + lblRayon.Height + valLen
cbNasPun.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblNasPun.Top, cbRayon.Width
cbNasPun1.Move cmdExitMe.Height * 1.5 + lblMR.Width + cbNasPun.Width, cbNasPun.Top, cbRayon1.Width
lblMR.Move cmdExitMe.Height, lblNasPun.Top + lblNasPun.Height + valLen
cbMR.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblMR.Top, cbNasPun.Width
cbMR1.Move cmdExitMe.Height * 1.5 + lblMR.Width + cbMR.Width, lblMR.Top, cbNasPun1.Width
lblTitle.Move cmdExitMe.Height, lblMR.Top + lblMR.Height + valLen
txtTitle.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblTitle.Top, txtRegion.Width
lblAdr.Move cmdExitMe.Height, lblTitle.Top + lblTitle.Height + valLen
txtAdr.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblAdr.Top, txtTitle.Width
lblPhone.Move cmdExitMe.Height, lblAdr.Top + lblAdr.Height + valLen
txtPhone.Move cmdExitMe.Height * 1.5 + lblMR.Width, lblPhone.Top, txtAdr.Width
Case 4
valLen = (FrameGROVD.Height - cbRayon.Height * 4 - txtTitle.Height * 2) / 8
lblRegion.Move cmdExitMe.Height, valLen * 2
lblRayon.Move cmdExitMe.Height, lblRegion.Top + lblRegion.Height + valLen
lblNasPun.Move cmdExitMe.Height, lblRayon.Top + lblRayon.Height + valLen
lblTitle.Move cmdExitMe.Height, lblNasPun.Top + lblNasPun.Height + valLen
lblAdr.Move cmdExitMe.Height, lblTitle.Top + lblTitle.Height + valLen
lblPhone.Move cmdExitMe.Height, lblAdr.Top + lblAdr.Height + valLen
End Select
End Sub
Sub FormResize()
Me_Resize
End Sub

Из Case почти доделан только 3.

Alex_2005
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 242
Зарегистрирован: 07.04.2005 (Чт) 17:09
Откуда: Germany, Baden-Wurttemberg, Bietigheim-Bissingen

Сообщение Alex_2005 » 20.07.2005 (Ср) 10:26

Пошли ПРОЕКТ, или на худой конец хотябы форму с контроллами. Ато прикинь скака контроллов вставлять чтоб подобие твоей воссоздать :shock:
Guten Morgen! А если не Guten, то тогда это и не Morgen...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Моя форма (недоделана)

Сообщение Rojohn » 20.07.2005 (Ср) 10:31

Прилагаю мою недоделанную форму...
Вложения
Form.rar
(10.05 Кб) Скачиваний: 28

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Дополнение...

Сообщение Rojohn » 20.07.2005 (Ср) 10:43

Кстати ещё одно... Если разремить то, что под меткой L1, саму L1, и объявления уровня формы, а также вставить нижеприлагаемый текст в модуль должно получаться изменение пропорций самих контролов, но пишет ошибку, что ширина - ReadOnly. Как быть?

Type ControlProportions
WidthProportions As Single
HeightProportions As Single
TopProportions As Single
LeftProportions As Single
End Type

arbusov
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 04.07.2005 (Пн) 12:43

Сообщение arbusov » 20.07.2005 (Ср) 10:45

Это что у тебя за форма такая хитрая, что ей недостаточно задать отступы для каждого элемента с какого-либо края? Причем легко этот отступ и масштабировать:
Private Sub Form_Resize()
dx = Me.Width - OldX
dy = Me.Height - OldY
OldX = Me.Width
OldY = Me.Height
'...
o.Left = o.Left + dx
'...
o.Top = o.Top + dy
End Sub

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Отступы

Сообщение Rojohn » 20.07.2005 (Ср) 10:50

Боюсь, что отступы заданные числом будут не пропорционально изменяться при разных разрешениях...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Как?

Сообщение Rojohn » 20.07.2005 (Ср) 11:07

Как можно писать:
FrameGROVD.Width = Me.ScaleWidth
FrameGROVD.Height = Me.ScaleHeight
FrameGROVD.Top = 0
FrameGROVD.Left = 0
если FrameGROVD не на всё окно? Вычесть из него элементы?

и как определяется Lab? Надо сделать массив контролов?

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

NextNext

Сообщение Rojohn » 20.07.2005 (Ср) 14:06

Так почему же всё-таки при минимизации главной MDI формы енти контролы сдвигаются в кучу по вертикали? Не все правда... И почему (См.выше) пишет ширину только для чтения :?:
Последний раз редактировалось Rojohn 20.07.2005 (Ср) 14:42, всего редактировалось 1 раз.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 20.07.2005 (Ср) 14:42

Могу закинуть свой клас для авторесайза формы. Насколько мне не изменяет память, он MDI-формы тоже ресайзит. Но могу ошибаться - давно дело было. В общем, если интересно - говори, скину.
То, что для одних константа, для других только переменная...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Класс...

Сообщение Rojohn » 20.07.2005 (Ср) 14:48

Буду очень признателен за класс авторесайза! Только, если можно ещё как им пользоваться и его возможности... Спасибо!!!

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 21.07.2005 (Чт) 1:52

Все, ушло на мыло... Клас сыроват - писался на скорую руку лет 5 назад, но вроде работает ;) В общем если нужно будет - доделаешь. Там вроде все понятно и прозрачно :)
То, что для одних константа, для других только переменная...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Как?

Сообщение Rojohn » 21.07.2005 (Чт) 10:27

Огромное спасибо за класс! Сам я их не разу не писал, а теперь вижу, что не такое уж енто и страшное дело:) В общем всё ясно, кроме того, как выравниваются контролы относительно друг-друга, особенно если количество контролов меняется программно? И как быть, если контролы находятся на фрейме, дописывать класс? Пробовал перерисовать контролы по другому - почему-то они ведут себя как хотят. Например, если сдвинуть Text5 ниже, оставив остальное на месте, то Text4 растягивается только до низа Picture1(2). Получается, что нижний край - это низ Picture?

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 21.07.2005 (Чт) 11:01

Если программно, то наверное с этим классом никак. Точнее его просто нужно чуток дописать, но думаю ты с этим сам справишся :wink: По поводу растягиваня - здесь реализовано пропорциональное масштабирование. То есть на сколько процентов изменилась, например, высота формы, на столько же процентов изменяеться высота контрола, если для него проставлено соответствующее свойство. Так что привязки к другим контролам здесь нет :wink: По поводу фреймов - не помню точно, но по-моему фреймы тоже нормально ресайзаться. Как и остальным - выставляешь tag и все дела.
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 21.07.2005 (Чт) 16:02

А, да, для дочерних MDI форм не забывай ручками проставлять в классе свойства MinWidth и MinHeight. Они должны быть равны соответствующим свойствам форми в design-time. Это критично. Почему, я уже объяснял раньше ;)
То, что для одних константа, для других только переменная...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Та же...

Сообщение Rojohn » 22.07.2005 (Пт) 10:13

Енто я всё понял, но, к сожалению вынужден отказаться от использования класса по причине многовариантности рассположения элементов и их взаимоотношений на форме... А класс рассчитан на самые простые случаи рассположений. Вернулся к простым Move:) пересмотрел код и всё получилось... ;) Зато научился работать с классами - за енто отдельное спасибо!

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 22.07.2005 (Пт) 11:19

Дык я особо и не рассчитывал на то, что этот класс решит все твои проблемы :wink: Мне его хватало, но он действительно ориентирован был на мои потребности :) Главное, что цель достигнута - проблема решена. Кстати, можешь поискать готовые контролы для авторесайзинга. Есть довольно мощные. Просто мне в лом было таскать за собой еще дополнительные контролы для такой простой вещи, как авторесайз :wink:
То, что для одних константа, для других только переменная...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

)

Сообщение Rojohn » 22.07.2005 (Пт) 14:11

Та ну их) Лучше ручками сделать, как душе угодно:) Вообще не представляю как можно было бы сделать такие контролы, слишком тонкая работа))) Требует кода....


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 11

    TopList