Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Передать в MS Word   Найти похожие ветки 

 
Officeman ©   (2007-02-05 10:18) [0]

Доброе время суток!
Передаю контент 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);


 
Elen ©   (2007-02-05 10:44) [1]


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

Ну если конкретно по вопросу то например так :
Открыть какое нибудь модальное окно с прогрессбаром например и пока не конец не давать его закрыть, или :
(С приколом)

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  SetCursorPos(Screen.Width,0);
  ShowCursor(false);
end;


 
Elen ©   (2007-02-05 10:51) [2]


> Officeman

...Да еще может поможет если сделать ворд Visible :=false.


 
Officeman ©   (2007-02-05 13:11) [3]

оо.. попробую.. спасиба Elen


 
Officeman ©   (2007-02-05 13:33) [4]

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


 
umbra ©   (2007-02-05 13:41) [5]

2 Officeman ©

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


 
Elen ©   (2007-02-05 13:44) [6]


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

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


 
Officeman ©   (2007-02-05 15:37) [7]

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


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

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

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

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


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


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

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


 
umbra ©   (2007-02-05 16:28) [10]

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;


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


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

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


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

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


 
Officeman ©   (2007-02-06 12:21) [13]

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

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
б) как прописать шапку.  "н.п.,  Наименование, Цена, Гарантия"


 
Elen ©   (2007-02-06 12:24) [14]


> Officeman

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


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

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

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


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


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

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


 
umbra ©   (2007-02-06 13:45) [17]


> а) как задать ширину для 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;


 
Officeman ©   (2007-02-07 10:57) [18]


> 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;


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


 
YurikGL ©   (2007-02-07 11:38) [19]


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

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


 
Officeman ©   (2007-02-07 11:48) [20]

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


 
umbra ©   (2007-02-07 12:03) [21]

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

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

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

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


 
Officeman ©   (2007-02-07 13:30) [22]

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


 
Officeman ©   (2007-02-07 14:04) [23]

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;



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
1-1167637323
tio
2007-01-01 10:42
2007.02.25
Полигоны


15-1170574774
vasIzmax
2007-02-04 10:39
2007.02.25
Вопросики...


2-1170638798
Новичек
2007-02-05 04:26
2007.02.25
Динамический массив объектов.


15-1170654986
leonidus
2007-02-05 08:56
2007.02.25
Подскажите аглоритм проверики строки на примерную схожесть


2-1170941021
Vas
2007-02-08 16:23
2007.02.25
SQL