CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pytanie o "Trochę inny ProgressBar"
Strona 1 z 1

Pytanie o "Trochę inny ProgressBar"

Nowy postNapisane: środa, 11 maja 2011, 22:22
przez Pitek
Witam!
Mam pytanie jak zrobić żeby ten "Trochę inny PrograssBar" z porady działał tak długo jak wykonywany jest kod w zdarzeniu ?
Czyli na początku zdarzenia, ProgressBar startuje a jak kod się wykona to dopiero wtedy się zatrzymuje, jak to zrobić ?
Pytanie może śmiesznie proste ale jakoś nie umiem go poprawnie rozgryźć :? i proszę o pomoc.

Re: Pytanie o "Trochę inny ProgressBar"

Nowy postNapisane: czwartek, 12 maja 2011, 17:50
przez Cyfrowy Baron
► patrz serwis: Cyfrowy Baron dział: porady -> różne -> Trochę inny ProgressBar.

Czyli na początku zdarzenia, ProgressBar startuje a jak kod się wykona to dopiero wtedy się zatrzymuje, jak to zrobić ?


Przecież w poradzie tak działa. Jak długo kod blokuje program, tak długo ProgressBar działa:

KOD cpp:     UKRYJ  
 long style = GetWindowLong(ProgressBar1->Handle, GWL_STYLE);
 style = style | PBS_MARQUEE;
 SetWindowLong(ProgressBar1->Handle, GWL_STYLE, style);

 // Rozpoczęcie odliczania
 ProgressBar1->Perform(PBM_SETMARQUEE, true, 100);

 for(int i = 0; i < 100; i++) /* kod, który się wykonuje */
 {
  ProgressBar1->Position += 1;
  Sleep(100);
  Application->ProcessMessages();
 }
 // Zakończenie odliczania
 ProgressBar1->Perform(PBM_SETMARQUEE, false, 100);


Jak widzisz funkcja ProgressBar1->Perform(PBM_SETMARQUEE, true, 100); uruchamia ProgressBar, a funkcja ProgressBar1->Perform(PBM_SETMARQUEE, false, 100); go zatrzymuje. Musisz sterować tym ręcznie, czyli tak zbudować kod, że po jego wykonaniu zostanie wywołana funkcja zatrzymująca działanie ProgressBar.

Bardziej szczegółowej odpowiedzi nie da się udzielić na Twoje pytanie, gdyż sam podałeś niewiele szczegółów.

Re: Pytanie o "Trochę inny ProgressBar"

Nowy postNapisane: czwartek, 12 maja 2011, 23:18
przez Pitek
Mimo wszystko czas działania tego ProgressBar'a zależy od liczby w warunku pętli (im większa tym dłużej). Odnoszę wrażenie że mimo Application->ProcessMessages(); aplikacja czeka aż skończy przelatywać ProgressBar a potem kursor robi się na busy i wykonuje kod, ja to mam tak :
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 long style = GetWindowLong(ProgressBar1->Handle, GWL_STYLE);
 style = style | PBS_MARQUEE;
 SetWindowLong(ProgressBar1->Handle, GWL_STYLE, style);

 // Rozpoczęcie odliczania
 ProgressBar1->Perform(PBM_SETMARQUEE, true, 100);

 for(int i = 0; i < 100; i++)
 {
  ProgressBar1->Position += 1;
  Sleep(100);
  Application->ProcessMessages();
 }

/*
kod
---
---
---
---
 */



 // Zakończenie odliczania
 ProgressBar1->Perform(PBM_SETMARQUEE, false, 100);
}
 

Chodziło by mi o to aby ProgressBar chodził w jakby w nieskończoność a jego zatrzymanie wymuszałby koniec wykonywania kodu. W tej chwili tak się nie dzieje. Mimo polecenia zatrzymującego pod koniec mojego kodu aplikacja czeka aż zostanie spełniony warunek w pętli potem chwile "pracuje" i dopiero jest efekt. Jeżeli nie dam polecenia kończącego działanie ProgressBar to on i tak się zatrzyma pod koniec warunku z pętli, więc tak jakby funkcja zatrzymująca nie działała, albo źle jej używam.

Re: Pytanie o "Trochę inny ProgressBar"

Nowy postNapisane: piątek, 13 maja 2011, 16:19
przez Cyfrowy Baron
Nie masz racji. Umieść na formularzu ProgressBar i uruchom go, ale nie dodawaj funkcja zatrzymującej. Potem po chwili kliknij na jakiś button i uruchom jakieś zadanie. Program powinien wykonywać zadanie. Jeżeli jednak użyjesz funkcji Sleep to cała aplikacja wraz z ProgressBar będzie się zatrzymywała, gdyż ta funkcja wstrzymuje aplikację.