powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать обтекание картинки в ворде?
25 сообщений из 26, страница 1 из 2
Как сделать обтекание картинки в ворде?
    #40094309
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Delphi 7, word 2007

Вставляю картинку, никак не могу сделать обтекание текстом вокруг картинки
перепробовал всякие варианты какие в инете нашел, ничего не выходит, выдает ошибку

Method 'WrapFormat' not supported by automation object

Как сделать это обтекание? код ниже
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
procedure TForm1.Button1Click(Sender: TObject);
var WordApp: variant;
wdoc: variant;
range1 : OleVariant;
p1, p2, shape2, doc: OleVariant;
FindText: string;
begin

  WordApp:=CreateOleObject('Word.Application');
  wdoc:=WordApp.application.documents.add;
  WordApp.Visible:=true;
// установки страницы, пейзажная ориентация и поля (дробные числа не любит)
  wdoc.PageSetup.Orientation:=1; // пейзаж
  wdoc.PageSetup.TopMargin := 21;       // верхнее поле
  wdoc.PageSetup.LeftMargin := 21;      // левое поле
  wdoc.PageSetup.RightMargin := 21;     // правое поле
  wdoc.PageSetup.BottomMargin := 21;    // нижнее поле


  Imya:=PutKPapke+'\qwe_00.doc';
  wdoc.SaveAs2000(Imya);
   range1 := wdoc.Range;
    // #12 -- разрыв страницы
    range1.InsertAfter(#12#13#10+#13#10+'TEXT BEFORE PICTURE qrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll '+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+' pict_h' // метка для картинки
    +'TEXT AFTER PICTURE qrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll '+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10#13#10+' table_2 ');


    // находим метку, вместо которой вставим  гистограмму
    FindText := 'pict_h';
    WordApp.Selection.Find.Execute(FindText,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                     EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

   //FileName:=PutKPapke+'\chastotnost.bmp';
   shape2 := WordApp.Selection.InlineShapes.AddPicture(FileName:=PutKPapke+'\chastotnost.bmp', LinkToFile:=False, SaveWithDocument:=True);
   shape2.WrapFormat.Type := 0; //здесь ошибка, пробовал разные числа wdWrapSquare =0;

end;


по умолчанию вставляется в строку, т.е. идет строка, вставленная картинка, продолжение строки
надо сделать обтекание текстом пл контуру
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094319
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234,

google говорит
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094357
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter64
Anton_1234,

google говорит
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...

это 1С-ный код, отсюда
https://forum.mista.ru/topic.php?id=759385
попробовал сделать также
Код: pascal
1.
2.
   shape2 := WordApp.Selection.InlineShapes.AddPicture(FileName:=PutKPapke+'\chastotnost.bmp', LinkToFile:=False, SaveWithDocument:=True);
   Shape := Shape2.ConvertToShape();// пытаюсь сделать так же как в ссылке


ругается "Недопустимое число параметров"

по ссылке говорят про книжку
корняков программирование документов и приложений ms office в delphi
попробую почитать
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094362
Фотография peter64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234,
вот здесь немножко кода есть
Масштабирование рисунка в WORD 'e
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094379
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234
попробовал сделать также
Код: pascal
1.
   shape2 := WordApp.Selection.InlineShapes.AddPicture(FileName:=PutKPapke+'\chastotnost.bmp', LinkToFile:=False, SaveWithDocument:=True);

Где вы видели такие вызовы функций в Delphi, чтобы в качестве параметров стояли выражения с присваиванием? Погуглите справку по этой функции, если у вас есть импортированная библиотека типов WORD, то посмотрите там объявление метода. Подсказка: вместо необязательных параметров типа OleVariant можно передавать значение EmptyParam (из модуля System.Variants).

p.s. Ну в общем вот так попробуйте:
Код: pascal
1.
   shape2 := WordApp.Selection.InlineShapes.AddPicture(PutKPapke+'\chastotnost.bmp', False, True, EmptyParam);
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094382
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
peter64,

Спасибо, я знал, что я на форуме друзей

Вроде победил кое-как

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    range1.InsertAfter(#12#13#10+#13#10+'TEXT BEFORE PICTURE qrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll '+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+' pict_h' // метка для картинки
    +'TEXT AFTER PICTURE qrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll '+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    ' q[plp[kl  erkpokkld flkjlkjm lkjlkqrqe rwll  q[plp[kl  erkpokkld flkjlkjm lkjlk '+#13#10+
    #13#10+' table_2 ');
    // находим метку, вместо которой вставим  гистограмму
    FindText := 'pict_h';
    WordApp.Selection.Find.Execute(FindText,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                     EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

  WordApp.ActiveDocument.Shapes.AddPicture(
  Anchor:=WordApp.Selection.Range,
  FileName:=PutKPapke+'\chastotnost.bmp',
  LinkToFile:=False,
  SaveWithDocument:=True
  ).WrapFormat.Type:=0;
  // метка остается, удаляем ее
 WordApp.Selection.find.execute (FindText := 'pict_h', replacewith := '');



метку pict_h не стирает, еще раз поиск и замена на нулевую строку
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094389
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Anton_1234
попробовал сделать также
Код: pascal
1.
   shape2 := WordApp.Selection.InlineShapes.AddPicture(FileName:=PutKPapke+'\chastotnost.bmp', LinkToFile:=False, SaveWithDocument:=True);


Где вы видели такие вызовы функций в Delphi, чтобы в качестве параметров стояли выражения с присваиванием?
ты не путай синтаксис Delphi и OLE-вызовы.
всё правильно написано.
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094392
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62

p.s. Ну в общем вот так попробуйте:
Код: pascal
1.
   shape2 := WordApp.Selection.InlineShapes.AddPicture(PutKPapke+'\chastotnost.bmp', False, True, EmptyParam);

я и так, и так делал, и с присваиванием и без
с InlineShapes как-то не получилось у меня
(в предыдущем посте написал как сделал, может пригодится кому, горемыке такому же как я)
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094396
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

ну может, судя по тому, что у ТС работает. Но насколько я помню (как правило использовал не OLE-варианты, а интерфейсы), при OLE-вызовах правильно будет и так, как я написал. Это выглядит в программе Delphi не так странно.
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094539
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
при OLE-вызовах правильно будет и так, как я написал.
Если внезапно (а в офисе такое происходит постоянно) у метода не изменится число параметров
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094547
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
s62
при OLE-вызовах правильно будет и так, как я написал.
Если внезапно (а в офисе такое происходит постоянно) у метода не изменится число параметров
Насчёт вызовов через OLE-варианты не скажу, т.к., повторюсь, как правило, использовал интерфейсы. Но вот через интерфейсы, то, что написано было под Office 2000 (больше Excel, но Word тоже, последний раз может с год назад, с той же библиотекой типов от Office 2000), безошибочно работает и с новейшими версиями Офиса. Наверное потому, что интерфейсы же обычно не меняют, а добавляют новые. C OLE-вариантами не знаю, как у них.
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094554
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Но вот через интерфейсы, то, что написано было под Office 2000 (больше Excel, но Word тоже), безошибочно работает и с новейшими версиями Офиса. Наверное потому, что интерфейсы же обычно не меняют, а добавляют новые.
Не давно нужно было в Delphi работать с библиотекой написанной на C#. Стандартный метод - работа через COM. Так вот оказалось, что в разных версиях .net у импортируемых интерфейсов получается разное число методов. Пока не перешли на позднее связывание приходилось для каждой версии .net (сама библиотека при этом не менялась), писать разные обертки
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094558
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

MS в этом отношении по-моему более последователен, не ломает совместимость - в Офисе и в интерфейсах IE (ну, IE уже уходит в прошлое).
Тогда задам вопрос, он касается темы. Два варианта вызова, оба через позднее связывание, как у ТС,
Код: pascal
1.
2.
3.
4.
5.
6.
WordApp.ActiveDocument.Shapes.AddPicture(
  Anchor:=WordApp.Selection.Range,
  FileName:=PutKPapke+'\chastotnost.bmp',
  LinkToFile:=False,
  SaveWithDocument:=True
  )


и как я написал
Код: pascal
1.
shape2 := WordApp.Selection.InlineShapes.AddPicture(PutKPapke+'\chastotnost.bmp', False, True, EmptyParam);

,
принципиально отличаются (за счет указания имен параметров)? Т.е. если изменится кол-во параметров, то вариант ТС продолжит работать, а предложенный мной нет?
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094563
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
MS в этом отношении по-моему более последователен, не ломает совместимость
Вы читать умеете? Ломалась совместимость именно от версии .net. Или это не MS? Я сам находил в офисе методы, где изменялось число параметров в разных версиях офиса
s62
Т.е. если изменится кол-во параметров, то вариант ТС продолжит работать, а предложенный мной нет?
Именно так
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094567
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Вы читать умеете? Ломалась совместимость именно от версии .net. Или это не MS?
Читать умею, тут не написано, чья библиотека.
авторНе давно нужно было в Delphi работать с библиотекой написанной на C#. Стандартный метод - работа через COM. Так вот оказалось, что в разных версиях .net у импортируемых интерфейсов получается разное число методов.
На C# есть много разных библиотек разных авторов.

_VasiliskИменно так Спасибо, понятно.
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094630
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
тут не написано, чья библиотека.
Какая разница?
_Vasilisk_
приходилось для каждой версии .net (сама библиотека при этом не менялась),
Версия библиотеки была одна и та же, менялась только версия установленного .Net
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094638
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

да, вторую цитату я просмотрел, думал, что вы говорите о разных версиях сборок для разных версий .NET. (То есть, что в самой библиотеке количество методов менялось).
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094718
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Я сам находил в офисе методы, где изменялось число параметров в разных версиях офиса

Насколько я знаю, если меняется, то только в сторону добавления в конец. Т.е. все старые варианты вызовов продолжат работать
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094783
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Насколько я знаю, если меняется, то только в сторону добавления в конец. Т.е. все старые варианты вызовов продолжат работать
А stdcall уже отменили?
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094824
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, Мимопроходящий или кто знает. А где разбираются параметры, заданные в таком виде?
Код: pascal
1.
2.
3.
4.
5.
6.
WordApp.ActiveDocument.Shapes.AddPicture(
  Anchor:=WordApp.Selection.Range,
  FileName:=PutKPapke+'\chastotnost.bmp',
  LinkToFile:=False,
  SaveWithDocument:=True
  ).WrapFormat.Type:=0;


Если мы используем Ole-варианты, то компилятор Delphi всё это, насколько я знаю, преобразует в вызов IDispatch.GetIdsOfNames и затем IDispatch.Invoke. Разбор параметров делает компилятор Delphi или они в таком виде отправляются серверу автоматизации? Но первый параметр в функции (FileName), например, строка:
https://docs.microsoft.com/ru-ru/office/vba/api/word.shapes.addpicture
Непонятно, как может выражение FileName:=PutKPapke+'\chastotnost.bmp', передаваться в качестве первого параметра. Получается, что разбор переданных параметров и присваивание их, как нужно (в коде у ТС параметры передаются даже не в том порядке, как в документации), делает компилятор Delphi?
Или это как-то иначе происходит?
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094826
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

1. Вначале вызывается GetIdsOfNames и получается DispID для самого метода и каждого каждого параметра
2. Потом заполняется структура DISPPARAMS
Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct tagDISPPARAMS {
  VARIANTARG *rgvarg;
  DISPID     *rgdispidNamedArgs;
  UINT       cArgs;
  UINT       cNamedArgs;
} DISPPARAMS;

где передается набор значений в виде массива вариантов и массив DispID аргументов
3. Вызываем Invoke и передаем ему указатель на нашу структуру
4. Вызываемый код разгребает полученную структуру и определят, что с ней делать
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094827
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
делает компилятор Delphi?
Т.к. позднее связывание, то компилятор, скорее, может это "организовать", а делается это уже во время исполнения приложения. Точнее это наверное назвать "делается на стороне приложения-контроллера OLE?".

p.s. Не видел предыдущий ответ, когда писал.
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094829
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Наверное, когда вызывается GetIdsOfNames для параметров, как раз и происходит разбор параметров вида "Name:=Value".
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094830
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Наверное, когда вызывается GetIdsOfNames для параметров, как раз и происходит разбор параметров вида "Name=Value".
Нет. Делфи сама разбирает пары Name := Value и отдает в GetIdsOfNames массив имен параметров
...
Рейтинг: 0 / 0
Как сделать обтекание картинки в ворде?
    #40094831
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
я это и имел в виду.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать обтекание картинки в ворде?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]