Подгонка UserForm

Программирование на Visual Basic for Applications
MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Подгонка UserForm

Сообщение MYF » 22.12.2014 (Пн) 13:49

Криворукие программисты сделали закрытый проект на VBA.
Доступ к скриптам и формам закрыт. Но есть возможность вносить коррективы "налету", во время выполнения скриптов, добавленных позднее.
Выкручиваюсь как могу:
Код: Выделить всё
UserForm1.Caption = "Это моя форма"
UserForm1.Width = 150 'должно автоматически подгоняться под Caption

UserForm1.CommandButton1.Caption = "Закрыть"
UserForm1.CommandButton1.AutoSize = True
UserForm1.CommandButton1.Top = UserForm1.InsideHeight - UserForm1.CommandButton1.Height - 2 'Я идиот! Убейте меня, кто-нибудь!
UserForm1.CommandButton1.Left = UserForm1.InsideWidth - UserForm1.CommandButton1.Width - 2 'Я идиот! Убейте меня, кто-нибудь!
UserForm1.Show

Здесь UserForm1 (взята для примера) - компонент закрытого проекта.
Нужно:
  1. Автоматически подгонять ширину формы так, чтобы строка Caption отображалась полостью. При разных настройках системы (например в зависимости от выбранной темы оформления) ширина одной и той же строки получается разная. Ширина символов тоже разная: строка из 5 символов "ШШШШШ" почти в 3 раза длиннее, чем "lllll". Так что просто умножить количество символов на константу - не вариант.
  2. В последних строчках кнопка сдвигается точно в правый нижний угол. Смотрится это как-то некрасиво. По-этому делаю отступ "2". Но это число взято "от балды"... И в зависимости от настроек смотрится по-разному. Надо подставить что-то "более правильное". Например на одно деление сетки, по которой выравниваются элементы при ручной расстановке. Но где это число взять?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2014 (Пн) 14:45

Код: Выделить всё
UserForm1.CommandButton1.AutoSize = True
UserForm1.CommandButton1.Caption = "Закрыть"
UserForm1.Width = UserForm1.CommandButton1.Right + 8

Не? Возможно, последнее действие надо делать из хендлера ресайза кнопки.

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Re: Подгонка UserForm

Сообщение MYF » 23.12.2014 (Вт) 9:58

Qwertiy, то-ли вы недопоняли, то-ли я криво объяснил...
Задача с точностью до наоборот:

1. Первая и основная задача.
В титульной строке окна UserForm1 отображается некая строка. Её содержимое зависит от ситуации. И соответственно длинна разная. Изначально форма такая узкая, что в титуле вообще ничего вразумительного не помещается.
Нужно подогнать ширину формы так, чтобы эта строка полностью уместилась.
То есть рассчитать параметр UserForm1.Width в зависимости от реальной ширины (в пикселях) строки UserForm1.Caption. А ширина эта зависит в свою очередь от темы оформления и шрифта. Да ещё, в зависимости от шрифта, длинна символов может отличаться. Да ещё надо добавить место под кнопки закрытия формы и что там ещё...
Для примера, MsgBox изменяет свои размеры для того, чтобы сообщение уместилось в него.

2. Вторая задача чисто косметическая.
После того, как форма обрела свою новую ширину, элементы выравниваются внутри неё. Для примера кнопка переносится в правый-нижний угол. Но не до упора, а с некоторым отступом от нижнего и правого края. Так же другие элементы выравниваются по левому и верхнему краям.
Где взять величину этих отступов?
Она должна быть где-то в системе. Оптимальный вариант наверное - взять величину шага сетки, которая задаётся в редакторе VBA меню Tools - Options - General - Grid Units: Points - Width/Height. Обычно она равна 6 points. Но я нашёл её только в меню.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Подгонка UserForm

Сообщение alibek » 23.12.2014 (Вт) 10:46

http://msdn.microsoft.com/en-us/library/windows/desktop/ff728831(v=vs.85).aspx

Ширина сетки в интерфейсе среды разработки никак не связана с системными константами и размерами.
Есть руководство по дизайну приложений, в котором все подробно описано. Для отступов от края окна ЕМНИП рекомендуется использовать 60 или 90 твипов (4 или 6 пикселов при стандартном масштабе).
Lasciate ogni speranza, voi ch'entrate.

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Re: Подгонка UserForm

Сообщение MYF » 23.12.2014 (Вт) 13:05

alibek, спасибо. Интересная статья. Но это по второму пункту.

А что на счёт первой части? Про изменение ширины формы, чтобы надпись в титульной строке уместилась.

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

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Подгонка UserForm

Сообщение alex77755 » 06.01.2015 (Вт) 2:31

UserForm1.Width = 150 'должно автоматически подгоняться под Caption
После того, как форма обрела свою новую ширину, элементы выравниваются внутри неё.

Бред какой-то. Всё зависти от длины заголовка?!

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Re: Подгонка UserForm

Сообщение MYF » 09.01.2015 (Пт) 8:07

alex77755 писал(а):
UserForm1.Width = 150 'должно автоматически подгоняться под Caption.

Бред какой-то. Всё зависти от длины заголовка?!
Да-да. И "зависти" тут ни при чём.
Надо подогнать ширину формы так, чтобы надпись в титульной строке уместилась.
Задавать ширину ручную - и есть бред. Так как на разных компьютерах в зависимости от выбранных в теме шрифтов ширина надписи значительно отличается.
Вы никогда не замечали, как ловко MsgBox подстраивает свои размеры под выводимый текст? И не только ширину, но и высоту.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Подгонка UserForm

Сообщение pronto » 09.01.2015 (Пт) 11:18

GetThemeTextExtent
MSDN писал(а):Calculates the size and location of the specified text when rendered in the visual style font

Вычисляет размер и положение текста при его отображении шрифтом с заданным стилем оформления
O, sancta simplicitas!


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList