Консультация № 146062
05.10.2008, 12:57
0.00 руб.
0 6 1
Доброго времени суток уважаемые эксперты! Может мой вопрос покажется идиотским (по крайней мере, я так считаю :-)) но все же он возник: Можно ли впихнуть прогресс-бар в процедуру поиска файлов? И если можно, то, как это реализовать? Процедура в приложении.

Приложение:
Procedure TMainForm.SearchFile(way,mask:string);
Var SR:TSearchRec;
FindRes:Integer;
begin
FindRes:=FindFirst(way+mask,faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name='.')or(SR.Name='..')) then
begin
FindRes:=FindNext(SR);
Continue;
end;
if ((SR.Attr and faDirectory)=faDirectory) then
begin
SearchFile(way+SR.Name+'\','*.*');
FindRes:=FindNext(SR);
Continue;
end;
FileBox.Items.Add(SR.Name);
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;

Обсуждение

Неизвестный
05.10.2008, 13:26
общий
Код:
Procedure TMainForm.SearchFile(way,mask:string);
Var SR:TSearchRec;
FindRes:Integer;
begin
FindRes:=FindFirst(way+mask,faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name='.')or(SR.Name='..')) then
begin
FindRes:=FindNext(SR);
Continue;
end;
if ((SR.Attr and faDirectory)=faDirectory) then
begin
SearchFile(way+SR.Name+'\','*.*');
FindRes:=FindNext(SR);
Continue;
end;
FileBox.Items.Add(SR.Name);
FindRes:=FindNext(SR);
with ProgressBar1 do
begin
Position:=Position+1;
if Position = Max then
position:=min;
end;

end;
FindClose(SR);
end;


На форме ProgressBar1. Скорее всего это не совсем то, что вам надо. У меня прогресс бар не отображает реального этапа выполнения задачи. Проще говоря, когда поиск выполнился на 50%, прогресс бар будет показывать другое значение. Если это то, что вам надо сообщите в минифорум.
давно
Мастер-Эксперт
425
4118
05.10.2008, 13:34
общий
Так как обычно применяют ProgressBar сделать невозможно, т.к. для этого Вам надо знать количество найденных файлов заранее.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
05.10.2008, 14:04
общий
Так выводите хотя-бы текущий каталог поиска - также информативно.
Неизвестный
05.10.2008, 14:13
общий
Спасибо за ответы! Сам понимаю что нереально . Но на эту идею натолкнул поиск в Windows Vista. Хотя, подозреваю, что она также берет граничные значения из MFT.
P.S. Насчет ответа Абельхарисова Руслана – это не совсем то что я хотел. Но идея очень даже интересная и в качестве индикатора работы вполне сойдет. Жаль только что лишний if будет сильно тормозить и без того продолжительный процесс поиска.
давно
Мастер-Эксперт
425
4118
05.10.2008, 15:06
общий
Евчик Сергей Александрович
Про висту в этом отношении вообще ходят легенды, так что её за образец брать не надо. По её расчётам, например, один DVD-диск должен копироваться больше ста лет.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
05.10.2008, 15:42
общий
это ответ
Здравствуйте, Евчик Сергей Александрович!
В принципе можно. Я бы предложил такой алгоритм:
по мере мере заполнения прогресс-бара домножать его максимальное значение на 2.
Предлагаемое дополнение кода - в приложении.
Для наглядности нужно подобрать значения ProgressBar1.Max хотя бы 500 и шаг 20.

Приложение:
begin
ProgressBar1.Position:= 0;
...
FileBox.Items.Add(SR.Name);
ProgressBar1.Position:= ProgressBar1.Position + 10;
if ProgressBar1.Position >= ProgressBar1.Max then {если позиция в максимуме}
ProgressBar1.Max:= ProgressBar1.Max * 2;
FindRes:=FindNext(SR);
end;
FindClose(SR);
ProgressBar1.Position:= ProgressBar1.Max; {по окончанию поиска переводим в максимум}
...
end;
Форма ответа