Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 21 май 2018, 11:21

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)



Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 14 фев 2015, 18:59 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Потребовался макрос для выделения шейпов в зависимости от размеров шрифта текста.
Вроде раз плюнуть. Но...
Вот такой код (для примера):
Код:
Sub SelectShapesByFontSize(intS)
ActiveWindow.DeselectAll
   For i = 1 To ActivePage.Shapes.Count
      If ActivePage.Shapes(i).Cells("Char.Size[1]").Result("pt") = intS Then
      ActiveWindow.Select ActivePage.Shapes(i), visSelect
      End If
   Next
End Sub


Пробовал только стандартные значения - 6, 8, 9, 10, 11, 12, 14, 16, 18, 24, 30, 36, 48, 60.
Все замечательно выделяется, пока переменная intS не получает значения 10 или 14. И ни в какую не выделяются нужные шейпы. Что бы это могло быть? Глюк программы или у меня в голове глюк?
Из надстройки на vb.net тоже самое!
Visio 2010 Professional, Windows 7 Ultimate.

Файлик для удобства:


Вложения:
TestFontSize.vsd [57.5 Кб]
Скачиваний: 44
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 14 фев 2015, 20:41 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
А там применяются защищенные темы или стили?

Пишу с планшета


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 14 фев 2015, 20:42 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1120
Очков репутации: 100582

Добавить очки репутацииУменьшить очки репутации
А так?
Код:
If CInt(ActivePage.Shapes(i).Cells("Char.Size[1]").Result("pt")) = CInt(intS) Then


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 14 фев 2015, 21:00 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Никаких тем и стилей нет. Тем более защищенных.
Tumanov писал(а):
А так?
Код:
If CInt(ActivePage.Shapes(i).Cells("Char.Size[1]").Result("pt")) = CInt(intS) Then

Ага! Это работает.

Из документации:
CInt Тип данных Integer (Visual Basic) от -2147483648 до 2147483647; дробная часть округляется.

Выходит что ActivePage.Shapes(i).Cells("Char.Size[1]").Result("pt") выдает дробное число?
Но Debug.print, например, этого не показывает. И кстати, я пробовал функцию Int(xxx). Со значением 14 не помогало.
Но черт, почему только 10 и 14?
И ActivePage.Shapes(i).Cells("Char.Size[1]").Resultstr("") выдает - 10,0000 пт. Без дробей.
???


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 14 фев 2015, 21:15 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1120
Очков репутации: 100582

Добавить очки репутацииУменьшить очки репутации
Да кто его знает, к каким типам VBA по умолчанию все приведет... Тип intS тоже ведь не определен.
Лучше уж для надежности указать ему поконкретнее.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 27 фев 2015, 12:28 
Не в сети
Ветеран

Зарегистрирован: 06 май 2013, 13:01
Сообщений: 746
Откуда: Россия
Использую Visio c: 2013
Очков репутации: 18

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Выходит что ActivePage.Shapes(i).Cells("Char.Size[1]").Result("pt") выдает дробное число?

Насколько я представляю, все численные значения в ShapeSheet'е представлены дробными числами.
Да и вообще, логично же, что это значение может быть дробным.

Tumanov писал(а):
Тип intS тоже ведь не определен.

А вот его бы не помешало явно указать.
Впрочем, это не поможет.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 27 фев 2015, 13:10 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Цитата:
А вот его бы не помешало явно указать.
Впрочем, это не поможет.

Я сделал intS as Single.
Код:
If CSng(ActivePage.Shapes(i).Cells("Char.Size[1]").Result("pt")) = CSng(intS) Then

Полет нормальный.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 27 фев 2015, 13:12 
Не в сети
Ветеран

Зарегистрирован: 06 май 2013, 13:01
Сообщений: 746
Откуда: Россия
Использую Visio c: 2013
Очков репутации: 18

Добавить очки репутацииУменьшить очки репутации
Эм.. Вообще-то, это принципиально плохая идея сравнивать дробные числа на равенство...


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re:
СообщениеДобавлено: 27 фев 2015, 13:22 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Qwertiy писал(а):
Эм.. Вообще-то, это принципиально плохая идея сравнивать дробные числа на равенство...

То есть? А как же их сравнивать? Просветите.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 27 фев 2015, 13:36 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Shishok писал(а):
Я сделал intS as Single.
я вчера с помощью макрорекордера при установке размера шрифта 12 получил такой код
Код:
Dim UndoScopeID2 As Long
    UndoScopeID2 = Application.BeginUndoScope("Установить размер шрифта 12 pt")
    Dim vsoCharacters1 As Visio.Characters
    Set vsoCharacters1 = Application.ActiveWindow.Page.Shapes.ItemFromID(1).Characters
    vsoCharacters1.Begin = 0
    vsoCharacters1.End = 6
    vsoCharacters1.CharProps(visCharacterSize) = 12#
