/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
End - Slukker ikke mit program !?
Fra : Lasse Madsen


Dato : 09-04-05 18:19

Hej !

Jeg har et problem med en af mine VB programmer...

Strukturen i programmet er sådan at programmet startes i en splash screen
hvorefter denne loader:

Splash => Frmlogin + Frmmain

Hvis jeg så trykker på "Krydset" i øverste højre hjørne af "Frmlogin"
programmet forsvinder vinduet også ... men programmet kører stadig når jeg
trykker CTRL+ALT+DEL

jeg har også prøvet at lave en knap i "frmlogin" vinduet med koden

' knap kode
end

dette giver samme resultet ...

jeg har også prøvet følgende i knappens kode:

unload frmmain
end

også uden held ... hvordan #"%" lukker jeg mit program !?

m.v.h
Lasse Madsen



 
 
Neo (09-04-2005)
Kommentar
Fra : Neo


Dato : 09-04-05 18:20

> også uden held ... hvordan #"%" lukker jeg mit program !?
>
> m.v.h
> Lasse Madsen

Hej Lasse

Du skal bruge form_queryunload

noget a'la sådan her:

Brug denne ved "total nedluk" af dit program

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim f As Form
For Each f In Forms
Unload f
Next
End Sub

Brug denne ved nedluk af en enkelt form

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
unload me
End Sub

Ifølge hvad jeg har læst mig til her i gruppen bør du aldrig bruge
kommandoen "end" da denne ikke frigiver den hukommelse dit program måtte
have brugt.

Håber at du kan bruge mit svar !

Mvh Neo



Agner (10-04-2005)
Kommentar
Fra : Agner


Dato : 10-04-05 11:22


"Neo" <neo___dk@hotmail.removethis.com> skrev i en meddelelse
news:42581066$0$183$edfadb0f@dtext02.news.tele.dk...
>> også uden held ... hvordan #"%" lukker jeg mit program !?
>>
>> m.v.h
>> Lasse Madsen
>
> Hej Lasse
>
> Du skal bruge form_queryunload
>
> noget a'la sådan her:
>
> Brug denne ved "total nedluk" af dit program
>
> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
> Dim f As Form
> For Each f In Forms
> Unload f
> Next
> End Sub
>
> Brug denne ved nedluk af en enkelt form
>
> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
> unload me
> End Sub
>
> Ifølge hvad jeg har læst mig til her i gruppen bør du aldrig bruge
> kommandoen "end" da denne ikke frigiver den hukommelse dit program måtte
> have brugt.
>
> Håber at du kan bruge mit svar !
>
> Mvh Neo


Skal du ikke ha en If...Then sætning sat ind i For Each.
- Du forsøger jo at lukke Me formen ned 2 gange én gang i loop'en
og én gang i QueryUnload Sub ?

Agner



Agner (10-04-2005)
Kommentar
Fra : Agner


Dato : 10-04-05 16:03

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim f As Form
For Each f In Forms
If f <> Me Then Unload f
Next
End Sub



Neo (10-04-2005)
Kommentar
Fra : Neo


Dato : 10-04-05 17:02


"Agner" <agner@ingenmail.com> skrev i en meddelelse
news:42594021$0$757$edfadb0f@dread16.news.tele.dk...
> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
> Dim f As Form
> For Each f In Forms
> If f <> Me Then Unload f
> Next
> End Sub

Tjaa det ved jeg skisme ikke ... jeg tror at jeg vil lade spørgsmålet stå
åbent og håbe at Tomas kan besvare spørgsmålet.

Men som jeg umiddelbart læser din snip så får man vel ikke unloaded 'me' med
din snip .. ? og det er vel meningen at alle forme lukkes ned også 'me'.

Jeg tror også at jeg er 'ligeglad' med hvor mange gange jeg lukker 'me' ned
(ref. dit tidligere indlæg) ... den kan vel kun lukkes ned en gang

det jeg gerne vil opnå med min snip er at alle forme, incl. 'me' bliver
lukket ... men jeg er da egentligt i tvivl pludselig hvorvidt 'me' bliver
lukket ned før andre forme, og derved efterlader noget i hukommelsen.

Mvh Neo




Agner (10-04-2005)
Kommentar
Fra : Agner


Dato : 10-04-05 18:50


