» »

[Delphi] Progress bar

[Delphi] Progress bar

civava23 ::

V Delphiju imam preprost programček ki mi z klikom na gumbe odpira posamezne .exe fajle (albume).
Ker so precej veliki ( lahko se iz počasnega CD odpirajo tudi do 40 sec), bi rad kliku dodal kodo za progres bar, ki bi kazala koliko časa se bo fajl še nalagal ( lahko tudi kot timer za 40 sec).

Obstoječa koda za zagon zgleda takole :

procedure TForm1.FormCreate(Sender: TObject);

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'Album.exe',nil,nil,SW_SHOWNORMAL);
end;

Ali je kdo tako prijazen in bi mi dodal del kode, ki manjka za progress bar ?

Hvala.
  • spremenilo: snow ()

WarpedGone ::

Hmmm, ti maš dva problema.

Progress bar sam je precej enostavn. Vžeš na formo komponento in en timer. V timerju določiš da se izvede recimo vsako sekundo in poveča position progressbara. V tej tvoji funkciji pa le štartaš timer.

Kar je problem je ugotovit, kdaj ta timer ugasnit, da bo nehal šlatat progress bar in, delno povezano, kakšno maksimalno mejo naštelat na progressbar. Pri meji lahk mal stisneš zobe in rečeš več kot minuto ne sme trajat in nastaviš Max na progresbaru na recimo 60. Če timer pogrunta da je že splezal do 60 lahk takrat to mejo dvigne za nadaljnih 30, recimo. To bi se dalo speljat.

Bol zanimivo je, kako boš ti v svojem programu ugotovu, kdaj se je zagnani exe 'nehal zaganjat in da že laufa'. Če bi ta zunanji exe ob svojem zagonu naredu kakšno značilno stvar, bi lahk ti pač čakal,da se to zgodi, brez tega si pa mrzu. ShellExecute zna stvar pognat 'asinhrono', se pravi štarta exe in dela po svoje naprej ter se za sam exe ne sekira. Al pa sinhrono, kar pomeni da ga štarta in čaka da se njegovo izvajanje konča. Med tem čakanjem je tvoj program blokiran.

Če maš kodo teh 'exejev' ki jih štartaš, bi lahk vanje vgradil, da takoj ob zagonu postavjo kak semafor, al pa nardijo kak filet al pa neki v tem stilu. V 'glavnem' programu bi pol lahk čakal da se to zgodi in ko bi se to zgodilo, bi nehal poganjat progressbar. Tko maš pa problem, ki ga lahk rešiš le na kak zelo kreativen/čuden način. Recimo da zajemaš zaslonsko sliko pognanena programa in čakaš da se na določeni koordinati prikaže kak pričakovan vzorec. Tut to smo že počel :)
Zbogom in hvala za vse ribe

LoneWolf ::

Tole zgoraj je super demonstracija, kako se ne dela napol resnega softwarea.

S progress bari nimas kaj ugibat cez prst. Ce dajes uporabniku informacijo, koliko casa bo neka stvar trajala, potem bodi precizen. Ce te informacije nimas, pokazes da se stvar izvaja in bo koncana, ko bo pac koncana. Ne lazes uporabniku v ksiht. Progress bar pozna nedeterministicen nacin, kjer nimas min in max vrednosti, ampak samo nakazujes delovanje - ponavadi blok crtic v progress baru potuje z leve na desno in ponavlja. Tudi obvestilo v stilu "Zaganjam program, pocakaj..." bo cisto v redu, kaj vec itak ne mores povedat.

Bol zanimivo je, kako boš ti v svojem programu ugotovu, kdaj se je zagnani exe 'nehal zaganjat in da že laufa'.

ShellExecute se vedno vrne, ko je bil ciljni program ali uspesno zagnan in dobis nazaj njegov handle, ali pa je pri tem prislo do napake. V vsakem primeru takrat ni vec potrebe za progress barom. To velja za zaganjanje exe-ja in vsega, kar pase zraven, kar se tice sistema. Ce program po zagonu naprej se sam kaj daljsega packa, je to njegov problem - verjetno ima takrat tudi svoj progress bar.

Če maš kodo teh 'exejev' ki jih štartaš, bi lahk vanje vgradil, da takoj ob zagonu postavjo kak semafor, al pa nardijo kak filet al pa neki v tem stilu. V 'glavnem' programu bi pol lahk čakal da se to zgodi in ko bi se to zgodilo, bi nehal poganjat progressbar. Tko maš pa problem, ki ga lahk rešiš le na kak zelo kreativen/čuden način. Recimo da zajemaš zaslonsko sliko pognanena programa in čakaš da se na določeni koordinati prikaže kak pričakovan vzorec.

Taksne "resitve" mi obracajo zelodec, resno. "Kreativnost" ni beseda, ki mi tule pride na misel. Taksni pristopi imajo toliko moznosti, da pripeljejo v tezave, da glava pece. Nobene potrebe ni za taksnimi mahinacijami, Windows ponuja dovolj standardnih moznosti za komunikacijo med procesi, znajdes pa se lahko tudi na kak legitimen nacin, ki ne potrebuje posegov v druge programe zaradi banalnih stvari.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# Pomoč

Oddelek: Programiranje
131402 (1227) jizzer
»

[JAVA] Nujno potrebujem pomoč!

Oddelek: Programiranje
51381 (1175) Villain
»

Delphi - kako prepreči prečiti več zaporednih klikov gumba

Oddelek: Programiranje
51134 (1057) LoneWolf
»

VB6 - ne zaključi proces programa - pomoč !!!

Oddelek: Programiranje
131392 (1233) Mavrik
»

Visual basic Progress bar

Oddelek: Programiranje
51562 (1495) Lunik

Več podobnih tem