Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > proggress bar для процедуры move


Автор: Гость_Программер 12.3.2005, 23:01
Нужно сделать так чтобы в 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
Ну так ставишь в циклы
Код
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;

Автор: Santer 13.3.2005, 19:43
Ну и ко всему этому в цикл засовываешь
Код

Application.ProcessMessages;

Автор: Vit 14.3.2005, 16:49
Код

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;

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

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

Чтобы избежать 1000 ненужных операций.
Вместо 1000 можно подобрать свое значения, в зависимости от count.
Просто, если там 1000000 байт переместить нужно, то, благодаря прогресбару процесс затянется надолго.
Вообще оптимально проверять на шаг прогрессбара, если он кубиками.

Автор: Гость_Программер 15.3.2005, 11:05
Poseidon
Vit

Вы хоть проверяли то что написали?
Не работают ваши коды.

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

smile

Автор: p0s0l 15.3.2005, 15:39
Можно

Автор: p0s0l 15.3.2005, 16:32
Код

  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...

Автор: Girder 15.3.2005, 21:49
Тоже... решил поучаствовать 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);

Автор: RA 16.3.2005, 05:04
Код


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;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)