Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Технологии
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.12.2011, 14:56
Samuyl Samuyl вне форума
Прохожий
 
Регистрация: 19.04.2011
Адрес: Подольск
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Быстродействие при работе с Word' ом

Уважаемые программисты, помогите пожалуйста с решением проблемы. Я написал программу, которая читает данные типа integer из таблицы построенной в MsWord.Открываю файл так:
Код:
Var Cadr: integer  =  100;

//ПРОЦЕДУРА ЧТЕНИЯ ФАЙЛА 
procedure TForm1.Button1Click(Sender: TObject);
begin
     try
        //СОЗДАЁМ ДОКУМЕНТ WORD
        MsWord:=CreateOleObject('Word.Application');
     except
           begin
                Form1.Memo1.Font.Color:=clRed;
                Form1.Memo1.Lines.Add('MsWord не установлен.');
           end;
     end;
     MsWord.Visible:=false;//ДЕЛАЕМ ЕГО НЕВИДИМЫМ
     MsWord.Documents.Open(Edit2.Text);//ОТКРЫВАЕМ ФАЙЛ
     //РАЗРЕШАЕМ РАБОТУ С ТАБЛИЦЕЙ 
     DataTable := MsWord.ActiveDocument.Tables.Item(1);
     Rows := DataTable.Rows.Count;//НАЙДЁМ КОЛИЧЕСТВО СТРОК ВООБЩЕ
     if Rows > 100 then//ЕСТЬ ЛИ СМЫСЛ ЧИТАТЬ ВСЁ?!
        begin
             for x:=1 to Cadr do
                begin
                     Form1.Button4.Enabled:=false;
                     Form1.Button5.Enabled:=true;
                     for y:=1 to 7 do
                        begin
                             //ЧИТАЕМ
                             DataRead1[y] := VarToStr(datatable.cell(x+1,y+2).
                                                     range.formattedtext);
                             //ПРЕОБРАЗОВЫВАЕМ В ТИП integer
                             Val(DataRead1[y], DataRead2[y], Code);
                             //ВЫВОДИМ ДАННЫЕ В ГРАФИКЕ
                             Form1.Chart1.Series[y-1].Add(DataRead2[y]);
                        end;
                end;
        end
        else
            begin
                 for x:=1 to Rows do//ЕСЛИ СТРОК МЕНЬШЕ 100, ЧИТАЕМ ВСЁ
                    begin
                         Form1.Button4.Enabled:=false;
                         Form1.Button5.Enabled:=false;
                         for y:=1 to 7 do
                            begin
                                 //ЧИТАЕМ
                                 DataRead1[y] := VarToStr(datatable.cell(x+1,y+2).
                                                         range.formattedtext);
                                 //ПРЕОБРАЗОВЫВАЕМ В ТИП integer
                                 Val(DataRead1[y], DataRead2[y], Code);
                                 //ВЫВОДИМ ДАННЫЕ В ГРАФИКЕ
                                 Form1.Chart1.Series[y-1].Add(DataRead2[y]);
                            end;
                    end;
            end;
end;
Сотня строк файла читаются за полторы секунды. Но для того чтобы прочитать следующие сто строк от другой кнопки требуется около 5-ти минут, хотя код такой-же. 

procedure TForm1.Button5Click(Sender: TObject);
begin
     if Counter=0 then Form1.Button4.Enabled:=false;
     Counter:=Counter+1;
     Form1.Button4.Enabled:=true;
     //РАЗРЕШАЕМ РАБОТУ С ТАБЛИЦЕЙ
     DataTable := MsWord.ActiveDocument.Tables.Item(1);
     for x := Cadr to Cadr + Cadr do//РАЗМЕР КАДРА ЧТЕНИЯ
        begin
             for y:=1 to 7 do
                begin
                        //ЧИТАЕМ
 ОШИБКА? -----> DataRead1[y] := VarToStr(DataTable.Cell(x+1,y+2).
                                                      Range.FormattedText);
                     //ПРЕОБРАЗОВЫВАЕМ В ТИП integer 
                     Val(DataRead1[y], DataRead2[y], Code);
                     //ВЫВОДИМ ДАННЫЕ В ГРАФИКЕ
                     Form1.Chart1.Series[y-1].Add(DataRead2[y]);
                end;
        end;
     Cadr := Cadr + 50;//УВЕЛИЧИВАЕМ ЗОНУ ПРОСМОТРА
end;
Admin: Пользуемся тегами для оформления кода!

Я пробовал отключать строку

VarToStr(DataTable.Cell(x+1,y+2).Range.FormattedTe xt);

и скорость существенно повысилась. Но почему происходит такое резкое замедление скорости, я понять не могу. Помогите пожалуйста. Спасибо.

Последний раз редактировалось Admin, 26.12.2011 в 15:13.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter