Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2012, 13:47   #1
cw_o
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 92
По умолчанию Полотно - вставка и параметры

Подскажите пожалуйста способ, как вставить полотно в текущую позицию. Знаю команду Shapes.AddCanvas, но в ней надо указывать координаты.
И еще хотелось бы программно подгонять размер полотна под содержимое. В ворде это команда Подобрать размер из контекстного меню, не могу найти ее аналога в VBA.
cw_o вне форума Ответить с цитированием
Старый 26.10.2012, 21:32   #2
user4
 
Регистрация: 26.10.2012
Сообщений: 5
По умолчанию

Если первый вопрос все еще стоит, могу рассказать, как это делать (вставить полотно в текущую позицию)
user4 вне форума Ответить с цитированием
Старый 07.11.2012, 02:01   #3
Пименов Александр
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 222
По умолчанию

Объект Canvas это сам контейнер для группировки в нем других объектов типа Shape. Вы напишите подробнее что конкретно Вам нужно. По размерам и координатам тоже много нюансов. Целую главу книги написать можно. Если вы новичок и мучаетесь с макросом для какой-то конкретной задачи то лучше напишите дайте ТЗ на задачу макроса. А если для освоения VBA, тогда я смогу ответить на Ваши вопросы по мере свободного времени
Пименов Александр вне форума Ответить с цитированием
Старый 16.11.2012, 17:22   #4
user4
 
Регистрация: 26.10.2012
Сообщений: 5
По умолчанию

Вставить полотно в текущую позицию можно так:

Код:

Sub AddCanvas()
    Dim shp, txtbox As shape
    Dim n As Integer
    Dim shpW, shpH
    shpW = 69                                                       'ширина полотна
    shpH = 45                                                       'высота полотна
    n = Selection.Information(wdFirstCharacterColumnNumber) - 1     'текущая позиция
    Set shp = ActiveDocument.Shapes.AddCanvas(0, 0, shpW, shpH, _   'вставить полотно
                     Selection.Range)
    shp.Select                                                      'выбрать полотно
    Selection.ShapeRange.WrapFormat.Type = wdWrapInline             'выбрать обтекание текстом "в тексте"
    Set txtbox = shp.CanvasItems.addTextbox(msoTextOrientationHorizontal, _
                     0, 0, shpW, shpH)                              'вставить Text Box (с пустым полотном почему-то не работает)
    shp.Select                                               'выбрать полотно
    Selection.Cut                                            'Cut
    Selection.MoveRight Unit:=wdCharacter, count:=n          'перейти на позицию n
    Selection.PasteAndFormat (wdPasteDefault)                'Paste
    Selection.Font.Position = -20                            'опускаем полотно ниже базовой линии строки
    Selection.Collapse                                       'отменить выделение
    Selection.MoveRight Unit:=wdCharacter, count:=1
    Selection.Font.Position = 0                              'вернуться на базовую линию строки
    Selection.TypeText Text:=" "
    

End Sub
При этом теряется содержимое буфера обмена.

Если кто-нибудь может предложить более цивильное решение, буду признателен!

Последний раз редактировалось user4; 16.11.2012 в 23:44.
user4 вне форума Ответить с цитированием
Старый 23.11.2012, 13:21   #5
cw_o
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 92
По умолчанию

user4,
спасибо за идею. Но по-моему манипуляции с n лишние, т.к. Selection.Range в вызове ActiveDocument.Shapes.AddCanvas уже дает нужный результат.
Насчет опускания полотна относительно базовой линии - да, проблема, только с текстовым полем хочет работать.

У меня тут еще проблема возникла - нужно рисунок туда вставить программно, на полотно.
Код:
shp.CanvasItems.AddPicture(folder & name, False, True, 0, 0)
Если рисунок очень большой и не влазит, то вылетает с ошибкой. Если тупо указать размеры полотна в этой функции, то неправильно отмасштабируется рисунок. Отмасштабировать рисунок надо под размеры окна (пускай полотна), и чтоб пропорции рисунка сохранились. А если рисунок маленький, то не масштабировать.

Последний раз редактировалось cw_o; 23.11.2012 в 13:24.
cw_o вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать программу через параметры-значений и параметры-ссылок bufalo C# (си шарп) 3 14.12.2011 17:10
ПАРАМЕТРЫ-КОНСТАНТЫ, НЕТИПИЗИРОВАННЫЕ ПАРАМЕТРЫ ПОДПРОГРАММ, МАССИВЫ И СТРОКИ ОТКРЫТОГО ТИПА Юрий62 Помощь студентам 1 04.12.2011 14:09
Параметры запуcка. как обрабатывать параметры вида -somecmd "?" Человек_Борща Общие вопросы Delphi 1 15.01.2011 15:48
ПАРАМЕТРЫ-КОНСТАНТЫ, НЕТИПИЗИРОВАННЫЕ ПАРАМЕТРЫ ПОДПРОГРАММ, МАССИВЫ И СТРОКИ ОТКРЫТОГО ТИПА Kira09 Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2010 17:28
Не могу добавить картинку в полотно viter.alex Microsoft Office Word 1 26.01.2009 19:00