[ legend @ 03.10.2002. 19:43 ] @
Imam sledeci problem. Radim aplikaciju i sve lepo funkcionise do samog zatvaranja aplikacije (unload). Aplikacija nestane vizuelno ali ostane rezidentna u memoriji (vidim je u task menageru). Ako startujem jos jednom
imacu i drugu instancu i tako redom. Zasto mi prosto unload sa glavne forme ne ukloni kompletnu aplikaciju? Sta moze biti uzrok tome?

Pozdrav
[ -wx- @ 03.10.2002. 20:50 ] @
Ja sam imao slican problem.. resio sam ga tako sto sam uz Unload Me na glavnoj formi dodao i Unload frmForma1, frmForma2, frmForma3... i tako za svaku formu koju imam u programu.
Ako tvoj program koristi 2 - 3 forme ovo je zgodno ali za neke vece programe ne znam kako, verovatno je neka forma iz programa jos uvek aktivna.
[ legend @ 03.10.2002. 21:42 ] @
...probacu, ali malo je nezgodno tako gasiti forme pogotovo sto ih moze bit puno, ali probacu........

[ degojs @ 04.10.2002. 05:54 ] @
Mozda bi mogao da protrcis kroz Forms kolekciju..
For i = Forms.Count - 1 To 1 Step -1
Unload Forms(i)
Next
[ gio1000 @ 04.10.2002. 13:22 ] @
Da izbrises form iz memorije jednostavno stavi u Event Unload:
Set Form = Nothing
[ Nemanja Dubravac @ 05.10.2002. 22:24 ] @
A sto jednostavno ne koristis naredbu END?
[ degojs @ 06.10.2002. 20:32 ] @
Nikad ne treba koristiti naredbu END. Ali bas nikad.
Stvara vise problema nego sto cini dobrog :)
[ Nemanja Dubravac @ 06.10.2002. 21:46 ] @
Koje probleme?
[ degojs @ 07.10.2002. 05:20 ] @
Jednostavno, resursi ne budu oslobodjeni uvek.

Sa MSDN-a:

The End statement provides a way to *force* your program to halt. For normal termination of a Visual Basic program, you should unload all forms. Your program closes as soon as there are no other programs holding references to objects created from your public class modules and no code executing

Ovo je iz original MSDN-a uz VB6 i jos pise da ce da oslobodi resurse --- nije bas tacno. Nekad hoce, ali nekad nece.

Ovo je sa nekog sajta koji mi je prvi izbacio Google:

"Remember to treat END not as "the program is done now so it can go away" but rather as "pretend the user did ctrl-alt-del and used END TASK on this process". To paraphrase the ads, just don't do it."

E sad, mozda je to ispravljeno kasnijim Service Pack-ovima. Uglavnom, u vecini knjiga o VB koje sam ja imao prilike da citam, uvek je naglaseno da ne treba koristiti END. Ako te zanima, poseti majkrosoftov news server pa pogledaj koliko je rasprave o tome u microsoft.public.vb.general.discussion. Verovatno ces biti iznenadjen koliko je napisano na tu temu.

[ sanibo @ 08.10.2002. 13:19 ] @
Da upravi si ni meni nije funcionisala END naredba, nego samo Unload Me, i to u Event-u kad je izbrises sigurno radi bar meni.
pozdrav
[ boki @ 08.12.2002. 15:32 ] @
i kad kliknes na X to je kao END (nema mogucnosot za "fino unloadovanje".
ja ga uvek endujem.
[ degojs @ 09.12.2002. 04:44 ] @
Netacno boki.
Npr. Form_QueryUnload (naglasak na ono UNLOAD!!!) se 'opali' kad kliknes na X ...

[ Nensi @ 09.12.2002. 18:44 ] @
unload me
set imeforme = nothing
exit sub
[ jc denton @ 10.12.2002. 01:25 ] @
Ovo posle

unload me

ne bi trebalo ni da se izvrsi.
[ lupco_1959 @ 02.05.2009. 23:26 ] @
Da se nadovezem na temu.
Kad hocu iz jedne forme da otvorim drugu i onda da zatvorim prvu ja napisem ovako:
Code:
Unload Me
Form2.Show

i javla mi se greska da nemogu da otvorim drugu formu jer je vec unloadovana.
Gde gresim?

[Ovu poruku je menjao Aleksandar Vasic dana 03.05.2009. u 00:51 GMT+1]
[ stefanpn @ 03.05.2009. 09:59 ] @
Grešiš, jer prilikom podizanja te forme (Form2) u Sub Form_Load imaš naredbu "Unload Me".

Code:

Private Sub Form_Load()
    
    Unload Me
    
End Sub


Prilikom pozivanja funkcije Form2.Show, se Forma From2 prvo učitava u memoriju, ukoliko nije ranije učitana, pa zatim prikazuje.

Učitavanje forme ti pokreće event "Form_Load", pa zatim prikazuje formu, ali s' obzirom da ti tu formu "Unload"-uješ pre nego što je on prikaže, onda ti javi grešku.
[ Nevena79 @ 13.05.2009. 12:28 ] @
Samo obrni redosled operacija jer ovo sto si napisao nema logike

Unload Me
Form2.Show
prvom linijom gasis aktivnu formu i kada se ugasi vise se nista u njoj ne izvrsava pa ni komanda form2.show

zato napisi

Form2.Show
Unload Me
...
... i radice...

P.S. ne znam teoriju ali imam gomilu programa iza sebe i nikada nisam imala problema sa END. Za mene je to samo jedna cool komanda :)
[ stefanpn @ 13.05.2009. 14:26 ] @
Nema potrebe da okreće redosled komandi, jer se i posle naredbe Form_Unload nastavlja sa izvršavanjem komandi iz tog Sub-a.

Problem je nastao u tome što on Form2, Unload-uje na Form_Load eventu, pre nego što je prikaže.


A ovo što se tiče naredbe End, da se posle izvršavanje te naredbe ne oslobađaju svi resursi zauzeti od strane programa je totalno nebulozna izjava.
[ dzigilibonglica @ 21.05.2009. 09:43 ] @
Pazi nema smisla gasiti sve forme jer neke nisu ni aktivne.


Uvek sa prelaza sa forme na formu treba raditi unload forme, ali nekada se forma sama load-uje:

Primer

Form1=neaktivan
Form2=aktivan



Form2_Load()
image1.Picture=Form1.Image1.Picture
end sub


E sada kako svi mi ubacujemo razne slike ne bi li nasa mala softverska remek dela lepo izgledala, a da exe ne bi bio preveliki,
ili cuvali slike u spoljnim fajlovima, cesto se radi povezivanje na neku kontrolu u nekoj drugoj formi...jel da?


e sada:
ova forma2 je u svom load-u, loadovala i formu1 jer joj je trebala slika iz nje.


Ima jos primera kada se desi load neke druge forme... ali ovo je najcesce.

E sada kada kliknes na neko dugme za izlaz na svom programu, a VB editor ti ne pokazuje Play(run) dugme, znaci da je nesto jos aktivno od formi.

Onda pritisnes II(pauzu) pa F8 i nadjes koja ti je forma aktivna.

Ne treba koristiti end, jer kada se sve regularno Unloaduje, isprazne se svi resursi po PS-u, a kada se END-uje ostanu repovi u memoriji.

Pozdrav!


[ stefanpn @ 21.05.2009. 11:18 ] @
Citat:
dzigilibonglica

E sada kako svi mi ubacujemo razne slike ne bi li nasa mala softverska remek dela lepo izgledala, a da exe ne bi bio preveliki,
ili cuvali slike u spoljnim fajlovima, cesto se radi povezivanje na neku kontrolu u nekoj drugoj formi...jel da?



Ne!

Ne bitno je koja je forma kontejner za sliku, veličina izvršne datoteke će biti ista.


Citat:
dzigilibonglica:

Ne treba koristiti end, jer kada se sve regularno Unloaduje, isprazne se svi resursi po PS-u, a kada se END-uje ostanu repovi u memoriji.



Zanima me odakle ti ovaj zaključak!?

Pri pozivanju f-je END, skače se na "kraj" programa. Po prekidu izvršavanja procesa, svi resursi koji je taj proces koristio se oslobađaju.
[ dzigilibonglica @ 26.05.2009. 11:50 ] @
@stefanpn:


Ne znam bas da koristim citate, pa cu ovako narativno da odgovorim na tvoje postove (uz duzno postovanje, i bez uvreda):

1) Prvo nisi me dobro razumeo. Pokusaj da shvatis sta sam pokusao da kazem. Tacno je da nije bitno na kojoj je formi kontejner za sliku, velicina fajla je ista, ali kada bi:

Na form1
i na form2 uradili nesto ovako:

