Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передать в MS Word [D6, D7, 2000, XP]


Страницы:   1 2

Officeman ©   (2007-02-05 10:18:00) 

Доброе время суток!
Передаю контент ListView (LVprice) в MS Word.
Используя для target вставки 'Закладки'
Происходит:
1) открытие Word
2) переход к нужной 'Закладки'
3) посторочная передача данных
4) остановка передачи.

и если во время передачи данных [3], нажать несколько раз мышью.
но передача прерывается и таблица остаётся незаполненной.
либо заполняется наперекосяк.

вопрос: как блокировать мышь до завершения передачи данных.
или испольщовать другой способ. например передавать а потом показывать Word



Var
   S,Info : string;
   i,Nn   : integer;
   Sum    : double;
   Tv, Ss : PChar;
    MsWord: Variant;
begin

try
MsWord := GetActiveOleObject('Word.Application');
except
 try
 MsWord := CreateOleObject('Word.Application');
 MsWord.Visible := True;
  except
   ShowMessage('Не могу запустить Microsoft Word');
   Exit;
  end;
 end;

S:=AppDir+'data\newlist.doc'; //имя открываемого документа
DDE1.DdeTopic:=MsWord;
DDE1.OpenLink; //устанавливаем связь
Tv:=StrAlloc(20000); Ss:=StrAlloc(300); //выделяем память

//даем команду открыть документ и установить курсор
//в начало документа
StrPCopy(Tv, '[FileOpen "'+S+'"][StartOfDocument]');
S:='1'; //номер документа

 { ШАПКА }
  Info:=Form7.addinfo.Text;
  StrCat(Tv, StrPCopy(SS, '[EditBookmark.Name = "Info", .Goto][Insert "'+Info+'"]'+'[EditBookmark .Name = "Table", .Goto]'));
if not DDE1.ExecuteMacro(Tv, false) then
  begin
   MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0);
   StrDispose(Tv); StrDispose(Ss);
   exit;
  end;

 {ТАБЛИЦА}
 { Заполняем таблицу }
Sum:=0; Nn:=0;
for i:=0 to LVprice.Items.Count-1 do
begin
 inc(Nn);
 StrPCopy(Tv, '[Insert "'+inttostr(Nn)+'"][NextCell][Insert "'+LVprice.Items[i].subitems[1]+'"]'+
  '[NextCell][Insert "'+LVprice.Items[i].subitems[2]+'"][NextCell][Insert "'+LVprice.Items[i].subitems[3]+'"][NextCell]');

 if not DDE1.ExecuteMacro(Tv, false)
  then begin
   MessageDlg('Ошибка связи с Microsoft Word.', mtError, [mbOk], 0);
   exit;
  end;
end;

StrDispose(Tv); StrDispose(Ss);


Officeman   (2007-02-07 14:04:00) [1]

VBA почитал. получилось! ура! ;)


mydoc := MSWord.Documents.Open(FileName:=AppDir+'Data\mydoc.doc');

//таблица

myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='table');
MyTable    := mydoc.Tables.Add(myBookmark, LVprice.Items.Count+1, 4);

MyTable.Cell(1, 1).Width :=40;
MyTable.Cell(1, 2).Width :=300;
MyTable.Cell(1, 3).Width :=100;
MyTable.Cell(1, 4).Width :=60;


MyTable.Cell(1, 1).Range.InsertAfter('н.п.');
MyTable.Cell(1, 2).Range.InsertAfter('Наименование');
MyTable.Cell(1, 3).Range.InsertAfter('Цена');
MyTable.Cell(1, 4).Range.InsertAfter('Гарантия');

for i := 2 to LVprice.Items.Count+1 do
begin

MyTable.Cell(i, 1).Width :=40;
MyTable.Cell(i, 2).Width :=300;
MyTable.Cell(i, 3).Width :=100;
MyTable.Cell(i, 4).Width :=60;


  myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i-1));

  for j := 1 to 3 do
    myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i-2].subitems[j]);
  end;
myTable    := Unassigned;
myBookmark := Unassigned;
mydoc      := Unassigned;
MSword     := Unassigned;
end;


Officeman   (2007-02-07 13:30:00) [2]

да. таблица формируется нормально. только все столбцы одинаковой ширины.


umbra   (2007-02-07 12:03:00) [3]

а у Вас хоть таблица то появляется? Вот эта строка кода

> myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='table');

предусматривает переход к закладке с именем table. Есть в Вашем документе такая закладка? Если нет - ничего не получится.

P.S. И неплохо бы Вам все же попытаться почитать справку по VBA для Word (идет в комплекте с оффисом)


Officeman   (2007-02-07 11:48:00) [4]

это я понимаю, но немогу найти ошибку. поэтому привожу кусок кода.
пожалуста кому знакомо. отпишите


YurikGL   (2007-02-07 11:38:00) [5]


> ошибка "запрашиваемый номер семейства не существует"

Обращаешься к несущесвующей ячейке или таблице


Officeman   (2007-02-07 10:57:00) [6]


> umbra ©   (06.02.07 13:45) [17]
> myTable.Columns[1].Width := 20;


Этот метод пробовал, не получется.
Нужно прописывать до таблицы или после?


//таблица
myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='table');
MyTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count+1, 4);

