Еще раз здравствуйте. Такой вопрос из 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;
| |