"Neo" <neo___dk@hotmail.removethis.com> skrev i en meddelelse
news:42594f85$0$168$edfadb0f@dtext02.news.tele.dk...
>
> "Agner" <agner@ingenmail.com> skrev i en meddelelse
> news:42594021$0$757$edfadb0f@dread16.news.tele.dk...
>> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
>> Dim f As Form
>> For Each f In Forms
>> If f <> Me Then Unload f
>> Next
>> End Sub
>
> Tjaa det ved jeg skisme ikke ... jeg tror at jeg vil lade spørgsmålet stå
> åbent og håbe at Tomas kan besvare spørgsmålet.
>
> Men som jeg umiddelbart læser din snip så får man vel ikke unloaded 'me'
> med
> din snip .. ? og det er vel meningen at alle forme lukkes ned også 'me'.
>
> Jeg tror også at jeg er 'ligeglad' med hvor mange gange jeg lukker 'me'
> ned
> (ref. dit tidligere indlæg) ... den kan vel kun lukkes ned en gang
>
> det jeg gerne vil opnå med min snip er at alle forme, incl. 'me' bliver
> lukket ... men jeg er da egentligt i tvivl pludselig hvorvidt 'me' bliver
> lukket ned før andre forme, og derved efterlader noget i hukommelsen.
>
> Mvh Neo

Hi Neo
Det skulle ha været som nedenfor - det er så en anden ting.
Nu er det sådan at QueryUnload er til for at kunne fortryde
at unloade formen, hvis en betingelse er til det. Man kan cancel
unload ved at sætte Cancel en eller anden værdi forskellig fra 0.
Også Cancel = True kan bruges
Men for ikke at ødelægge den mulighed skal formen jo ikke
unloades i loop'en.

hilsen agner

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim f As Form
If test = 2 Then Cancel = 1 ' if test=2 bliver unload canceled
For Each f In Forms
If f.Name <> Me.Name Then Unload f
Next
End Sub



