Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать обтекание картинки в ворде? / 25 сообщений из 26, страница 1 из 2
01.09.2021, 11:46
    #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
01.09.2021, 11:56
    #40094319
peter64
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
Anton_1234,

google говорит
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
...
Рейтинг: 0 / 0
01.09.2021, 13:03
    #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
01.09.2021, 13:25
    #40094362
peter64
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
Anton_1234,
вот здесь немножко кода есть
Масштабирование рисунка в WORD 'e
...
Рейтинг: 0 / 0
01.09.2021, 14:01
    #40094379
s62
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
01.09.2021, 14:07
    #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
01.09.2021, 14:13
    #40094389
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
s62
Anton_1234
попробовал сделать также
Код: pascal
1.
   shape2 := WordApp.Selection.InlineShapes.AddPicture(FileName:=PutKPapke+'\chastotnost.bmp', LinkToFile:=False, SaveWithDocument:=True);


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

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

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

ну может, судя по тому, что у ТС работает. Но насколько я помню (как правило использовал не OLE-варианты, а интерфейсы), при OLE-вызовах правильно будет и так, как я написал. Это выглядит в программе Delphi не так странно.
...
Рейтинг: 0 / 0
01.09.2021, 18:26
    #40094539
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
s62
при OLE-вызовах правильно будет и так, как я написал.
Если внезапно (а в офисе такое происходит постоянно) у метода не изменится число параметров
...
Рейтинг: 0 / 0
01.09.2021, 18:40
    #40094547
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
_Vasilisk_
s62
при OLE-вызовах правильно будет и так, как я написал.
Если внезапно (а в офисе такое происходит постоянно) у метода не изменится число параметров
Насчёт вызовов через OLE-варианты не скажу, т.к., повторюсь, как правило, использовал интерфейсы. Но вот через интерфейсы, то, что написано было под Office 2000 (больше Excel, но Word тоже, последний раз может с год назад, с той же библиотекой типов от Office 2000), безошибочно работает и с новейшими версиями Офиса. Наверное потому, что интерфейсы же обычно не меняют, а добавляют новые. C OLE-вариантами не знаю, как у них.
...
Рейтинг: 0 / 0
01.09.2021, 18:47
    #40094554
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
s62
Но вот через интерфейсы, то, что написано было под Office 2000 (больше Excel, но Word тоже), безошибочно работает и с новейшими версиями Офиса. Наверное потому, что интерфейсы же обычно не меняют, а добавляют новые.
Не давно нужно было в Delphi работать с библиотекой написанной на C#. Стандартный метод - работа через COM. Так вот оказалось, что в разных версиях .net у импортируемых интерфейсов получается разное число методов. Пока не перешли на позднее связывание приходилось для каждой версии .net (сама библиотека при этом не менялась), писать разные обертки
...
Рейтинг: 0 / 0
01.09.2021, 18:59
    #40094558
s62
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
01.09.2021, 19:09
    #40094563
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
s62
MS в этом отношении по-моему более последователен, не ломает совместимость
Вы читать умеете? Ломалась совместимость именно от версии .net. Или это не MS? Я сам находил в офисе методы, где изменялось число параметров в разных версиях офиса
s62
Т.е. если изменится кол-во параметров, то вариант ТС продолжит работать, а предложенный мной нет?
Именно так
...
Рейтинг: 0 / 0
01.09.2021, 19:15
    #40094567
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
_Vasilisk_
Вы читать умеете? Ломалась совместимость именно от версии .net. Или это не MS?
Читать умею, тут не написано, чья библиотека.
авторНе давно нужно было в Delphi работать с библиотекой написанной на C#. Стандартный метод - работа через COM. Так вот оказалось, что в разных версиях .net у импортируемых интерфейсов получается разное число методов.
На C# есть много разных библиотек разных авторов.

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

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

Насколько я знаю, если меняется, то только в сторону добавления в конец. Т.е. все старые варианты вызовов продолжат работать
...
Рейтинг: 0 / 0
02.09.2021, 12:37
    #40094783
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
Fr0sT-Brutal
Насколько я знаю, если меняется, то только в сторону добавления в конец. Т.е. все старые варианты вызовов продолжат работать
А stdcall уже отменили?
...
Рейтинг: 0 / 0
02.09.2021, 14:15
    #40094824
s62
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
02.09.2021, 14:29
    #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
02.09.2021, 14:30
    #40094827
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать обтекание картинки в ворде?
s62
делает компилятор Delphi?
Т.к. позднее связывание, то компилятор, скорее, может это "организовать", а делается это уже во время исполнения приложения. Точнее это наверное назвать "делается на стороне приложения-контроллера OLE?".

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

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


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