na nekoj kontroli Picture1 ili Image1 na obe forme, property Picture iz "Design time" odnbosno iz toolbox-a podesili na neki JPG ili BMP....i slicno, onda bi iskompajlirani EXE bio veci (pod uslovom da se property popunjava u Design time, a ne u toku izvrsavanja programa preko nekog spoljnog resursa-slike u RunTime), pa zato mnogi (a ja skoro uvek) popakujem sve to u jednu formu, a u drugu kojoj treba ista ta slika za neku kontrolu ili samu formu, stavim prazne kotrole bez prethodno ucitane vrednosti za svojstvo Picture (vidimo samo isprekidan pravougaonik(imagebox) ili praznu kontrolu(picturebox) ili transparentnu formu(ako slika sluzi za pozadinu forme), pa u toku izvrsavanja iz kod-a podesim da se popuni iz neke druge forme.

U suprotnom kada bi jednu sliku ucitali u vise formi u vreme pakovanja kontrola/design time, tada se exe uvecava za svaki put kada u toku dizajniranja popunimo property picture, za onoliko koliko je velicina slike u fajl sistemu (u slucaju BMP fajla, ili za ekvivalentnu velicinu drugog fajla kada bi se prekonvertovao u BMP). Ne znam da li sam dovoljno NeZbunjujuce objasnio....


Znaci :

Form1,
Form2 imaju svaki PictureBox kontrolu.

Scenario 1:

U obe forme podesimo PictureBox.Picture=App.Path & "\NekaSlika.bmp" u toku dizajniranja preko ...(browse dugmenceta)
Rezultat=>Veci exe

Scenario 2:

U form1 podesimo PictureBox.Picture=App.Path & "\NekaSlika.bmp", dok u form2 ne podesimo, ostavimo praznu kontrolu PictureBox,pa u Form_Load ubacimo sledece:

PictureBox.Picture=Form1.PictureBox.Picture.
Rezultat=>manji exe

2) Dobro si rekao da END skace na kraj programa.

Vidis, Service packovi za VB su izmedju ostalog ispravljali i taj bug, jer bi trebalo da bude tako kada uradis END, da se isprazne svi resursi, ali nije tako. Ispravljali su to, ali tek pojavom Win2000, pa posle WinXP-a, taj problem je nestao... , odnosno sistem je preuzeo punu kontrolu nad memorijom, pa nestankom nekog programa iz aktivnih procesa oslobodi sve sto je taj program bio zauzeo.

Znaci u tom slucaju je tacno to sto ti kazes da END isprazni i resurse, ali ne daj Boze da je WinME ili Win 95/98.., onda dolazi do curenja memorije
(Provereno!)

E sada, ko zna na kakvom ce se sistemu kotrljati program koji se pise... XP-nema problema, WinMe i pre njega -Ima problema.

E sada, posto znam za mnogo nelogicnosti koje u VB-u postoje, ako zelite, ajde da otvorimo neku temu koji su problemi kod VB koji ne bi trebali da postoje i ako je verovati Microsoft-u, ne postoje.... ali ipak postoje....

Ja sam uvek za.

