Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> proggress bar для процедуры move 
:(
    Опции темы
Гость_Программер
Дата 12.3.2005, 23:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нужно сделать так чтобы в progressBar отражал ход выполнения процедуры Move.
Помогите!

Код
procedure  Move( const Source; var Dest; count : Integer );
var
  S, D: PChar;
  I: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;
  if Cardinal(D) > Cardinal(S) then
    for I := count-1 downto 0 do
      D[I] := S[I]
  else
    for I := 0 to count-1 do
      D[I] := S[I];
end;

  Вверх
Poseidon
Дата 13.3.2005, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Ну так ставишь в циклы
Код
progressbar1.Position:= I
или
Код
progressbar1.Position:= count-1 - I
Только перед этим делаешь минимальное значение progressbar1 равным началу цикла, а максимальное - концу. Т.е что-то вроде этого:
Код
procedure  Move( const Source; var Dest; count : Integer );
var
  S, D: PChar;
  I: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;

  progressbar.min:= 0;
  progressbar.max:= count-1;

  if Cardinal(D) > Cardinal(S)
  then
    for I := count-1 downto 0 do
       begin
       D[I] := S[I];
       progressbar1.position:= count-1 - I;
       end;
  else
    for I := 0 to count-1 do
        begin
        D[I] := S[I];
        progressbar1.position:= I;
       end;
end;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Santer
Дата 13.3.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.3.2005

Репутация: нет
Всего: нет



Ну и ко всему этому в цикл засовываешь
Код

Application.ProcessMessages;

PM MAIL   Вверх
Vit
Дата 14.3.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Код

procedure  Move( const Source; var Dest; count : Integer );
var
  S, D: PChar;
  I: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;

  progressbar.min:= 0;
  progressbar.max:= count-1;

  if Cardinal(D) > Cardinal(S)
  then
    for I := count-1 downto 0 do
       begin
       D[I] := S[I];
       if I mod 1000=0 then   progressbar1.position:= count-1 - I;
       end;
  else
    for I := 0 to count-1 do
        begin
        D[I] := S[I];
        if I mod 1000=0 then   progressbar1.position:= I;
        end;
end;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 15.3.2005, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Vit, что-то я не пойму, зачем проверять остаток от деления?
Код
if I mod 1000=0 then
Что, так, как я предложил, работать не будет? Или будут какие-то ошибки? Просто интересно, почему, если I делется на 1000 без остатка, то увеличиваем progressbar? А если I варьируется от 0 до 900? Тогда вообще progressbar не сдвинется! Обьясни пожалуйста.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 15.3.2005, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Poseidon @ 15.3.2005, 04:38)
что-то я не пойму, зачем проверять остаток от деления?

Чтобы избежать 1000 ненужных операций.
Вместо 1000 можно подобрать свое значения, в зависимости от count.
Просто, если там 1000000 байт переместить нужно, то, благодаря прогресбару процесс затянется надолго.
Вообще оптимально проверять на шаг прогрессбара, если он кубиками.
PM MAIL   Вверх
Гость_Программер
Дата 15.3.2005, 11:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Poseidon
Vit

Вы хоть проверяли то что написали?
Не работают ваши коды.
  Вверх
Гость_Программер
Дата 15.3.2005, 11:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А можно сделать так чтобы в свойствах progressbar
не пришлось ставить
progressbar.max:= count-1;

smile
  Вверх
p0s0l
Дата 15.3.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Можно


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 15.3.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Код

  if Cardinal(D) > Cardinal(S) then
    begin
      for I := count-1 downto 0 do
         if I mod 1000=0 then
           with progressbar1 do
             position := min + Round((count-1 - I)/count*(max-min));
    end
  else
    for I := 0 to count-1 do
        if I mod 1000=0 then 
         with progressbar1 do
           position := min + Round(I/count*(max-min));
На форме можешь выставить у ProgressBar1 диапазон, к примеру, от 0 до 100...



--------------------
С уважением, г-н Посол.
PM   Вверх
Girder
Дата 15.3.2005, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Тоже... решил поучаствовать smile

Код
procedure  Move( const Source; var Dest; count : Integer;PB:TProgressBar );
var S,D:PChar;
    I:Integer;
    v:real;
    tc,tt:TDateTime;
begin
 tc:=Now;
 Sleep(10);
 tc:=(Now-tc)*10;
 PB.Min:=0;
 PB.Max:=200;
 v:=Count/PB.Max;
 S:=PChar(@Source);
 D:=PChar(@Dest);
 if (Count>0)and(s<>D) then
  begin
   tt:=now;
   if Cardinal(D)>Cardinal(S) then
    begin
     for I := count-1 downto 0 do
      begin
       D[I] := S[I];
       if (Now-tt)>=tc then
        begin
         PB.Position:=PB.Max-trunc(i/v);
         Application.ProcessMessages;
         tt:=Now;
        end;
      end
    end else
    for I := 0 to count-1 do
     begin
      D[I] := S[I];
      if (Now-tt)>=tc then
       begin
        PB.Position:=trunc(i/v);
        Application.ProcessMessages;
        tt:=Now;
       end;
     end;
  end;
 PB.Position:=PB.Max;
end;


Использование: Move(s1,s2,i, ProgressBar1);


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
RA
Дата 16.3.2005, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Код


procedure   Move( const Source; var Dest; count : Integer );
var
  S, D: PChar;
  I,n: Integer;
begin
 N:=0;
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;

  if Cardinal(D) > Cardinal(S)
  then
    for I :=1 to count do
       begin
       D[I] := S[I];
       if Trunc(I / Count*100) > N then
        begin
          N:=Trunc(I / Count*100);
          progressbar1.position:=N;
        end;

       end
  else
    for I := 1 to count do
        begin
        D[I] := S[I];
        if Trunc(I / Count*100) < N then
        begin
          N:=Trunc(I / Count*100);
          progressbar1.position:=N;
        end;
       end;
end;



PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.