Application.EndUndoScope UndoScopeID2, True
# в предпоследней строке меня немного удивила


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 27 фев 2015, 13:40 
Не в сети
Ветеран

Зарегистрирован: 06 май 2013, 13:01
Сообщений: 746
Откуда: Россия
Использую Visio c: 2013
Очков репутации: 18

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
А как же их сравнивать?

Проверять, что модуль разности не превосходит некоторой величины, которую стоит сделать константой (Eps).
Ну и аналогичным способом для сравнения на больше/меньше, если факт равенства играет какую-то роль там.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 27 фев 2015, 13:45 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Код:
я вчера с помощью макрорекордера при установке размера шрифта 12 получил такой код

Это видимо означает целое число. Потому что если не целое, то:
Код:
vsoCharacters1.CharProps(visCharacterSize) = 12.56


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 27 фев 2015, 13:50 
Не в сети
Ветеран

Зарегистрирован: 06 май 2013, 13:01
Сообщений: 746
Откуда: Россия
Использую Visio c: 2013
Очков репутации: 18

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Это видимо означает целое число.

Наоборот, дробное.
12 - Integer
12.0 - Double
12# - Double
12% - Integer
Погугли суффиксы типов VB6/VBA, если интересны остальные.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 27 фев 2015, 13:50 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 892
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 120

Добавить очки репутацииУменьшить очки репутации
# - означает формат Double
т.е. значение приводится сначала к формату дабл, потом записывается в ячейку.
правда не понятно для чего это делает рекордер в этом случае


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 27 фев 2015, 13:53 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Цитата:
Проверять, что модуль разности не превосходит некоторой величины, которую стоит сделать константой (Eps).
Ну и аналогичным способом для сравнения на больше/меньше, если факт равенства играет какую-то роль там.

Это в переводе на обычный язык - сравниваемые значения округлять до определенного количества цифр после запятой? Я правильно понял?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re:
СообщениеДобавлено: 27 фев 2015, 13:53 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Qwertiy писал(а):
Насколько я представляю, все численные значения в ShapeSheet'е представлены дробными числами.
может для этого?
добавление к целому числу например 12#, возможно интерпретируется переводом его к виду 12.0000


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 27 фев 2015, 13:58 
Не в сети
Ветеран

Зарегистрирован: 06 май 2013, 13:01
Сообщений: 746
Откуда: Россия
Использую Visio c: 2013
Очков репутации: 18

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Это в переводе на обычный язык - сравниваемые значения округлять до определенного количества цифр после запятой? Я правильно понял?
Неа. Хотя смысл примерно тот же.
Код:
Const Eps As Double = 1e-9
...
If Abs(A-B) < Eps Then ' Числа A и B равны


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re:
СообщениеДобавлено: 27 фев 2015, 14:07 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 491
Использую Visio c: 2008
Очков репутации: 99

Добавить очки репутацииУменьшить очки репутации
Qwertiy писал(а):
Shishok писал(а):
Это в переводе на обычный язык - сравниваемые значения округлять до определенного количества цифр после запятой? Я правильно понял?
Неа. Хотя смысл примерно тот же.
Код:
Const Eps As Double = 1e-9
...
If Abs(A-B) < Eps Then ' Числа A и B равны
Врубился! Спасибо за науку.
Ну не математик я. :cry:


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение шейпов по размеру шрифта. Проблема.
СообщениеДобавлено: 27 фев 2015, 14:14 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 892
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 120

Добавить очки репутацииУменьшить очки репутации
Qwertiy писал(а):
Неа. Хотя смысл примерно тот же.
Код:
Const Eps As Double = 1e-9
...
If Abs(A-B) < Eps Then ' Числа A и B равны
я в визио при сравнении координат на листе иногда использую округление до определенного знака после запятой. например:
Код:
Dim X As Double, Y As Double
...
X = Round(X, 5): Y = Round(Y, 5)
If X = Y Then ' Числа X и Y равны


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: 27 фев 2015, 14:18 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Surrogate писал(а):
добавление к целому числу например 12#, возможно интерпретируется переводом его к виду 12.0000
попробовал вбивать в окне vba-редактора значение переменной у которой все нули после запятой.
после нажатия Enter в конце строки нолики отбрасываются и добавляется решетка
Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]



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

Сейчас этот форум просматривают: Yandex [bot] и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB