Zwiększenie progressbar po wykonaniu komendy

0

Witam, szukałem i nie znalazłem odpowiedzi na moje pytanie:
Chcę aby po wykonaniu każdego polecenia zwiększał się pasek progressbar o określony procent.

Przykład:

fpsystem('cp plik1 plik_1 &&');

Po tym poleceniu pasek postępu ma 1%

fpsystem('cp plik2 plik_2 &&');

Po tym poleceniu pasek postępu ma 3%

fpsystem('cp plik3 plik_3 &&');

Po tym poleceniu pasek postępu ma 10%

i tak dalej aż do 100%

dodanie znaczników <code class="delphi"> - Furious Programming

0

A czym się różnią te polecenia, że po jednym chcesz zwiększyć o 2%, a po innym o 7%?

Wszystko zależy od tego co ma określać pasek postępu - jeśli np. postęp kopiowania kilku plików, to maksimum paska może określać łączną wagę wszystkich plików np. w kilobajtach; Dzięki temu po skopiowaniu jednego pliku zwiększasz pozycję paska o jego rozmiar, i tak do końca kopiowania; Wzrost rozmiaru paska będzie nieregularny - uzależniony od rozmiarów plików; Im bardziej będą się ich wagi różnić, tym większa nieregularność skoków paska;

Napisz więc dokładniej co chcesz określać tym paskiem, a podpowie się jakieś sensowne rozwiązanie.

0

Doprawdy ?! Nie znalazłeś? A szukałeś ?

ProgressBar1.StepIt;
0

Kopiowanie było tylko przykładem.
Mam listę komend które się wykonują (kopiowanie, instalacja pakietów itp.) i chcę aby po każdej wykonanej komendzie zwiększał się procent.

Czyli po każdym:

fpsystem('');

tutaj ręcznie chcę określić jaki będzie procent.

fpsystem('');

procent

fpsystem('');

procent
itd.

dodanie znaczników <code class="delphi"> - Furious Programming

1

Najlogiczniej, wedlug mnie, to mieć tablicję tych operacji na przykład dynamiczną. Albo znany całowitą ilośc tych operacji. I ustawić własności w odpowiedni sposób. Max na ilość calowitą, a Progress zwiększąc po zakonczeniu każdej z nich. Można sobie do tego dla przszłościowej wygody i sytuacji gdy kiedyś to jeszcze będziesz potrzebiwać, napisac jakąś prostą klase / osobny moduł. Tak przynajmniej ja bym kombinował i radził, ale zrobisz jak będziesz uważał. Może ktoś tutaj doradzi jeszcze jakieś inne rozwiązanie jeśli używał.

0

@controles - wstawiaj linijki kodu w specjalne znaczniki kolorujące składnię; Dzięki temu post będzie czytelny, a linie kodu będą nie dość, że od razu widoczne, to ich zawartość zostanie sformatowana (m.in. pokolorowana); Jeśli nie wiesz jakie są to znaczniki - zapoznaj się z tym artykułem;

Wracając do tematu - jeśli po każdym wywołaniu procedury pasek postępu ma urosnąć o stałą wartość, to skorzystaj z podpowiedzi @_13th_Dragon i użyj do tego celu metody StepIt; Napisałem, że o stałą wartość, bo uzależniona jest ona od właściwości Step, ustawionej domyślnie na 10 (przynajmniej w Delphi7 i Lazarusie);

Jeżeli natomiast po każdym wywołaniu procedury fpsystem pasek ma się zwiększać o wartość dynamiczną - te wartości musisz gdzieś mieć zapisane; Jeśli nie ma jakiegoś punktu zaczepienia, łączącego wszystkie wywołania tej procedury, to po każdym jej wywołaniu musisz ręcznie ustawiać wartość właściwości Position; Natomiast jeśli wszystkie wywołania tej procedury możesz wykonywać w pętli - wpakuj rozmiary skoków do tablicy tak jak zaproponował @olesio i w każdej iteracji pętli zwiększaj pozycję paska o rozmiar zawarty w odpowiedniej komórce macierzy; Dzięki temu kod będzie krótki, zwięzły i łatwy do rozbudowania;

Póki co nie napisałeś czy coś łączy wywołania procedury fpsystem, więc na chwilę obecną po prostu inkrementuj ręcznie pozycję paska, wykorzystując właściwość Position, uprzednio określając minimalną i maksymalną wartość (czyli właściwości Min i Max komponentu):

with ProgressBar1 do
begin
  Min := 0;
  Max := 100;
  Position := 0;

  fpsystem('cp plik1 plik_1 &&');
  Position := Position + 1; // 1%

  fpsystem('cp plik2 plik_2 &&');
  Position := Position + 2; // 3%

  fpsystem('cp plik3 plik_3 &&');
  Position := Position + 7; // 10%

  {...}
end;

Nie jest to ładne rozwiązanie (bo co jeśli tych wywołań będziesz miał dziesiątki lub setki..?), ale przynajmniej realizuje Twoje założenia.

0

Powyższe rozwiązanie by było ok, ale jest problem:

Okno programu zostaje "zamrożone" na czas wykonywania komend i dopiero po skończeniu następuje zmiana w progressbar o wszystkie wartości.

0

Masz co najmniej dwa wyjścia:

  • po wykonaniu każdego wywołania procedury fpsystem wywołaj dodatkowo metodę Application.ProcessMessages,
  • wszystkie wymienione operacje wykonuj w wątku pobocznym, nie w głównym;
    Pierwsze jest łatwiejsze, drugie wymaga znajomości tworzenia aplikacji wielowątkowych.
0

Po dodaniu:

Application.ProcessMessages;
działa prawidłowo.
Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1