Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

WinWord через DDE

Delphi , Технологии , DDE

WinWord через DDE

Автор: GPM

Вы много смотрите нового русского кино, если знаете, что:
- Любая информация (особенно данные из баз данных) на экране компьютера представлена в виде Word`овского файла - других программ режиссеры, видимо, просто не знают.

Кто-нибудь пробовал использовать WinWord в качестве DDE-сервера? Поделитесь результатами, если они, конечно, успешны.

Опыт 1

Пара других пользователей также задавала на этой неделе аналогичный вопрос, но у меня не было доступа к машине, где установлена Delphi. К несчастью я затер их адреса, но надеюсь они увидят это сообщение. Нижеприведенный код является "экстрактом" моей технологии, которую я успешно применил для создания DDEPokes и DDEExecutes с WinWord в качестве сервера. Обратите внимание на то, что я использовал методы DDE, требующие PChar вместо строк, поскольку строки имеют дополнительные символы и при DDE-преобразованиях WinWord'у плохеет.


function TfrmLetter.CreateLetter: Boolean;
var
  szCommand: array[0..2048] of char;
  sCommand: string;
  BmkNames: array[0..3] of string;
  idx: ShortInt;
  DDEOK: Boolean;
  Buffer, ParMark: PChar;
  BufSize: Integer;
  hWord: hWnd;
begin
  CreateLetter := False;
  DDEOK := True; {Флаг проверки результатов DDE-операций}
  DDEClient.SetLink('winword', WordDoc);
    {WordDoc содержит имя документа winword, необходимого для связи}
  {DDEClient - элемент управления DDE client}
  if DDEClient.OpenLink = False then
    Exit;

  hWord := FindWindow('OpusApp', nil);
  LockWindowUpdate(hWord); {Блокируем обновление экрана winword}

  {Убедитесь, что нужный документ является активным окном Word}
  sCommand := '[If FileName$() <> "' + WordDoc + '" Then]';
  sCommand := sCommand + '[While (idx < CountWindows()) and (FileName$() <> "';
  sCommand := sCommand + WordDoc + '")][NextWindow][idx = idx + 1]';
  sCommand := sCommand + '[Wend][Activate WindowName$()][End If]';
  StrPLCopy(szCommand, sCommand, SizeOf(szCommand) - 1);
  DDEOK := DDEOK and DDEClient.ExecuteMacro(szCommand, False);

  {Сбрасываем баннер}
  sCommand := '[EditGoto "Banner"]';
  if GetWinwordVersion = 2 then
    {GetWinword - простая функция пользователя, использующая GetModuleHandle
    для определения номера версии запущенного Word: Word 2 или Word 6}
    sCommand := sCommand + '[EditGlossary "Banner"]'
  else if GetWinwordVersion = 6 then
    sCommand := sCommand + '[EditAutoText "Banner"]';
  sCommand := sCommand + '[EditGoto "Date"][UpdateFields][LockFields]';
  StrPLCopy(szCommand, sCommand, SizeOf(szCommand) - 1);
  DDEOK := DDEOK and DDEClient.ExecuteMacro(szCommand, False);
  Application.ProcessMessages;

  {Вставляем Имя отправителя, Прямой номер абонента и пр.}
  BmkNames[0] := 'DirectDialNumber';
  BmkNames[1] := 'EMailAddress';
  BmkNames[2] := 'AuthorName';
  BmkNames[3] := 'Personal';
  for idx := 0 to 3 do
    if CheckInclude[idx].Checked = True then
    begin
      BufSize := TextInclude[idx].GetTextLen;
      Inc(BufSize);
      GetMem(Buffer, BufSize);
      TextInclude[idx].GetTextBuf(Buffer, BufSize);
      DDEOK := DDEOK and DDEClient.PokeData(BmkNames[idx], Buffer);
      FreeMem(Buffer, BufSize);
    end
    else
      DDEOK := DDEOK and DDEClient.PokeData(BmkNames[idx] + '2', '');

и так далее.

Опыт 2

Автор: Jean Yves

Вот еще очень простой пример DDE-связи с WinWord 6. Это работает.

В Word вы должны иметь заранее созданный файл (в нашем примере DDETEST.DOC) и закладку с именем "Bm1".


{------------------- полный исходный код --------------------------}
unit Unit1;

interface

uses

  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, DdeMan;

type

  TForm1 = class(TForm)
    DdeConv: TDdeClientConv;
    Word: TButton;
    procedure WordClick(Sender: TObject);
  private
    { Private-declarations }
  public
    { Public-declarations }
  end;

  {  Свойства DdeConv:       }
  {  ConnectMode : ddeManual }
  {  DdeService : [None]     }
  {  DdeTopic    : [None]    }
  {  FormatChars : False     }
  {  Name        : DdeConv   }

var

  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WordClick(Sender: TObject);
begin

  if DdeConv.SetLink('WINWORD', 'D:\WINWORD\DDETEST') and
    DdeConv.OpenLink then
  begin
    ShowMessage('Установлена связь с WinWord !')
      { убедимся в наличии соединения }
    DdeConv.PokeData('Bm1', 'Данные из Delphi !')
      { вставляем 'Данные из Delphi' в документ word }
    DdeConv.CloseLink;
  end;
end;

end.
{------------------- конец исходного кода --------------------}

Но только сделав это хотя бы раз своими руками, вы сможете разобраться в этой технологии!

Похвала авторам за то, что они делят свои опыт и код-снippets.

Теперь давайте разберемся в функциональности предоставленного кода.

Код 1: Этот фрагмент из функции TfrmLetter.CreateLetter использует DDE (динамическое взаимодействие данных) для управления Microsoft Word. Код устанавливает связь между Delphi и WinWord, а затем выполняет различные команды в процессоре текста.

Интересные части:

  • DDEClient.ExecuteMacro(szCommand, False);: эта строка запускает макро в WinWord с помощью команды, хранящейся в szCommand. Второй параметр False указывает, что операция не должна ожидать ответа.
  • DDEClient.PokeData(BmkNames[idx], Buffer);: эта строка отправляет данные в WinWord с помощью DDE. BmkNames[idx] - имя закладки, а Buffer содержит фактические данные.

Код 2: Это простой пример соединения DDE с WinWord 6. Он создает клиент-серверное соединение DDE с процессором текста и выполняет команду для вставки данных в документ.

Ключевые строки:

  • DdeConv.SetLink('WINWORD', 'D:\WINWORD\DDETEST'): это устанавливает связь между Delphi и WinWord.
  • DdeConv.PokeData('Bm1', 'Данные из Delphi !'): это отправляет данные в WinWord с помощью DDE, вставляя их в закладку с именем "Bm1".

Советы и предложения:

  • Будьте осторожны при работе с DDE, так как она может быть склонна к ошибкам и конфликтам.
  • Убедитесь, что используемая версия Word совместима с вашим кодом (например, Код 2 использует Word 6).
  • Рассмотрите использование более robust систем ошибок и инструментов отладки для устранения любых возникших проблем.

В заключение, эти код-снippets демонстрируют использование DDE для управления Microsoft Word из приложения Delphi. Хотя они могут требовать некоторых настройок и тестирования для корректной работы, они предоставляют хороший старт для исследования этой технологии.

В статье описывается использование WinWord как DDE-сервера для взаимодействия с Delphi-приложением. Авторы статьи предлагают свой код на языке Pascal, который позволяет создавать документ Word и вставлять в него данные из приложения Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DDE ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:18:23/0.0061249732971191/1