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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2009, 13:04   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Как задать абсолютные координаты Shape-у на N-той странице?

Создаю новый документ.

Перехожу на следующую страницу:
CComVariant variant(Word::wdSectionBreakNextPag e);
m_AppWord->GetSelection()->InsertBreak(&variant);
m_AppWord->GetSelection()->GoToNext(Word::wdGoToPage);

Пробую добавить картину:
CComVariant link(false);
CComVariant save(true);
CComVariant leftPos(m_AppWord->CentimetersToPoints(5));
CComVariant topPos(m_AppWord->CentimetersToPoints(2));

Word::ShapePtr shapePtr = m_WordDocument->Shapes->AddPicture(L"c:\\untitled.bmp", &link, &save, &leftPos, &topPos);

картинка вставляется на 1ую страницу. Как добавить на вторую страницу изображение с заданными координатами?



Пробую через InlineImagePtr. После перехода на вторую страницу делаю:
Word::InlineShapePtr inlineShape = range->InlineShapes->AddPicture(L"c:\\untitled.bmp");
shapePtr = inlineShape->ConvertToShape();

shapePtr->WrapFormat->Type = Word::wdWrapBehind;

shapePtr->IncrementLeft(m_AppWord->CentimetersToPoints(-8));
shapePtr->IncrementLeft(m_AppWord->CentimetersToPoints(-5));

Но, если после перехода на вторую страницу мне нужно напечатать текст, а после добавить рисунок, я не знаю его координат. Есть ли метод для перемищения ShapePtr или InlineImagePtr в абсолютыне координаты? Существует способ узнать текущую позицию картинки?
Diego__ вне форума Ответить с цитированием
Старый 20.08.2009, 13:43   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Эксперименты

Вот набросал (и отладил)
Код:
Sub Макрос1()

    Selection.InlineShapes.AddPicture _
    FileName:="C:\Documents and Settings\Admin\Мои документы\Мои рисунки\www_druzi_ru_134_0_20060226_3629.jpg" _
        , LinkToFile:=False, SaveWithDocument:=True
        
    ActiveDocument.InlineShapes(1).ConvertToShape.Select 'преобразование InlineShape в Shape и выделение'
    
    ActiveDocument.Shapes(1).RelativeVerticalPosition = wdRelativeVerticalPositionPage
    
    MsgBox ActiveDocument.Shapes(1).RelativeVerticalPosition '(непонятно, в каких единицах)'
    
End Sub
Нажав (внутри отлаженной программы в редакторе VBA, открываемом по Alt-F11) после слов
Код:
ActiveDocument.Shapes(1)
точку, вы раскроете список свойств и методов. Там есть ширина, высота, "расстояние от" (DistanceFrom) для границ фигуры и прочее. Полчаса экспериментировал — идей пока больше нет.

Последний раз редактировалось Sasha_Smirnov; 20.08.2009 в 13:59.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 20.08.2009, 15:12   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Делал я такое, но тему эту удалили. А жаль. Была задача расположить на каждой странице белый прямоугольник в правом верхнем углу. Фокус в том, что нужно получать диапазон, соответствующий каждой странице.
Вот этот макрос
Код:
'Белый прямоугольник в правом верхнем углу страницы.
Sub InsertBlankFieldToTopRightConerOfEveryPage()
  Dim PagesCount%, i%, oRng As Range, iLeft#, DocUnit%
  'Определяем количество страниц в документе
  PagesCount = ActiveDocument.Content.ComputeStatistics(wdStatisticPages)
  Set oRng = ActiveDocument.Content
  'Переводим единицы измерения в точки
  DocUnit = Options.MeasurementUnit: Options.MeasurementUnit = wdPoints
  For i = 1 To PagesCount
    'Считаем положение правого верхнего угла страницы
    With oRng.Sections(1).PageSetup
      iLeft = .PageWidth - .LeftMargin - .RightMargin
    End With
    'Добавляем текстовое поле
    With ActiveDocument.Shapes.AddTextbox _
              (msoTextOrientationHorizontal, _
              iLeft - CentimetersToPoints(1), _
              0, _
              CentimetersToPoints(1), _
              CentimetersToPoints(0.5), _
              oRng)
      'Имя фигуры, чтобы можно было удалить, не трогая другие.
      .Name = "Blank" & i
      'Убираем у поля границы
      .Line.Visible = msoFalse
      'Ставим привязку к странице
      .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
      .RelativeVerticalPosition = wdRelativeVerticalPositionPage
      'Устанавливаем обтекание текстом
      With .WrapFormat
        .AllowOverlap = True
        .DistanceBottom = 0: .DistanceLeft = 3: .DistanceRight = 0: .DistanceTop = 0
        .Type = wdWrapSquare: .Side = wdWrapLeft
      End With
    End With
    'Переходим на следующую страницу
    Set oRng = oRng.GoToNext(1) 'wdGoToPage
  Next i
  'Восстанавливаем единицы измерения.
  Options.MeasurementUnit = DocUnit
End Sub
Надеюсь, что сможешь уловить принцип. Если нет, спрашивай

Добавлено позже
Нет, тема жива. Вот она
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 20.08.2009 в 17:00.
viter.alex вне форума Ответить с цитированием
Старый 21.08.2009, 11:20   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Разобрался. Спасибо за помощь
Diego__ вне форума Ответить с цитированием
Старый 06.07.2012, 23:38   #5
alexan0308
Пользователь
 
Регистрация: 22.08.2009
Сообщений: 46
По умолчанию А если в начале страницы таблица?

Если курсор будет в таблице, то есть если страница начинается с таблицы, то текстовый блок попадет не знам куда. Поэтому нужно сначала выйти из таблицы (код на дельфи)
Код:
    Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Name:='3');
while Selection.Information[wdWithInTable] do // а вдруг мы внутри таблицы? нужно выйти
begin
      Selection.MoveRight(Unit:=wdCharacter, Count:=12); // идем вправо
end;
Правда, если таблица на всю страницу, то страница пролетает. Как тут быть, не знаю, к счастью случай наверно редкий...
alexan0308 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как запустить несколько копий одной и той же программы? murcot Помощь студентам 4 20.02.2009 11:28
Трансформация относительных ссылок в абсолютные d-kiselev Microsoft Office Excel 2 18.12.2008 21:27
Auto LISP. Как программно задать координаты для команд типа SELECT Stilet Софт 0 10.07.2008 15:28
абсолютные адреса kano Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 01.07.2008 20:49
Как в dbgrideh получить имя поля той колонки, по заголовку которой Вы щелкнули???? zimmion БД в Delphi 4 04.03.2008 15:02