Tomas Christiansen (10-04-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 10-04-05 20:48

Agner skrev:
> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
> Dim f As Form
> For Each f In Forms
> If f <> Me Then Unload f
> Next
> End Sub

UPS: Du har vist ikke afprøvet koden!

Man sammenligner ikke objekter med de almindelige sammenligningsoperatorer
=, <, > og <>, men bruger i stedet Is operatoren.

-------
Tomas

Agner (11-04-2005)
Kommentar
Fra : Agner


Dato : 11-04-05 10:53

> Man sammenligner ikke objekter med de almindelige sammenligningsoperatorer
> =, <, > og <>, men bruger i stedet Is operatoren.
>
> -------
> Tomas

Det er jeg hel enig i Tomas
Men det blev jo rettet af mig 1 time før dit svar
Så alternative kan man jo skrive:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim f As Form
For Each f In Forms
If Not f Is Me Then Unload f
' eller
' If f.Name <> Me.Name Then Unload f
Next
End Sub

Men der er ingen grund til at unloade Me (den active form), når
det sker via QueryUnload.




Tomas Christiansen (11-04-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 11-04-05 20:37

Agner skrev:
> Men det blev jo rettet af mig 1 time før dit svar

Jeg ved ikke helt hvad du mener med at "det blev rettet". Jeg kan kun se
indlæg fra dig, hvor det står forkert. Ønsker man at "rette" i et indlæg,
må man slette det oprindelige og sende et nyt. Går der for lang tid, kan
indlægget være replikeret til andre servere, og så ved jeg ikke om
tilbagekaldelse er mulig.

> Så alternative kan man jo skrive:
>
> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
> Dim f As Form
> For Each f In Forms
> If Not f Is Me Then Unload f
> ' eller
> ' If f.Name <> Me.Name Then Unload f
> Next
> End Sub

Et test på et objekts navn er ikke det samme som en test på om der er
tale om samme instans af objektet. Man kan have flere instanser af
objekter med samme navn.

> Men der er ingen grund til at unloade Me (den active form), når
> det sker via QueryUnload.

Nej, det har du så ganske ret i. Jeg har lige testet det, og det gør
ingen forskel om man atter forsøger at lukke den form som lukker de
øvrige forms. I samme omgang blev jeg lidt overrasket over rækkefølgen de
enkelte event-procedurer bliver afviklet.

Eksempel (Form1 har først loadet og unloader her Form2 og Form3):
Form_QueryUnload Form1
Form_QueryUnload Form2
Form_Unload Form2
Form_QueryUnload Form3
Form_Unload Form3
Form_Unload Form1

-------
Tomas

Agner (12-04-2005)
Kommentar
Fra : Agner


Dato : 12-04-05 03:17


"Tomas Christiansen" <toc-01-nospam-removethisword@blikroer.dk> skrev i en
meddelelse news:Xns9635DBE7560A4tomascdenmark@212.242.40.170...
> Agner skrev:
>> Men det blev jo rettet af mig 1 time før dit svar
>
> Jeg ved ikke helt hvad du mener med at "det blev rettet". Jeg kan kun se
> indlæg fra dig, hvor det står forkert. Ønsker man at "rette" i et indlæg,
> må man slette det oprindelige og sende et nyt. Går der for lang tid, kan
> indlægget være replikeret til andre servere, og så ved jeg ikke om
> tilbagekaldelse er mulig.

Du er sateme en arrogant og bedrevidende ung mand !!!.

>> Så alternative kan man jo skrive:
>>
>> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
>> Dim f As Form
>> For Each f In Forms
>> If Not f Is Me Then Unload f
>> ' eller
>> ' If f.Name <> Me.Name Then Unload f
>> Next
>> End Sub

> Et test på et objekts navn er ikke det samme som en test på om der er
Det hedder: En test
> tale om samme instans af objektet. Man kan have flere instanser af
< objekter med samme navn.

Du snakker til os, som vi er rene idioter. Det er vi sikkert alle
sammen efter din mening. -Jeg er da ihvertfald, mener jeg at forstå.
Denne her thread handler ikke om object-instandser. Når du umotiveret
bringer det på bane her, forstår jeg det sådan at årsagen må være, at du
har et naivt behov for at demonstrere din viden over for vi andre.

Sålænge du kan finde på at omtale -som du har gjort i denne thread -
at det i sjældne tilfælde er akseptabelt at unloade med 'End', så har
du altså en mindre viden end du selv har fået opfattelsen a.
'End' må aldrig bruges !.


> Nej, det har du så ganske ret i. Jeg har lige testet det, og det gør
> ingen forskel om man atter forsøger at lukke den form som lukker de
> øvrige forms. I samme omgang blev jeg lidt overrasket over rækkefølgen de
> enkelte event-procedurer bliver afviklet.
>
> Eksempel (Form1 har først loadet og unloader her Form2 og Form3):
> Form_QueryUnload Form1
> Form_QueryUnload Form2
> Form_Unload Form2
> Form_QueryUnload Form3
> Form_Unload Form3
> Form_Unload Form1
>
> -------
> Tomas

Når du selv kommer til at lave fejl i din postering -og det
vil du vil du gøre før eller siden -det gør selv experter. Så
vil du bryde dig om, hvis vi andre skriver til dig på *din* facon.

agner




Tomas Christiansen (12-04-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 12-04-05 20:54

Agner skrev:
> Du er sateme en arrogant og bedrevidende ung mand !!!.

Måske nok... men det kastede ikke lys over om det var dig, som havde
gjort noget forkert, news-serverne som ikke kunne finde ud af det eller
om det er min news-reader som ikke kan finde ud af det (har for nylig
skiftet Outlook Express ud med Xnews, og kan derfor ikke vide mig sikker
mht. om den skulle opføre sig forkert ved slettede+gensendte indlæg).

> Du snakker til os, som vi er rene idioter. Det er vi sikkert alle
> sammen efter din mening. -Jeg er da ihvertfald, mener jeg at forstå.
> Denne her thread handler ikke om object-instandser. Når du umotiveret
> bringer det på bane her, forstår jeg det sådan at årsagen må være, at
> du har et naivt behov for at demonstrere din viden over for vi andre.

Hvorfor tror du ikke at en form er et objekt? Den opfører da sig ellers
på alle måder som et objekt, og der er vel ingen grund til at behandle
forms specielt på de områder hvor de opfører sig som andre mulig andre
objekter.

Hvis nu du i Form1 lægger en CommandButton og følgende kode:

Private Sub Command1_Click()
Dim a As Form2
Dim b As Form2
Set a = New Form2
a.Show
Set b = New Form2
b.Show
End Sub

Tilsvarende lægger du i Form2 en CommandButton og følgende kode:

Private Sub Command1_Click()
Dim f As Form
For Each f In Forms
Debug.Print f.Name, f Is Me, f.Name = Me.Name
Next
End Sub

Så vil du - efter at have klikket på Form1.Command1 - kunne klikke på
Form2.Command1 og i det helt uundværlige Immediate Window kunne observere
at der er forskel på 'f Is Me' og 'f.Name = Me.Name'.

Jeg er godt klar over at i visse specialtilfælde kan det gå an at bruge
'f.Name = Me.Name', men når man anbefaler den slags, så bør man samtidig
gøre opmærksom på begrænsningerne og derved kunne potentielt mange timer
med senere debugging af kode. Derudover kan jeg slet ikke se fordelen ved
den metode, men det er så en helt anden sag.

> Sålænge du kan finde på at omtale -som du har gjort i denne thread -
> at det i sjældne tilfælde er akseptabelt at unloade med 'End', så har
> du altså en mindre viden end du selv har fået opfattelsen a.
> 'End' må aldrig bruges !.

Prøv nu at holde sig til sagligheden. Brugen af End i produktionskode 1.
gang bør efter min mening udløse en advarsel og 2. gang en fyring (hvor
_er_ jeg selv saglig, hva'?)

Når man sidder og udvikler, er der derimod ikke megen forskel på Ctrl-
Break i VB's IDE og brugen af End i koden, og du vil vel ikke være så
hellig at påstå at Ctrl-Break har du aldrig brugt?

> Når du selv kommer til at lave fejl i din postering -og det
> vil du vil du gøre før eller siden -det gør selv experter. Så
> vil du bryde dig om, hvis vi andre skriver til dig på *din* facon.

Hvis du googler lidt omkring vil du sikkert kunne finde flere hundrede
indlæg fra min hånd, og hvis antallet af indlæg uden fejl ligger bare
under 30-40% så er jeg _virkelig_ glad

-------
Tomas

Agner (13-04-2005)
Kommentar
Fra : Agner


Dato : 13-04-05 06:39


"Tomas Christiansen" <toc-01-nospam-removethisword@blikroer.dk> skrev i en
meddelelse news:Xns9636DEAF879B4tomascdenmark@212.242.40.170...
> Agner skrev:
>> Du er sateme en arrogant og bedrevidende ung mand !!!.
>
> Måske nok... men det kastede ikke lys over om det var dig, som havde
> gjort noget forkert, news-serverne som ikke kunne finde ud af det eller
> om det er min news-reader som ikke kan finde ud af det (har for nylig
> skiftet Outlook Express ud med Xnews, og kan derfor ikke vide mig sikker
> mht. om den skulle opføre sig forkert ved slettede+gensendte indlæg).
>
>> Du snakker til os, som vi er rene idioter. Det er vi sikkert alle
>> sammen efter din mening. -Jeg er da ihvertfald, mener jeg at forstå.
>> Denne her thread handler ikke om object-instandser. Når du umotiveret
>> bringer det på bane her, forstår jeg det sådan at årsagen må være, at
>> du har et naivt behov for at demonstrere din viden over for vi andre.
>
> Hvorfor tror du ikke at en form er et objekt? Den opfører da sig ellers
> på alle måder som et objekt, og der er vel ingen grund til at behandle
> forms specielt på de områder hvor de opfører sig som andre mulig andre
> objekter.
>
> Hvis nu du i Form1 lægger en CommandButton og følgende kode:
>
> Private Sub Command1_Click()
> Dim a As Form2
> Dim b As Form2
> Set a = New Form2
> a.Show
> Set b = New Form2
> b.Show
> End Sub
>
> Tilsvarende lægger du i Form2 en CommandButton og følgende kode:
>
> Private Sub Command1_Click()
> Dim f As Form
> For Each f In Forms
> Debug.Print f.Name, f Is Me, f.Name = Me.Name
> Next
> End Sub
>
> Så vil du - efter at have klikket på Form1.Command1 - kunne klikke på
> Form2.Command1 og i det helt uundværlige Immediate Window kunne observere
> at der er forskel på 'f Is Me' og 'f.Name = Me.Name'.

For at komme til at provokere, så opfinder du ligefrem noget, som hverken
jeg eller
andre her har sagt.

>> Her er noget af dig fra en anden thread:

>> Prøv med copy-paste, hvis dine fingre ikke rigitg vil du som vil
>> Jeg har brugt dobbelt-anførselstegn i mere end 20 år (ikke kun i VB,
>> selvfølgelig) og det har virket fint.
>> -------
>> Tomas

-Du er simpelthen syg i dit hovedet Tomas !!!.
Og hvis du er så gammel, som du gir udtryk for, så er det så
meget værre fat med dig. For den psykisk-defekt du svarer os
med plejer at bedre sig med alderen.

agner


> Jeg er godt klar over at i visse specialtilfælde kan det gå an at bruge
> 'f.Name = Me.Name', men når man anbefaler den slags, så bør man samtidig
> gøre opmærksom på begrænsningerne og derved kunne potentielt mange timer
> med senere debugging af kode. Derudover kan jeg slet ikke se fordelen ved
> den metode, men det er så en helt anden sag.
>
>> Sålænge du kan finde på at omtale -som du har gjort i denne thread -
>> at det i sjældne tilfælde er akseptabelt at unloade med 'End', så har
>> du altså en mindre viden end du selv har fået opfattelsen a.
>> 'End' må aldrig bruges !.
>
> Prøv nu at holde sig til sagligheden. Brugen af End i produktionskode 1.
> gang bør efter min mening udløse en advarsel og 2. gang en fyring (hvor
> _er_ jeg selv saglig, hva'?)
>
> Når man sidder og udvikler, er der derimod ikke megen forskel på Ctrl-
> Break i VB's IDE og brugen af End i koden, og du vil vel ikke være så
> hellig at påstå at Ctrl-Break har du aldrig brugt?
>
>> Når du selv kommer til at lave fejl i din postering -og det
>> vil du vil du gøre før eller siden -det gør selv experter. Så
>> vil du bryde dig om, hvis vi andre skriver til dig på *din* facon.
>
> Hvis du googler lidt omkring vil du sikkert kunne finde flere hundrede
> indlæg fra min hånd, og hvis antallet af indlæg uden fejl ligger bare
> under 30-40% så er jeg _virkelig_ glad
>
> -------
> Tomas



Agner (11-04-2005)
Kommentar
Fra : Agner


Dato : 11-04-05 06:53

Hej Tomas
Jeg rettede mit indlæg 1 time før dit svar.
Det kan enkle gange vare længe inden et svar fremkommer.
Måske har det været tilfældet her. Hvis ikke, så har du vel
også afprøvet min rettelse. Du er måske tvivlende -alligevel.

Neo er i tvivl om -mener jeg at forstå, hvor hvidt Me formen
(den aktive form, på hvis controlBox han trykker på unload
krydset) bliver unloaded. Det bliver den, det sørger den
løbende QueryUnload procedure for; proceduren er lavet
til det. Man kan fortryde ved at sætte Cancel = True, eller
1, eller bare et tal forskellig fra 0.

-Enig, objecter sammenlignes med Is operatoren. Så
en alternativ procedure ville ha været:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim f As Form
If Test = 2 Then Cancel = 1: Exit Sub
For Each f In Forms
If Not f Is Me Then Unload f
Next
End Sub

hilsen agner



Tomas Christiansen (09-04-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 09-04-05 22:25

Lasse Madsen skrev:
> Splash => Frmlogin + Frmmain
>
> Hvis jeg så trykker på "Krydset" i øverste højre hjørne af "Frmlogin"
> programmet forsvinder vinduet også ... men programmet kører stadig når
> jeg trykker CTRL+ALT+DEL

Som Neo har beskrevet i "total nedluk" af program, skal du selv sørge for
at lukke alle de forms, som er blevet startet op. Du behøver dog IKKE at
lukke den aktuelle form (Me) i Form_QueryUnload event-proceduren.

> jeg har også prøvet at lave en knap i "frmlogin" vinduet med koden
>
> ' knap kode
> end

End "skal" virke - men det kan tage noget tid, og det er ikke sikkert at
resultatet bliver pænt.

Forklaring følger:

Bruger man End skal man være opmærksom på at diverse komponenter ikke
nødvendigvis får mulighed for at køre "afslutningskode" og derfor ikke
får lukket ordentligt for databaser eller skrevet det sidste ned i filer
osv. Der er ingen garanti for at det går godt, og ingen garanti for at
det går skidt. Men programmet bliver lukket (hårdt) og hukommelse bliver
(under normale omstændigheder) frigivet.

Hvis dit program har oprettet 10.000.000 små objekter, vil det dog tage
ret lang tid at nedlægge dem igen, idet det vil ske én ad gangen. Om du
bruger End eller Unload <form> gør efter min erfaring ingen forskel på
den tid det tager at nedlægge objekter. Jeg har i sin tid brugt en del
tid på at forsøge at optimere på dette, idet jeg havde et program, som
kunne være op til 30 minutter om at forsvinde fra task listen, ene og
alene på grund af det mega-kolo-enormt-fantastisk store antal objekter
som skulle nedlægges!

Når dit program lukker (f.eks. med End - kan være fin at bruge i test-
situationer, men bør aldrig bruges i produktion), kan du så i Task
Manager (Opgavelisten på dansk), se om Memory Usage Delta giver negative
(og kun negative) værdier og Page Fault Delta evt. positive værdier?
Bliver Memory Usage og VM Size mindre og mindre? Bruger dit program CPU-
tid?

-------
Tomas

preben nielsen (12-04-2005)
Kommentar
Fra : preben nielsen


Dato : 12-04-05 17:32


"Lasse Madsen" <spam@electrologic.dk> skrev i en meddelelse
news:d392q3$2el5$1@newsbin.cybercity.dk...

> unload frmmain
> end

MAn bruger ikke End ! Luk alle forms og alle ressourcer........ så




Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409075
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste