Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Как правильно работать с шаблоном Word?


Автор: Timurrr 23.2.2009, 10:40
У меня имеется процедура добавления информации с бд в шаблон word

Код

var
 DocName, FN, gp, Psw, PswTmp, Revert, WritePsw, WritePswTmp, Fmt, Index: OleVariant;
 _Prod, Prod,ConfConv,ReadOnly,AddToRecFiles,replace, FalseParam: OleVariant;
 TrueParam: OleVariant;
 Wrap     : OleVariant;
 i1       : OleVariant; // Temporaly Var <-|
 SP       : OleVariant; //  Save Prompt  <-|
 EP       : OleVariant; //  Empty param  <-|
 i        : integer;
 EmptyParam: OleVariant; // Пустой параметр
 S,S1     : string;

begin
 DocName:=GetProgramPath+'tablc.doc';
 ConfConv:=true;
 ReadOnly:=False;
 AddToRecFiles:=False;
 Psw:='';
 PswTmp:='';
 Revert:=False;
 WritePsw:='False';
 WritePswTmp:='False';
 Fmt:=WdOpenFormatAuto;

 FalseParam:=False;
 TrueParam:=True;
 Wrap:=WdFindContinue;

 WordApplication1.Connect;
 WordApplication1.Documents.OpenOld(DocName, ConfConv, ReadOnly, AddToRecFiles, Psw, PswTmp, Revert, WritePsw, WritePswTmp, Fmt);
 WordDocument1.ConnectTo(WordApplication1.ActiveDocument);

 Replace:=WdReplaceAll;
 Index:=0;

 FN:=InputBox('Сохранение','Введите имя файла:','xXx.doc');

 for i:=1 to WordApplication1.Documents.Count do
  begin
   i1:=i;
   S:=FN;
   if Pos('.',S)<>0
   then S:=Copy(S,1,Pos('.',S));
   S:=S+'doc';
   S1:=WordApplication1.Documents.Item(I1).Name;
   S:=ExtractFileName(S);
   S1:=ExtractFileName(S1);  // усли имена файлов одинаковы
   if UpperCase(S1)=UpperCase(S) then // то файл закрывается
    begin
     WordApplication1.Visible:=True;
     SP:=wdPromptToSaveChanges;
     EP:=wdOriginalDocumentFormat;
     WordApplication1.Documents.Item(i1).Close(SP,EP,EP);
    end;
  end;
 gp:=GetProgramPath+FN; // сохраняем шаблон под именем new_1.doc
 WordDocument1.SaveAs(gp);

////////////////////////// Вставляем в шаблон /////////////////////////////////

     // номер лота
 _Prod:='LabeledEdit1';
 Prod:=labelededit1.Text;
 WordDocument1.Range.Find.ExecuteOld(_Prod, EmptyParam, EmptyParam, EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, Prod, replace);

// название лекарства
 _Prod:='Nazvanie';
 Prod:=table1.fieldbyname('Name').AsString;
 WordDocument1.Range.Find.ExecuteOld(_Prod, EmptyParam, EmptyParam, EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, Prod, replace);

 WordApplication1.Application.Visible:=True;
 WordApplication1.Disconnect;




не могу разобраться в чем проблема? когда я нажимаю кнопку то просто - напросто программа зависает...помогите разобраться в чем проблема? =) заранее спасибо

Автор: Данкинг 23.2.2009, 11:50
А что именно надо сделать? Честно говоря, вникать в код неохота, могу только посоветовать вместо использования WordApplication1 создавать OLE-объект.

Автор: Timurrr 23.2.2009, 15:55
нужно чтобы выбранная информация с бд вставлялась в щаблон Word...

Автор: Данкинг 23.2.2009, 17:42
В документе у нас есть <шаблон1> и <шаблон2>, куда требуется вставить текст.

Код

uses comobj;
...
var worduk:variant;
...
worduk:=createoleobject('word.application');
worduk.documents.open ('d:\zakaz.doc');
worduk.visible:=false;

worduk.selection.find.text:='<шаблон1>';
if  worduk.selection.find.execute then worduk.selection.text:='нашли шаблон1';
worduk.selection.find.text:='<шаблон2>';
if  worduk.selection.find.execute then worduk.selection.text:='нашли шаблон2';
...
worduk.activedocument.saveas ('d\:zakaz.doc');
worduk.activedocument.close;
worduk.application.quit;
worduk:=unassigned;


Автор: Timurrr 23.2.2009, 19:51
Цитата(Данкинг @ 23.2.2009,  17:42)
В документе у нас есть <шаблон1> и <шаблон2>, куда требуется вставить текст.

Код

uses comobj;
...
var worduk:variant;
...
worduk:=createoleobject('word.application');
worduk.documents.open ('d:\zakaz.doc');
worduk.visible:=false;

worduk.selection.find.text:='<шаблон1>';
if  worduk.selection.find.execute then worduk.selection.text:='нашли шаблон1';
worduk.selection.find.text:='<шаблон2>';
if  worduk.selection.find.execute then worduk.selection.text:='нашли шаблон2';
...
worduk.activedocument.saveas ('d\:zakaz.doc');
worduk.activedocument.close;
worduk.application.quit;
worduk:=unassigned;

уже работает Спасибо, только заменяет один раз и 1-ое поле...?!?!

Автор: Данкинг 23.2.2009, 19:55
Цитата(Timurrr @  23.2.2009,  19:51 Найти цитируемый пост)
уже работает Спасибо, только заменяет один раз и 1-ое поле...?!?! 

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

Автор: Timurrr 23.2.2009, 20:41
Цитата(Данкинг @ 23.2.2009,  19:55)
Цитата(Timurrr @  23.2.2009,  19:51 Найти цитируемый пост)
уже работает Спасибо, только заменяет один раз и 1-ое поле...?!?! 

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

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

Автор: Данкинг 23.2.2009, 21:09
Цитата(Timurrr @  23.2.2009,  20:41 Найти цитируемый пост)
так и поступлю. спасибо!!! 

Пользуйся... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)