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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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 - но это гора дополнительных операций


Что посоветуете???
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #2  
Старый 26.04.2013, 00:44
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Цитата:
как то можно сделать чтоб программа работала не зависая?
Код:
Application.ProcessMessages;
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 26.04.2013, 01:26
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
По умолчанию

Я так понял Application.ProcessMessages чередует выполнение кода? или как?

Создал дополнительный поток добавил туда
Код:
          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;
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #4  
Старый 26.04.2013, 03:23
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Electronic_Arts
Я так понял Application.ProcessMessages чередует выполнение кода
Отдаёт кванты времени системе. Особенно полезно на длительных циклах, когда создаётся впечатление, что компьютер "повис".
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Electronic_Arts (26.04.2013)
  #5  
Старый 26.04.2013, 13:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

И снова та-же ошибка, что была буквально пару дней назад. Цикл с удалением строк переверните. Обход строк надо делать с конца, а не с начала.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Electronic_Arts (26.04.2013)
  #6  
Старый 26.04.2013, 22:55
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Цитата:
Сообщение от angvelem
Отдаёт кванты времени системе. Особенно полезно на длительных циклах, когда создаётся впечатление, что компьютер "повис".
Ты бы куда посоветовал прописать в моем коде
Application.ProcessMessages() ???
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #7  
Старый 26.04.2013, 22:56
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Цитата:
Сообщение от Страдалецъ
И снова та-же ошибка, что была буквально пару дней назад. Цикл с удалением строк переверните. Обход строк надо делать с конца, а не с начала.
Да да да да - ты прав - зачем начать поиск с начала если там все и так и так забито...наоборот даже быстрее будет
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter