Текущий архив: 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.51 MB
Время: 0.04 c