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


Автор: Grol 11.9.2005, 01:56
Еще раз здравствуйте. Такой вопрос из Stringgrid переношу информацию в Word, а частности в таблицу, которую я создал до того как переносить данные из Stringgrid в Word. Возниает очень странный глюк: данные переносятся очень медленно как-будто у меня не Пень 4, а спектрум. :-(((( В ячейки таблицы данные заполняются с частотой примерно 0.5 сек., может быть немного побыстрее (но все равно это же медленно), а если же при заполнении таблицы нажжать на прокрутку Word'a и держать, то процесс почему-то ускорится...??????? Мастера подскажте в чем может здесь быть дело? Спасибо заранее.

Вот здесь код по созданию и заполнению таблицы:

Код

implementation

uses ComObj;
var W:variant;

Function CreateWord:boolean;
begin
CreateWord:=true;
try
W:=CreateOleObject('Word.Application');
except
CreateWord:=false;
end;
End;

Function VisibleWord(visible:boolean):boolean;
begin
VisibleWord:=true;
try
W.visible:= visible;
except
VisibleWord:=false;
end;
End;

Function AddDoc:boolean;
 Var Doc_:variant;
begin
AddDoc:=true;
try
Doc_:=W.Documents;
Doc_.Add;
except
AddDoc:=false;
end;
End;

Function SetTextToDoc(text_:string ;InsertAfter_:boolean):boolean;
 var Rng_:variant;
begin
SetTextToDoc:=true;
try
Rng_:=W.ActiveDocument.Range;
if InsertAfter_ then Rng_.InsertAfter(text_) else Rng_.InsertBefore(text_);
except
SetTextToDoc:=false;
end;
End;

Function SaveDocAs(file_:string):boolean;
begin
SaveDocAs:=true;
try
W.ActiveDocument.SaveAs(file_);
except
SaveDocAs:=false;
end;
End;

Function CreateTable(NumRows, NumColumns:integer;var index:integer):boolean;
 var sel_:variant;
begin
CreateTable:=true;
try
sel_:=W.selection;
W.ActiveDocument.Tables.Add(Range:=sel_.Range, NumRows:=NumRows, NumColumns:=NumColumns);
index:=W.ActiveDocument.Tables.Count;
except
CreateTable:=false;
end;
End;

procedure TReportForm.TableBtnClick(Sender: TObject);
var
tablica_:integer;
i,j,TempTT,TempTTT:integer;
TempTable:string;
begin
   TempTT:=SG2.RowCount + 2;
   If CreateTable(TempTT,3,tablica_) then
   begin
    SetTextToTable(tablica_,1,1,'Итог');
    SetTextToTable(tablica_,2,1,'Номер П/П');
    SetTextToTable(tablica_,2,2,'T');
    SetTextToTable(tablica_,2,3,'U');
    TempTT:=SG2.RowCount-1;
    for i:=0 to TempTT do
      begin
        Application.ProcessMessages;
        TempTable:=inttostr(i+1);
        SetTextToTable(tablica_,i+3,1,TempTable);
      end;
    for i:=0 to TempTT do
      begin
        Application.ProcessMessages;
        TempTable:=SG2.Cells[0,i];
        SetTextToTable(tablica_,i+3,2,TempTable);
      end;
    for i:=0 to TempTT do
      begin
        Application.ProcessMessages;
        TempTable:=SG2.Cells[1,i];
        SetTextToTable(tablica_,i+3,3,TempTable);
      end;
    SetMergeCellsTable(tablica_,1,1,1,3);
   end;
end;

Function CloseDoc:boolean;
begin
CloseDoc:=true;
try
W.ActiveDocument.Close;
except
CloseDoc:=false;
end;
End;

Function CloseWord:boolean;
begin
CloseWord:=true;
try
W.Quit;
except
CloseWord:=false;
end;
End;

procedure TReportForm.CreateWordRepClick(Sender: TObject);
var
savepath:string;
i,j:integer;
ExWord:string;
rng_:string;
tablica_:integer;
begin
CreateWordRep.Enabled:=False;
savepath:=(ExtractFilePath(paramstr(0)) + 'REPORTS\WordDocument.doc');
 if CreateWord
  then begin
  StatBox.Clear;
  Statbox.Items.Add('Запуск движка Word');
  if ShowWordCh.Checked=True then
    begin
        VisibleWord(true);
        StatBox.Items.Add('Отображение главного окна Word');
    end;
  If AddDoc then begin
    Statbox.Items.Add('Создание документа');
  TableBtnClick(Sender);
    StatBox.Items.Add('Заполнение отчета');
    SaveDocAs(savepath);
    StatBox.Items.Add('Автосохранение отчета в ' + SavePath);
if SaveWordCh.Checked=True then
 if SaveDlg1.Execute then
  begin
   SaveDocAs(SaveDlg1.FileName);
   StatBox.Items.Add('Отчет сохранен ' + SaveDlg1.FileName);
  end; 
   StatBox.Items.Add('Текст сохранен');
   if CloseWordCh.Checked=True then CloseDoc;
   end;
   if CloseWordCh.Checked=True then StatBox.Items.Add('Движок остановлен');
   if CloseWordCh.Checked=True then   CloseWord;
  end;
CreateWordRep.Enabled:=True;
end;

Автор: Grol 11.9.2005, 14:51
Извините забыл вот эту функцию:

Код

Function SetTextToTable(Table:integer;Row,Column:integer;text:string):boolean;
begin
SetTextToTable:=true;
try
W.ActiveDocument.Tables.Item(Table).Columns.Item(Column).Cells.Item(Row).Range.Text:=text;
except
SetTextToTable:=false;
end;
End;

Автор: <Spawn> 12.9.2005, 05:22
Подобные темы не раз обсуждались - используйте поиск, например, по слову VarArrayCreate

Автор: ErManDir 27.9.2005, 13:05
Или используйте раннее связывание с вордом.

Автор: YurikGL 19.10.2005, 17:01
Из стринггрида пишешь всю информацию в большуууую строку (string) разделяя столбцы и строки "переносом строки" и "табуляций" соответсвенно. Потом пихай всю эту длинную строку во ворд. Выделяй с помощью select и делай convertToTable

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