|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Программа зависает что посоветуете и поиск по маске
Пишу программу чтоб себе жизнь упростить...
...есть гору документов 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
|
||||
|
||||
Цитата:
Код:
Application.ProcessMessages; Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#3
|
||||
|
||||
Я так понял 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
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Electronic_Arts (26.04.2013)
|
#5
|
||||
|
||||
И снова та-же ошибка, что была буквально пару дней назад. Цикл с удалением строк переверните. Обход строк надо делать с конца, а не с начала.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Electronic_Arts (26.04.2013)
|
#6
|
||||
|
||||
Цитата:
Нет ничего не возможного. Вопрос только во времени... |
#7
|
||||
|
||||
Цитата:
Application.ProcessMessages() ??? Нет ничего не возможного. Вопрос только во времени... |