Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

Передать в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
2-1170858958
Novichok_new
2007-02-07 17:35
2007.02.25
как можно реализовать идею "экономии дисков"


1-1167296388
ancot
2006-12-28 11:59
2007.02.25
Коллекции (TCollection)


2-1170572657
Observer
2007-02-04 10:04
2007.02.25
Asm and Delphi


4-1161024235
spok
2006-10-16 22:43
2007.02.25
Процесс от имени другого юзера - как? (почему не работает?)


6-1158345314
free)styler
2006-09-15 22:35
2007.02.25
Загрузка части страницы методом Post (idhttp)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский