Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2010, 13:13   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Увеличение счетчика при сохранении файлов

Добрый вечер! Решил сделать отображение количества сохраненных файлов. Завел переменную counter и разместил ее после строчки сохранения файла. Задача: увеличивать на 1 значение counter и отображать после каждого сохраненного файла обновленное значение в Label25. Вот код:
Код:
procedure TMainForm.N8Click(Sender: TObject);
var
 x,y,i,counter:integer;
 b:TBitmap;
 sr:TSearchRec;
 s:string;
 jpg: TJpegImage;
begin
 b:=TBitmap.Create;
 jpg:=TJpegImage.Create;
 FindFirst(MainForm.RzStatusPane10.Caption +'*.bmp',faAnyFile,sr);
 with RzStringGrid2 do
  for i:=0 to RowCount-1 do
  begin
   counter:=1;
   b.LoadFromFile(MainForm.RzStatusPane10.Caption + sr.Name);
   jpg.Assign(b);
   jpg.CompressionQuality:=5;
   jpg.Compress;
   jpg.SaveToFile(MainForm.RzStatusPane12.Caption + MainForm.RzStringGrid2.Cells[0,i] + '.jpeg');
   Inc(counter);
   Label25.Caption:=IntToStr(counter);
   if FindNext(sr)<>0 then break;
  end;
   b.Free;
   jpg.Free;
   FindClose(sr);
   ShowMessage('                  Âûïîëíåíî!                  ');
end;
но, счетчик не увеличивается. Когда начинается процедура сохранения, то значение в Label25 никак не отображается, а когда закончится и появится сообщение, то в Label25 показывается число 2. Откуда оно - я не знаю че-т. Подскажите как правильно надо? И еще вопрос: нужно ли в данном коде помещать строчку Application.ProcessMessages? Чтобы программа не подвисала. Если да, то где ее разместить?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 19.11.2010, 13:18   #2
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Код:
counter:=1;  
for i:=0 to RowCount-1 do
  begin
  
   b.LoadFromFile(MainForm.RzStatusPane10.Caption + sr.Name);
   jpg.Assign(b);
   jpg.CompressionQuality:=5;
   jpg.Compress;
   jpg.SaveToFile(MainForm.RzStatusPane12.Caption + MainForm.RzStringGrid2.Cells[0,i] + '.jpeg');
   Inc(counter);
   Label25.Caption:=IntToStr(counter);
Application.ProcessMessages;
   if FindNext(sr)<>0 then break;
  end;
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 19.11.2010, 19:09   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Ок, хорошо. Это сделано. Но вот как и исходя из чего расчитать правильно шаг для Progressbar-a? Что передавать ему в качестве StepBy? Если я пишу так:
Код:
procedure TMainForm.N8Click(Sender: TObject);
var
 x,y,i,counter:integer;
 b:TBitmap;
 sr:TSearchRec;
 s:string;
 jpg: TJpegImage;
begin
 b:=TBitmap.Create;
 jpg:=TJpegImage.Create;
 FindFirst(MainForm.RzStatusPane10.Caption +'*.bmp',faAnyFile,sr);
 counter:=0;
 with RzStringGrid2 do
  for i:=0 to RowCount-1 do
  begin
   b.LoadFromFile(MainForm.RzStatusPane10.Caption + sr.Name);
   jpg.Assign(b);
   jpg.CompressionQuality:=5;
   jpg.Compress;
   jpg.SaveToFile(MainForm.RzStatusPane12.Caption + MainForm.RzStringGrid2.Cells[0,i] + '.jpeg');
   Inc(counter);
   MainForm.ProgressBar1.StepBy(counter);
   Label25.Caption:=IntToStr(counter);
   Application.ProcessMessages;
   if FindNext(sr)<>0 then break;
  end;
   b.Free;
   jpg.Free;
   FindClose(sr);
   ShowMessage('                  Âûïîëíåíî!                  ');
end;
то ясное дело, что индикатор "отстает" и не доходит до конца. Как правильно ему записать, чтобы инликатор правильно доходил до ста, независимо от того, какое число передается через counter?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 19.11.2010, 19:44   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Замени MainForm.ProgressBar1.StepBy(counte r); на MainForm.ProgressBar.Position := I * MainForm.ProgressBar1.Max div RowCount;
maxionans вне форума Ответить с цитированием
Старый 19.11.2010, 19:49   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Все равно индикатор "не успевает"...)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 19.11.2010, 19:59   #6
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

как сильно не успевает? добавь туда ещё "+ 1"
maxionans вне форума Ответить с цитированием
Старый 19.11.2010, 20:07   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Можно работать с ProgressBar процентами.
Тогда он всегда будет иметь МАКС=100.
Просто counter сделать Float. Но их должно быть два - один старый, другой новый.
Новый - это текущий, а старый для сравнения.
И проверять старое и новое значение на разницу, превысившую 1%...
Превысили - записываем в старый значение нового и продвигаем индикатор.
mihali4 вне форума Ответить с цитированием
Старый 19.11.2010, 20:18   #8
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

ну вот если условиться, что ProgressBar1.Max всегда равно 100 и поправить моё выражение I * MainForm.ProgressBar1.Max div RowCount на I * 100 div RowCount, то это и получится вычисление процентов.
maxionans вне форума Ответить с цитированием
Старый 19.11.2010, 20:22   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Что-то я ужо не соображаю. Потому что опять 2 часа ночи. Прикрутили уже сюда какие-то проценты вы тут . Попробую завтра на свежую голову вникнуть)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 20.11.2010, 01:48   #10
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Код:
for i:=0 to RowCount-1 do
  begin
   counter:=1;
   ....
   jpg.SaveToFile(MainForm.RzStatusPane12.Caption + MainForm.RzStringGrid2.Cells[0,i] + '.jpeg');
   Inc(counter);
   ....
  end;
перевожу на русский:
от 0 до RowCount-1 делаем такую процедру:
счетчик:=1
сохраняем файл
увеличиваем счетчик

надеюсь вы поняли свою ошибку =)
поставьте counter:=1; перед for

кстати, чтобы label1 сразу отображала изменения нужно после
label1.caption:='превед медвед';
написать
label1.refresh; // виноват, был не прав, не заметил, теперь исправил.

Цитата:
ну вот если условиться, что ProgressBar1.Max всегда равно 100 и поправить моё выражение I * MainForm.ProgressBar1.Max div RowCount на I * 100 div RowCount, то это и получится вычисление процентов.
вы уж меня извините, но зачем городить такую ерунду?
у progressBar есть свойство Max.
в вашем случае: progressBar1.Max:=RowCount;
далее в цикле for:
либо progressBar1.position:=i;
либо progressBar1.position:=progressBar1 .position + 1;

а MainForm.ProgressBar1.StepBy(counte r);
не знаю что это, но точно не то что продвигает progressBar1.

Последний раз редактировалось xrob; 20.11.2010 в 02:01.
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не отображаются записи при сохранении!! ЛисЁНЫШ БД в Delphi 4 06.04.2010 14:30
Отказ при сохранении файла Igor_Tr Microsoft Office Excel 0 17.01.2010 20:40
Ошибка при сохранении БД Xeon332 Помощь студентам 2 05.01.2010 17:00
Ошибки при сохранении Alex19789 Microsoft Office Excel 6 16.10.2009 12:39
Макрос при сохранении Полина Л. Помощь студентам 0 14.09.2009 16:30