Показать сообщение отдельно
  #1  
Старый 25.04.2013, 23:15
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание Программа зависает что посоветуете и поиск по маске

Пишу программу чтоб себе жизнь упростить...
...есть гору документов excel все они созданы с помощью какой то программы у всех одинаковые таблицы - мне нужно искать внутри таблицы нужное мне строку взять его параметр... и т.д.

у меня две проблемы возникли - из за того что в программе точнее на одной процедуре содержится много операторов for - приводит к зависанию программы

Код:
begin
files:=0;
for lst := 0 to FileListBox1.Items.Count-1 do
  begin
  cleartable;
  label3.Caption:='';
  label4.Caption:='';
  label6.Caption:='';
  files:=files+1;
  if Xls_To_StringGrid(StringGrid1, DirectoryListBox1.Directory+'\'+FileListBox1.Items[lst]) then //загрузка документов excel
/////////////////////////////////////    
    s1:=DirectoryListBox1.Directory+'\'+FileListBox1.Items[lst]; //берем путь к файлу
        len:=length(s1);                                   //удаляем с него ненужное
          for i3 := 0 to Len do                            //оставляем только дату и название
             begin
               c_pos:=Pos('\', s1);
               Delete(s1, 1, c_pos);
               s2:=s1;
               len:=length(s1);
               c_pos:=Pos('_', s1);
               Delete(s1, c_pos, len);
               label3.Caption:=s1;
               Delete(s2, 1, c_pos);
               c_pos:=pos('.', s2);
               Delete(s2, c_pos, len);
               year:=copy(s2, 1, 4);
               month:=copy(s2, 5, 2);
               day:=copy(s2, 7, len);
               label4.Caption:=year+'/'+month+'/'+day;
               label6.Caption:=inttostr(StringGrid1.RowCount);
              end;
/////////////////////////////////////
x_vbp:=0;
x_vap:=0;
x_vnp:=0;
for i:=1 to StringGrid1.RowCount-1 do
begin
 if (StringGrid1.Cells[4,i]='VNOP') or
  (StringGrid1.Cells[4,i]='VNP') then
  begin
  x_vnp:=x_vnp+strtofloat(StringGrid1.Cells[9,i]);
  end;

 if (StringGrid1.Cells[4,i]='VBP') or
  (StringGrid1.Cells[4,i]='VBOP') then 
  begin
  x_vbp:=x_vbp+strtofloat(StringGrid1.Cells[9,i]);
  end;

 if (StringGrid1.Cells[4,i]='VAP') or
  (StringGrid1.Cells[4,i]='VAOP') then
  begin
  x_vap:=x_vap+strtofloat(StringGrid1.Cells[9,i]);
  end;
  StringGrid2.Cells[0,files]:=label3.Caption;
  StringGrid2.Cells[1,files]:='';//NAME
  StringGrid2.Cells[2,files]:=FloatToStrF(x_vbp, ffFixed, 18, 3);
  StringGrid2.Cells[3,files]:=FloatToStrF(x_vnp, ffFixed, 18, 3); 
  StringGrid2.Cells[4,files]:=FloatToStrF(x_vap, ffFixed, 18, 3); 
  stringGrid2.RowCount:=StringGrid2.RowCount+1;
end;
 end;
  for i2 := 0 to StringGrid2.RowCount-1 do //удаляем пустые сроки с вроторой таблицы
      begin
       if StringGrid2.Cells[0,i2]='' then 
       begin
         TDeleteGrid(StringGrid2).DeleteRow(i2);
       end;
      end;
end;

как то можно сделать чтоб программа работала не зависая?

и второй вопрос... можно ли внутри StringGrid искать не методом сравнения как я это сделал
Код:
StringGrid1.Cells[4,i]='VBP'
а по маске
допустим в таблице есть много строк все которые начинаются с VBP
Код:
VBP
VBP intnl
VBP extnl
VBP outnl
и. т.д.

искать их не методом сравнения полной имени а по маске VBP* ???

- если честно у нем есть одна идея - выбрать каждую строку отделить начальные три буквы и сравнивать с VBP - но это гора дополнительных операций


Что посоветуете???
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием