Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > масштаб Label


Автор: Guest45 29.3.2019, 13:15
Задача:
разместить текстовую метку Label1 у правого края формы, с учетом изменения размеров формы мышкой.
Единицы измерения в программе - твипы (по умолчанию).

Решение: стандартное -
поставил в процедуру Form_Resize строчку:

Label1.Left = Form1.Width - Label1.Width

А вот теперь начинается детектив)))))
При запуске метка правильно устанавливается по правому краю. Но при малейшей попытке масштабировать форму мышкой - исчезает из поля зрения. Вообще.

Пошаговое исследование при помощи точек останова показало следующее.
При первом вызове Form_Resize, ширина метки- 1095 и она устанавливается в правильную позицию.
А при следующем вызове ширина той же метки показывается как 25.84071 (?!)
Я так понял, что это число теперь в единицах знакомест. Если и Label1.Left теперь считается тоже в знакоместах вместо твипов, то, разумеется, метка улетела далеко вправо за пределы и не видна.
Проверка подтвердила, что это действительно так и есть.

Вот и мой вопрос:
Каким образом могла самопроизвольно смениться система единиц измерения? В программе не используется обращение к ScaleMode. Нигде и ни разу вообще.

Можно конечно сделать костыль в виде запоминания первоначального числа, а потом вычислять координату с учетом изменения пропорции.
Но мне хочется понять - в чем тут дело: это на моем компе такие глюки, или это известный баг?
Или я чего-то делаю неправильно?

Автор: Naghual 29.3.2019, 13:26
Измени просто ScaleMode

Автор: Guest45 29.3.2019, 14:39
Цитата(Naghual @ 29.3.2019,  13:26)
Измени просто ScaleMode

Не, не помогло.

Или Вы имели ввиду изначально всё считать в знаках?
Так делать не следует, потому что у Виндовс есть настройка размера шрифта, и если она изменена - то в этом случае вся программа разъедется по швам(((( это я уже давно проходил, когда только осваивал и много с разными системами единиц игрался.
Твипы - форева. Хоть и не совсем удобные иногда, но зато программа будет нормально выглядеть на любом компе.

Автор: Naghual 29.3.2019, 18:09
Давно я на VB ничего не писал... Поставлю, попробую, отпишу.

Автор: Akina 29.3.2019, 19:59
Цитата(Guest45 @  29.3.2019,  14:15 Найти цитируемый пост)
Решение: стандартное -
поставил в процедуру Form_Resize строчку:

Label1.Left = Form1.Width - Label1.Width

А вот теперь начинается детектив

Решение воспроизвести удалось. Детектив - нет. Всё работает, как часы.
Проверял - накоплением данных (Label1.Left, Form1.Width, Label1.Width, Form1.Width - Label1.Width) в массив log(4,32000) as double со сбросом в файл и очисткой при достижении верхней границы массива, по кнопке, при закрытии формы.

Автор: Guest45 1.4.2019, 12:17
Какое накопление? Не понял.

Если у Вас метка ездит вместе с правым краем формы при движении его мышкой, - значит и правда детектив не воспроизвелся.

Автор: Akina 1.4.2019, 14:04
Цитата(Guest45 @  1.4.2019,  13:17 Найти цитируемый пост)
Какое накопление? Не понял.

Я не только смотрел (ездит), но и проверял значение переменных (пытаясь отловить факт "при следующем вызове ширина той же метки показывается как 25.84071 (?!)" в случае, если бы он возникал однократно и убивался последующей перерисовкой - безрезультатно).

Автор: Guest45 1.4.2019, 16:00
Если ездит - то и размер тоже в твипах значит. Если бы единицы сменились - метка вылетела бы за границы (что у меня и происходит).
Причем как на домашнем компе, так и на рабочем...

Вот фрагмент, выдернутый из настоящего проекта:

Автор: Oldshelf 1.4.2019, 16:49
Код

'Picture1.ScaleWidth = 120

Автор: Guest45 1.4.2019, 17:50
Угу, Вы правы. Метка находится над пикчурбоксом, а он - не просто объект, а контейнер, о чем я и забыл...
Поэтому метка имеет координату не на форме, а в системе координат пикчурбокса))))

Ну а дальше всё просто:

Label1.Left = 120 - Label1.Width

потому что система координат пикчурбокса сделана одного и того же заданного масштаба.

Спасибо!

Автор: Naghual 2.4.2019, 18:00
Код

Dim lExitResize As Boolean
Dim pTop As Integer


Private Sub Form_Initialize()
    pTop = 200
    Picture1.Left = 0
    Picture1.Top = pTop
End Sub

Private Sub Form_Resize()

    If Me.WindowState = 1 Then Exit Sub
    
    lExitResize = False
    
    If Me.Height < 1800 Then
      Me.Height = 1800
      lExitResize = True
    End If
    
    If Me.Width < 3000 Then
      Me.Width = 3000
      lExitResize = True
    End If
    
    If lExitResize Then Exit Sub
    
    
    Picture1.Width = Me.ScaleWidth
    Picture1.Height = Me.ScaleHeight - pTop
    Rem Picture1.ScaleWidth = 120
    Rem Picture1.ScaleHeight = -100
    Rem Picture1.ScaleTop = -Picture1.ScaleHeight
    Rem Picture1.Cls
    
    Label1.Left = (Picture1.Width - Label1.Width) / 2
    
End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)