Delphi word вставить картинку

Обновлено: 04.07.2024

rdama // думал. но на дипломе за это три шкуры спустят

вот если кому то понадобится

Логично было бы предположить, что рисунки документа будут представлять из себя коллекцию, аналогичную таблицам, и мы, обратившись к конкретной картинке, сможем менять ее свойства - обтекание, размер и т.д. Однако ничего подобного в WordDocument не обнаруживается. Потому возможности управления встраиваемыми в документ изображениями сильно ограничены.

Простейший метод вставить в документ рисунок - по упомянутым причинам он же и единственный - скопировать его в Word из буфера обмена. Предположим, рисунок у нас находится в компоненте DBImage. Сначала нужно загнать его в буфер обмена:
Clipboard.Assign(DBImage1.Picture);

Теперь для его вставки следует воспользоваться методом Paste объектов Range или Selection: WordApplication1.Selection.Paste или WordDocument1.Range(a,b).Paste. Оставить для рисунка достаточное количество пустых строк и попасть в нужное место - это уже наша забота. Если он попадет посреди текста, вид будет довольно противный - при такой вставке обтекание текстом рисунка происходит как-то странно. Можно приготовить для отчета шаблон, где заменяем рисунком какое-либо ключевое слово. О том, как найти в документе нужный текст, см. выше.

А теперь о несколько ином способе вставки рисунка, который устраняет проблемы с обтеканием и дает нам возможность перемещать его по документу, масштабировать и задавать отступы между рисунком и текстом. Способ, собственно, тот же - копируем из буфера обмена, но не прямо в документ, а в "рамку" - текстовую вставку. В ней может находиться не только текст, но и картинка, чем и воспользуемся.

"Рамки" образуют коллекцию Frames, нумеруются целым индексом, пробегающим значения от 1 до WordDocument1.Frames.Count. Добавим в документ рамку, изменим ее размер и вставим рисунок:
Clipboard.Assign(DBImage1.Picture);
vstart := 1;
vend := 2;
WordDocument1.Frames.Add(WordDocume nt1.Range(vstart, vend));
i := 1;
WordDocument1.Frames.Item(i).Height := DBImage1.Height;
WordDocument1.Frames.Item(i).Width := DBImage1.Width;
WordDocument1.Frames.Item(i).Select ;
WordApplication1.Selection.Paste;

Здесь для простоты предполагается, что размер DBImage равен размеру самой картинки, а также что до этого рамок у нас в документе не было. Обратить внимание следует на несколько моментов. Размер рамки надо задавать до того, как копировать в нее рисунок. Иначе она будет иметь размер по умолчанию, под который замасштабируется и наша картинка. При попытке изменить размер рамки задним числом размер картинки уже не изменится. Кроме того, параметр Range при добавлении рамки часто никакой роли не играет. Рамка изначально все равно появится в левом верхнем углу документа, а указанный кусок текста при этом не пострадает. Но это только в том случае, если он не выделен. Если в документе есть выделение, рамка появится вместо выделенного фрагмента. Таким образом можем ее вставить в нужное место взамен какого-то ключевого слова.

Вот мой код по созданию скрина, но как теперь сделать чтобы изображение из Image перенеслось в ворд?


________________________
Этот код сохраняет просто картинку, а как сделать, чтоб она сохранялась в ворд??
Image1.Picture.SaveTofile('D:\1.jpg'); __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Как сделать скриншот экрана (просто скрин полного экрана) и сохранить изображение в определённую папку?
Как сделать скриншот экрана (просто скрин полного экрана) и сохранить изображение в определённую.