Primer(listbox posle 15000 hiljada zapisa vraca list1.listindex=Nenormalna vrednost ili

F8 iz reda u red (dubugovanje):

if 1<3 then
a=true
else
a=false
endif

pa vrati false....

Ali odoh ja puno u offtopic.....

Sorry moderatori.



[ stefanpn @ 26.05.2009. 13:42 ] @
Stavljanje svih resursa na jednu formu je nepotrebno zauzimanje memorije. Zašto bi sve resurse držao u memoriji, kad možeš da imaš samo potrebne resurse. Kada ti zatreba jedan resurs sa te forme, ti moraš učitati celu formu sa svim resursima.

Tvoj "Scenario" I i II će ti prijaviti Type mismatch grešku. PictureBox.Picture property je long tipa (pokazivač na sliku) a ne string.

End - ne skače bukvalno na "kraj programa" već poziva ExitProcess/TerminateProcess iz kernela.

Problemi mogu da nastanu ukoliko pre izlazka iz programa nisu prekinute konekcije ka bazama ili je neki API poziv u izvršenju (ali to samo pri pokretanju iz IDE-a, ne i u Runtime-u), i to može doći do "pucanja" samog IDE-a, ništa više.

Ovo će ti vratiti False, ono sigurno neće:
Code:


    Dim a As Boolean

    If 1 < 3 Then
        a = True
    Else
        a = False
    End If

    a = Not a     ' <---------- Vrlo bitna stavka :)


Ili to postoji bug u nekoj tako elementarnoj stvari kao što je If-Then-Else grananje!?

Da ne raspravljamo o tome da listbox kontrola vraća "nenormalne" vrednosti, isprobaj:
Code:

Private Sub Form_Load()
    
    Dim t As Integer

    For t = 0 To 15099
       
       List1.AddItem CStr(t)
       
    Next t
    
End Sub

Private Sub List1_Click()
    
    MsgBox CStr(List1.ListIndex)
    
End Sub


Da li su ti "bug"-ovi dokumentovani negde, ako jesu, voleo bih to da vidim. Ali ne iz nekih š32dž8 izvora nego od strane MS-a ili nekog validnog izvora.
[ dzigilibonglica @ 01.06.2009. 10:15 ] @
Bio sam malo odsutan neko vreme, ali evo da ne bi ja razglabao i dokazivao se da je to tako i nije tako, otpakujte ovaj rar, pa probajte....




Citat:
stefanpn:
Tvoj "Scenario" I i II će ti prijaviti Type mismatch grešku. PictureBox.Picture property je long tipa (pokazivač na sliku) a ne string.


Primer2 i Primer3, Pogledaj, stvarno radi. kakav mismatch?! Pokretabilan program 100%.
Inace kada se postavi slika u svaku formu pa se napravi exe, on po pokretanju programa se ceo ucita u mem.

Al ajde.

Moja greska kod liste-Preko 30k pravi probleme sa ListIndex (Primer1 u raru), a ne 15K

A bagovi....
Bagova ima i to poodosta.

Ako hocemo da ih dokumentujemo, ajde da lepo postavimo temu.
Ne skupljam ja to sa nekih "izvora", vec kroz rad se otkriju neke stvari, a nekada ih nazalost!, otkrije klijent....

Zbog toga bi bilo dobro da pokrenemo temu da ih sami otkrivamo a ne klijenti
Toliko o tome







[ stefanpn @ 01.06.2009. 12:33 ] @
Lepo ti otvori Object Browser (Pritiskom na F2, u VB IDE-u), upiši "listbox" i klikni na Find. Odaberi property "listindex" i pogledaj koji je to tip promenljive.

U VB6 se opseg vrednosti za promenljive tipa Integer (Signed 16-bitni broj) kreće od -32768 do 32767, e sad pošto je u samoj kontroli to Unsigned Integer on ima opseg od 0 do 65535, pa se umesto da broji preko 32767, Sign bit postavlja na 1 i on počinje da daje broji u nazad (-1 - težina ostalih 15 bitova).

Ali to nije bug, jer je ta kontrola dokumentovana, i u dokumentaciji piše da su:

Listbox.ListCount Integer
Listbox.List(Integer)
Listbox.ListIndex Integer

Ne znam šta si očekivao!?




Ovo sa ovim slikama ne vredi ni raspravljati, izvršna datoteka će biti najmanje dužine ako pri učitavanju svake forme i slika učita sa diska.
Ako se radi po tvojoj logici, pri prvom učitavanju slike iz frmSlike, ta forma će se učitati i ostati load-ovana u memoriji - bez potrebe. Što znači da ovakav rad nije najoptimalniji.

Koristi:

Code:


Private Sub Form_Load()

    Image1.Picture = LoadPicture(App.Path & "\Slika.Bmp")

End Sub



A što će biti ako nema ove "sledeće linije", već umesto nje stavim END:

Code:

Private Sub Form_Unload(Cancel As Integer)
'NAPOMENA: frmSlike se sam load-ovao jer se linkuju ostale forme na njega da uzmu sliku:
'          ako nema ove sledece linije da ugasi frmSlike nece se zavrsiti program. Probajte da je izbrisete i pokrenite
    End
End Sub




Edit: Greška pri kucanju ispravljena.



[Ovu poruku je menjao stefanpn dana 01.06.2009. u 19:31 GMT+1]
[ dzigilibonglica @ 01.06.2009. 13:54 ] @
Probacu da ubacim End pa cu videti.

Naravno na XP-u.... :)

A zasto stavim u formu? Pa moram, nekada jednostavno napisem nesto sto daam da se slobodno distribuira netom, pa ne bih da mi neki tamo klinavc od 10 godina menja logo (tipa: GenijalSoft)

Ali sve ovo je zbog jedne cinjenice, coveku se nije prekinuo prog kada je trebao.

Ako koristi princip sa slikama kao ja, to je mogao da bude jedan razlog, ako je koristio end, na starijim Winovima ne radi kako treba jer stariji winovi ne upravljaju memorijom kao ovi noviji.

Vidis, nikada mi nije palo na pamet da gledam property ListBox kontrole......

Moja greska

Pozdrav!


[ pura moca @ 17.11.2009. 17:47 ] @
dim frm as form
for each frm in forms
unload frm
next