MyTable.Columns[1].Width := 20;
MyTable.Columns[2].Width := 120;
MyTable.Columns[3].Width := 40;
MyTable.Columns[4].Width := 20;


MyTable.Cell(1, 1).Range.InsertAfter('н.п.');
MyTable.Cell(1, 2).Range.InsertAfter('Наименование');
MyTable.Cell(1, 3).Range.InsertAfter('Цена');
MyTable.Cell(1, 4).Range.InsertAfter('Гарантия');

for i := 2 to LVprice.Items.Count+1 do
begin
  myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i-1));
  for j := 1 to 3 do
    myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i-2].subitems[j]);
  end;


ошибка "запрашиваемый номер семейства не существует"


umbra   (2007-02-06 13:45:00) [7]


> а) как задать ширину для 4 столбцов: 20, 120, 40, 20

myTable.Columns[1].Width := 20;

и т.д.


> б) как прописать шапку.  "н.п.,  Наименование, Цена, Гарантия"
>


myTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count + 1,  4);
myTables.Cells(1, 1).Range.InsertAfter('н.п.');
// и т.д.
for i := 0 to LVprice.Items.Count - 1 do
begin
 myTable.Cell(i + 2, 1).Range.InsertAfter(IntToStr(i + 2));
 for j := 1 to 3 do
   myTable.Cell(i + 2, j + 1).Range.InsertAfter(LVprice.Items[i].subitems[j]);
end;


Neket   (2007-02-06 12:39:00) [8]

А название
так
XLApp.Workbooks[1].WorkSheets[1].Name:=name;


Neket   (2007-02-06 12:33:00) [9]

Работая с Exele-м я задава ширину стобцов так:

Colum:=XLApp.Workbooks[1].WorkSheets[RealTimZapr].Columns;
Colum.Columns[1].ColumnWidth:=20;
Colum.Columns[2].ColumnWidth:=20;
..... и.д.


Может поможет :-(


Elen   (2007-02-06 12:24:00) [10]


> Officeman

Ну чтоб ответить на вот это тебе придется изучать состав Ворда например через справку по VBA в макросах ворда или в книгах. Удачи! :)


Officeman   (2007-02-06 12:21:00) [11]

по тексту модуля, в цикле добавляем строки:

for i := 0 to LVprice.Items.Count - 1 do
begin
  myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i));
  for j := 1 to 3 do
    myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i].subitems[j]);
end;


вопрос:
а) как задать ширину для 4 столбцов: 20, 120, 40, 20
б) как прописать шапку.  "н.п.,  Наименование, Цена, Гарантия"


Officeman   (2007-02-06 07:22:00) [12]

спасибо! попробую так.


Neket   (2007-02-05 16:32:00) [13]


> umbra ©   (05.02.07 16:28) [10]

Я впринципе это и имел ввиду только необходимо учитывть в целях избежания неприятностей какой модуль подключать
Word97, Word2000 или WordXP.


umbra   (2007-02-05 16:28:00) [14]

uses ..., Word97, ...;
{...............................}
Var
  i, j   : integer;
  MsWord, myDoc, myBookmark, myTable: Variant;

begin

try
 MsWord := GetActiveOleObject('Word.Application');
except
try
MsWord := CreateOleObject('Word.Application');
MsWord.Visible := True;
 except
  ShowMessage('Не могу запустить Microsoft Word');
  Exit;
 end;
end;
mydoc := MSWord.Documents.Open(FileName:='c:\mydoc.doc');
myBookmark := mydoc.GoTo(What:=wdGoToBookmark, Name:='закладка');
myTable := mydoc.Tables.Add(myBookmark, LVprice.Items.Count, 4);
for i := 0 to LVprice.Items.Count - 1 do
 begin
   myTable.Cell(i, 1).Range.InsertAfter(IntToStr(i));
   for j := 1 to 3 do
     myTable.Cell(i, j + 1).Range.InsertAfter(LVprice.Items[i].subitems[j]);
 end;
mydoc.Save;
myTable := Unassigned;
myBookmark := Unassigned;
mydoc := Unassigned;
MSword := Unassigned;
end;


Elen   (2007-02-05 15:54:00) [15]


> а как без DDE сделать на моём примере ?

На твоем убрать DDE и применить способности Ворда типа WordDocument1.Range.InsertBefore('текст')
Ну это ты можеш увидеть расставив на форме из servers TWordApplication и TWordDocument. они подскажут что можно вызывать из твоей  MsWord.


Neket   (2007-02-05 15:53:00) [16]

А если использовать WRDApp:= CreateOleObject('Word.Application');

и подключаеш Word2000

Или посмотри пример здесь
C:\Program Files\Borland\Delphi7\Demos\ActiveX\OleAuto\Word8


Officeman   (2007-02-05 15:37:00) [17]

а фиг его знает). а как без DDE сделать на моём примере ?


Elen   (2007-02-05 13:44:00) [18]


> неа) не помогает ни одна из предложенных таблеток.

В таком случае передавай без DDE


umbra   (2007-02-05 13:41:00) [19]

2 Officeman ©

а зачем Вам ДДЕ?


Officeman   (2007-02-05 13:33:00) [20]

неа) не помогает ни одна из предложенных таблеток.
так как при добавлении данных в Word, активное окно Word-а.
и после нескольких кликов. происхолдит сбой передачи данных.
;(


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо