|
Модераторы: Akina |
|
Guest45 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Задача:
разместить текстовую метку Label1 у правого края формы, с учетом изменения размеров формы мышкой. Единицы измерения в программе - твипы (по умолчанию). Решение: стандартное - поставил в процедуру Form_Resize строчку: Label1.Left = Form1.Width - Label1.Width А вот теперь начинается детектив))))) При запуске метка правильно устанавливается по правому краю. Но при малейшей попытке масштабировать форму мышкой - исчезает из поля зрения. Вообще. Пошаговое исследование при помощи точек останова показало следующее. При первом вызове Form_Resize, ширина метки- 1095 и она устанавливается в правильную позицию. А при следующем вызове ширина той же метки показывается как 25.84071 (?!) Я так понял, что это число теперь в единицах знакомест. Если и Label1.Left теперь считается тоже в знакоместах вместо твипов, то, разумеется, метка улетела далеко вправо за пределы и не видна. Проверка подтвердила, что это действительно так и есть. Вот и мой вопрос: Каким образом могла самопроизвольно смениться система единиц измерения? В программе не используется обращение к ScaleMode. Нигде и ни разу вообще. Можно конечно сделать костыль в виде запоминания первоначального числа, а потом вычислять координату с учетом изменения пропорции. Но мне хочется понять - в чем тут дело: это на моем компе такие глюки, или это известный баг? Или я чего-то делаю неправильно? Это сообщение отредактировал(а) Guest45 - 29.3.2019, 13:18 |
|||
|
||||
Naghual |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1893 Регистрация: 15.5.2004 Где: Украина, Днепр Репутация: 26 Всего: 49 |
Измени просто ScaleMode
-------------------- Я желаю всем Счастья! |
|||
|
||||
Guest45 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Не, не помогло. Или Вы имели ввиду изначально всё считать в знаках? Так делать не следует, потому что у Виндовс есть настройка размера шрифта, и если она изменена - то в этом случае вся программа разъедется по швам(((( это я уже давно проходил, когда только осваивал и много с разными системами единиц игрался. Твипы - форева. Хоть и не совсем удобные иногда, но зато программа будет нормально выглядеть на любом компе. |
|||
|
||||
Naghual |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1893 Регистрация: 15.5.2004 Где: Украина, Днепр Репутация: 26 Всего: 49 |
Давно я на VB ничего не писал... Поставлю, попробую, отпишу.
-------------------- Я желаю всем Счастья! |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 453 |
Решение воспроизвести удалось. Детектив - нет. Всё работает, как часы. Проверял - накоплением данных (Label1.Left, Form1.Width, Label1.Width, Form1.Width - Label1.Width) в массив log(4,32000) as double со сбросом в файл и очисткой при достижении верхней границы массива, по кнопке, при закрытии формы. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Какое накопление? Не понял.
Если у Вас метка ездит вместе с правым краем формы при движении его мышкой, - значит и правда детектив не воспроизвелся. |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 453 |
Я не только смотрел (ездит), но и проверял значение переменных (пытаясь отловить факт "при следующем вызове ширина той же метки показывается как 25.84071 (?!)" в случае, если бы он возникал однократно и убивался последующей перерисовкой - безрезультатно). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Если ездит - то и размер тоже в твипах значит. Если бы единицы сменились - метка вылетела бы за границы (что у меня и происходит).
Причем как на домашнем компе, так и на рабочем... Вот фрагмент, выдернутый из настоящего проекта: Присоединённый файл ( Кол-во скачиваний: 3 ) test.zip 1,59 Kb |
|||
|
||||
Oldshelf |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 159 Регистрация: 22.4.2018 Репутация: 2 Всего: 4 |
|
|||
|
||||
Guest45 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Угу, Вы правы. Метка находится над пикчурбоксом, а он - не просто объект, а контейнер, о чем я и забыл...
Поэтому метка имеет координату не на форме, а в системе координат пикчурбокса)))) Ну а дальше всё просто: Label1.Left = 120 - Label1.Width потому что система координат пикчурбокса сделана одного и того же заданного масштаба. Спасибо! |
|||
|
||||
Naghual |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1893 Регистрация: 15.5.2004 Где: Украина, Днепр Репутация: 26 Всего: 49 |
-------------------- Я желаю всем Счастья! |
|||
|
||||
Правила форума "VB6" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | VB6 | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |