Уважаемые программисты, помогите пожалуйста с решением проблемы. Я написал программу, которая читает данные типа 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);
и скорость существенно повысилась. Но почему происходит такое резкое замедление скорости, я понять не могу. Помогите пожалуйста. Спасибо.