Как сделать скрин области экрана?
Помогите :( Как сделать скрин экрана без пуска, панели управления, панели быстрого доступа.

Сделать, чтобы при наведении указателя мыши на изображение это изображение переворачивалось вверх ногами
Сделать, чтобы при наведении указателя мыши на изображение это изображение переворачивалось вверх.

Как сделать так, чтобы картинки на сайте (обложка журнала и скрин youtube) были автоматически на всю ширину экрана и мен
Как сделать так, чтобы картинки на сайте (обложка журнала и скрин youtube) были автоматически на.

Этот код сохраняет просто картинку, а как сделать, чтоб она сохранялась в ворд? Делайте. Вы можете хоть что-то сделать сами или пользоваться поиском? Читаем внимательно

Простейший метод вставить в документ рисунок - по упомянутым причинам он же и единственный - скопировать его в Word из буфера обмена. Предположим, рисунок у нас находится в компоненте DBImage. Сначала нужно загнать его в буфер обмена:
Clipboard.Assign(DBImage1.Picture);

Теперь для его вставки следует воспользоваться методом Paste объектов Range или Selection: WordApplication1.Selection.Paste или WordDocument1.Range(a,b).Paste. Оставить для рисунка достаточное количество пустых строк и попасть в нужное место - это уже наша забота. Если он попадет посреди текста, вид будет довольно противный - при такой вставке обтекание текстом рисунка происходит как-то странно. Можно приготовить для отчета шаблон, где заменяем рисунком какое-либо ключевое слово. О том, как найти в документе нужный текст, см. выше.

А теперь о несколько ином способе вставки рисунка, который устраняет проблемы с обтеканием и дает нам возможность перемещать его по документу, масштабировать и задавать отступы между рисунком и текстом. Способ, собственно, тот же - копируем из буфера обмена, но не прямо в документ, а в "рамку" - текстовую вставку. В ней может находиться не только текст, но и картинка, чем и воспользуемся.

"Рамки" образуют коллекцию Frames, нумеруются целым индексом, пробегающим значения от 1 до WordDocument1.Frames.Count. Добавим в документ рамку, изменим ее размер и вставим рисунок:
Clipboard.Assign(DBImage1.Picture);
vstart := 1;
vend := 2;
WordDocument1.Frames.Add(WordDocume nt1.Range(vstart, vend));
i := 1;
WordDocument1.Frames.Item(i).Height := DBImage1.Height;
WordDocument1.Frames.Item(i).Width := DBImage1.Width;
WordDocument1.Frames.Item(i).Select ;
WordApplication1.Selection.Paste;

Здесь для простоты предполагается, что размер DBImage равен размеру самой картинки, а также что до этого рамок у нас в документе не было. Обратить внимание следует на несколько моментов. Размер рамки надо задавать до того, как копировать в нее рисунок. Иначе она будет иметь размер по умолчанию, под который замасштабируется и наша картинка. При попытке изменить размер рамки задним числом размер картинки уже не изменится. Кроме того, параметр Range при добавлении рамки часто никакой роли не играет. Рамка изначально все равно появится в левом верхнем углу документа, а указанный кусок текста при этом не пострадает. Но это только в том случае, если он не выделен. Если в документе есть выделение, рамка появится вместо выделенного фрагмента. Таким образом можем ее вставить в нужное место взамен какого-то ключевого слова.

Используя доступ к Word.Application из приложений Delphi, можно вставлять в текст документа записи, рисунки и другие объекты. Сложные документы в формате Word обычно могут содержать не только таблицы или текст, но также записи, линии и фигуры, объекты WordArt, рисунки, графику и многое другое.

Все эти объекты можно разделить на две группы: те, которые являются внутренними объектами Word, и внешние объекты, создаваемые внешними по отношению к самому Word серверами OLE. Все объекты, рассмотренные в 1-4 части статьи, - это внутренние объекты.

Кто программирует в Visual Basic в среде Word и в Delphi, тот может дальше сам развивать тему "Суперфункций". Все просто. Объекты, коллекции и методы, которые работают в среде Word, переносятся почти без изменений в среду Delphi. Главное здесь - применить немного изобретательности и находчивости. Можно использовать палитру компонентов Servers, которая есть в Delphi, начиная с 5-й версии. Выбор между готовыми компонентами и работой "напрямую" с Word.Application зависит от профессионализма, сложности поставленных задач, отпущенного времени и главное - от вкусов и стиля программирования. Это индивидуально для каждого, кто занимается разработкой сложных и не очень сложных приложений на Delphi и других языках программирования. Я свой выбор остановил на работе с Word.Application, так как это дает больше гибкости и возможностей при решении сложных и нестандартных задач

Рассмотрим еще несколько необходимых внутренних и использование некоторых внешних объектов, их создание и управление из приложений на Delphi.

Одним из часто используемых объектов является Textbox. Для его создания используем коллекцию Shapes(формы) и ее метод AddTextbox. Объект коллекции Shapes имеет атрибут - имя, его можно считать, можно изменить и обращаться к объекту не только через индекс, но и через имя. В функцию создания объекта Textbox передаем в качестве аргументов координаты и размеры области, а возвращаем имя объекта. Она выглядит следующим образом.

Function CreateTextBox (Left,Top,Width,Height:real;

var name : string ):boolean;

const msoTextOrientationHorizontal= 1 ;

name :=W.ActiveDocument.Shapes.AddTextbox

(msoTextOrientationHorizontal,Left,Top,Width,Height). Name ;

Следующей естественной задачей является запись текста в TextBox. Используем доступ к созданному объекту (Shapes.Item) через индекс(число) или имя(строка). Текст можно записать в свойство Text объекта TextRange. Перед записью текста проверяем тип формы (Shape). Если форма имеет тип TextRange, тогда записываем текст. Смотрите реализацию в виде функции TextToTextBox на Delphi.

Function TextToTextBox (TextBox:variant;text: string):boolean;

const msoTextBox= 17 ;

if w.ActiveDocument.Shapes.Item(TextBox).Type = msoTextBox then

else TextToTextBox:=false;

Объект - форма (Shape) - может иметь тип не только как запись, он может содержать картинку, звук, линию и др. В зависимости от типа формы, процедура ее создания различна, но некоторые поля не зависят от типа. Одним из таких полей является имя формы, которое можно получить или изменить. Создадим две функции для определения имени (индекса) формы и для его изменения.

Function GetNameIndexShape (NameShape:variant): variant;

В качестве аргумента этой функции можно использовать как индекс, так и имя формы.

Function SetNewNameShape (NameShape:variant;

Здесь можно было бы рассмотреть реализацию функций перемещения, изменения размеров, а также определение положения и размеров формы в документе. Можете сделать это самостоятельно. В Visual Basic для этого используются следующие операторы:

ActiveDocument.Shapes.Item (NameShape).Left = Left

ActiveDocument.Shapes.Item (NameShape).Top = Top

ActiveDocument.Shapes.Item (NameShape).Width = Width

ActiveDocument.Shapes.Item (NameShape).Height = Height

Left = ActiveDocument.Shapes.Item (NameShape).Left

Top = ActiveDocument.Shapes.Item (NameShape).Top

Width = ActiveDocument.Shapes.Item (NameShape).Width

Height = ActiveDocument.Shapes. Item(NameShape).Height

В документах часто могут использоваться рисованные объекты, например, линии. Для их создания также используем коллекцию Shapes (формы) и ее метод AddTextbox. В функцию создания объекта Line передаем в качестве аргументов начальные и конечные координаты линии, а возвращаем имя объекта. Эта функция выглядит следующим образом:

Function CreateLine (BeginX,BeginY,EndX,EndY: real;

Для прорисовки сложной фигуры необходимо использовать метод AddPolyline коллекции Shapes. Аргументом этой функции должен быть массив точек (massiv). Реализация на Visual Basic имеет следующий вид:

Для того, чтобы вставить рисунок из внешнего файла, необходимо использовать метод AddPicture коллекции Shapes, а в качестве аргумента имя файла и координаты. Создадим такую функцию.

Function CreatePicture(FileName:string; Left ,Top: real;

W.ActiveDocument.Shapes.Item (name). Left := Left ;

Мы должны иметь возможность не только создать новый объект, но и удалить ранее созданный, например, рисунок или запись. Для этого используется метод Delete коллекции Shapes. Для использования этого в своих приложениях создадим функцию DeleteShape, в качестве аргумента которой будет имя или индекс объекта Shape.

Function DeleteShape (NameShape:variant): variant;

W.ActiveDocument.Shapes.Item (NameShape). Delete ;

Внешний объект в документе представляет собой Ole-объект, отображаемый внешней программой, которая является Ole-сервером по отношению к редактору Word. Такими объектами могут быть рисунки (BMP), созданные программой Paint или лист Excel. Внешний объект может отображаться в документе только тогда, когда установлена поддерживающая его программа. Для внедрения внешних объектов в документ используется метод AddOLEObject коллекции Shapes. Например, чтобы получить доступ к объекту в Visual Basic, используется следующий оператор:

Set obb = ActiveDocument.Shapes.AddOLEObject("MSGraph.Chart.8")

В Delphi он выглядит следующим образом:

Где W - Word.Application.

Но чтобы программировать Ole-объект, необходимо знать его поля и методы. Эта информация индивидуальна для каждого объекта и ее рассмотрение - отдельная тема.

На основе созданных нами функций создадим небольшую демонстрационную программу, которая будет создавать объект-запись и объект-линию, а затем удалит их из документа. Как всегда, используем ранее созданные функции, разместим на форме кнопку и процедуре обработки ее нажатия напишем следующий программный текст:

procedure TForm1.Button1Click (Sender: TObject);

if CreateWord then begin

Messagebox( 0 , 'Word запущен .' , '' , 0 );

Messagebox( 0 , 'Word видим .' , '' , 0 );

If AddDoc then begin

Messagebox( 0 , ' Документ создан .' , '' , 0 );

CreateTextBox( 1 , 1 , 100 , 50 ,BoxName_);

Messagebox( 0 , ' Создали форму - надпись .' , '' , 0 );

Messagebox( 0 ,pchar(GetNameIndexShape( 1 )) ,

' Считали имя формы ' , 0 );

BoxName_:=SetNewNameShape(BoxName_, ' Новое имя ' );

Messagebox( 0 ,pchar(GetNameIndexShape ( 1 )),

'Изменили имя формы и считываем его снова' , 0 );

TextToTextBox(BoxName_, 'Добавляем текст в TextBox' );

Messagebox( 0 , ' Рисуем линию ' , '' , 0 );

CreateLine( 1 , 15 , 300 , 200 ,LineName_);

Messagebox( 0 , ' Удаляем линию ' , '' , 0 );

Messagebox( 0 , ' Удаляем надпись ' , '' , 0 );

Messagebox( 0 , ' Текст сохранен ' , '' , 0 );

Messagebox( 0 , ' Текст закрыт ' , '' , 0 );

В своей статье я постарался показать основы создания документов Word на основе Word.Application и Delphi. На самом деле возможности здесь таковы, что позволяют использовать редактор Word в качестве генератора отчетов для создания документов любой сложности. Пожалуй, только используя редактор Excel, их можно превзойти. Продолжение будет посвящено программированию документов в Excel из приложений на Delphi.

Василий КОРНЯКОВ

Литература: Н. Елманова, С. Трепалин, А.Тенцер "Delphi 6 и технология COM" "Питер" 2002.

Читайте также: