Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 - Istruzione END

Sapete dirmi perchč se all'interno di un CommandButton scrivo l'istruzione 
"End" (e nessun altro codice) il programma va in crash con il solito errore 
di Windows?
Quali possono essere le possibili cause? 

> Quali possono essere le possibili cause?
Scusatemi ma subito dopo aver spedito il messaggio al NG, ho deciso di fare 
un'ulteriore prova e mi sono accorto che se tolgo le seguenti righe di 
codice l'istruzione End non dà errore:
    Dim TwipsX
    Dim TwipsY
    Dim StartupWidth
    Dim StartupHeight
    TwipsX = Screen.TwipsPerPixelX
    TwipsY = Screen.TwipsPerPixelY
    StartupWidth = Screen.Width \ TwipsX
    StartupHeight = Screen.Height \ TwipsY
    Set Me.Icon = Nothing
    Call SubClass(Form1.hwnd)
    minX = 13425 \ TwipsX
    minY = 10695 \ TwipsY
    maxX = StartupWidth
    maxY = StartupHeight
Le righe di codice di cui sopra (trovate in qualche vecchio post di questo 
ng) servono per limitare il ridimensionamento del form.
Qualcuno di voi può aiutarmi a capire dov'è l'errore?
Ringrazio tutti in anticipo. 

 Qualcuno di voi puņ aiutarmi a capire dov'č l'errore?
Forse ridimensionamento per 0? Ma ti dovrebbe dare un errore di debug.
Prova con un On Error o a remmare via via qualche istruzione.
-- 
Freccia@Bulldozer63 :D

 Prova con un On Error o a remmare via via qualche istruzione.
Il codice che ho utilizzato è quello reperito dal seguente link:
http://vbnet.mvps.org/code/subclass/minmaxinfo.htm
Togliendo la riga  "Call SubClass(Form1.hwnd)" non mi appare più l'errore e 
l'applicazione si chiude regolarmente tuttavia perdo la funzionalità di 
ridimensionamento minimo.
Non appare nessun errore di Debug, anzi se l'applicazione va in debug per un 
qualsiasi errore non dipendente da questo codice manda in crash anche 
l'interfaccia di VB6.
Non so più come uscirne...!
Spero che con questi ulteriori dettagli tu o qualcun'altro possa darmi 
qualche dritta...


Nel modulo ove ha inserito il codice, precisamente nella seguente funzione, 
hai cambiato il nome della form con quella tua?
Public Function WindowProc(ByVal hwnd As Long, _
                           ByVal uMsg As Long, _
                           ByVal wParam As Long, _
                           ByVal lParam As Long) As Long
  'window message procedure
   On Error Resume Next
   Select Case hwnd
     'If the handle returned is to our form,
     'perform form-specific message handling
     'to deal with the notifications. If it
     'is a general system message, pass it
     'on to the default window procedure.
     Case 
frmMain.hwnd -----------------------QUI--------------------------------
         On Error Resume Next
        'form-specific handler
         Select Case uMsg
            Case WM_GETMINMAXINFO
                  Dim MMI As MINMAXINFO
                  CopyMemory MMI, ByVal lParam, LenB(MMI)
                  'set the MINMAXINFO data to the
                  'minimum and maximum values set
                  'by the option choice
                   With MMI
                      .ptMinTrackSize.x = minX
                      .ptMinTrackSize.y = minY
                      .ptMaxTrackSize.x = maxX
                      .ptMaxTrackSize.y = maxY
                  End With
                  CopyMemory ByVal lParam, MMI, LenB(MMI)
                 'the MSDN tells us that if we process
                 'the message, to return 0
                  WindowProc = 0
              Case Else
                  'this takes care of all the other messages
                  'coming to the form and not specifically
                  'handled above.
                   WindowProc = CallWindowProc(defWindowProc, _
                                               hwnd, _
                                               uMsg, _
                                               wParam, _
                                               lParam)
          End Select
   End Select
End Function
-- 
Ciao
Access 

 Call SubClass(Form1.hwnd)
Non so cosa succeda nella routine SubClass(), ma quando si subclassa una
form vengono gestiti e manipolati messaggi, chiamate e impostazioni di
sistema. E tu ti aspetti che chiudendo brutalmente il programma senza
ripristinare queste impostazioni il povero Windows riacquisti da solo la
propria stabilità?
Se veramente questa routine subclassa una form, come il suo nome suggerisce,
sarebbe cosa buona e giusta de-subclassarla, ripristinando le normali
funzionalità prima di uscire dal programma, anche uscendo correttamente dal
programma scaricando tutte le form e senza usare End. Altrimenti, se non si
de-subclassa, ogni altro programma che utilizza la stessa form - lo stesso
OGGETTO Form - si trova con le impostazioni che servivano al tuo programma
ma non necessariamente servono agli altri programmi che normalmente vengono
utilizzati su quel computer. Cioè magari il povero utente avvia WinZip e
questo ha le impostazioni del tuo programma, magari non gradite, non
necessarie, e probabilmente e soprattutto, non compatibili con le funzioni
di WinZip. E' molto probabile che WinZip mandi il pc in crash, ma non è
colpa di WinZip. Il tutto finché non si riavvia il pc.
Se tu chiudi un programma con End molto probabilmente hai copiancollato del
vecchio codice, di qualcuno che non sapeva nemmeno cosa sia il subclassing,
ma senza capire bene il suo funzionamento. Poi ci hai appiccicato il codice
di qualcuno che subclassava una form, ma certamente non si sognava né di
chiudere il suo programma senza ripristinare la form subclassata, né di
chiudere il suo programma con End. Questo succede quando si utilizza codice
di altri senza comprenderlo a fondo.
Dovresti studiare un po' di più perché ogni buon libro di VB6 sconsiglia
l'utilizzo di End.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 
Ne approfitto per inserirmi.
Ho creato un software che, oltre ad altre 1000 caratteristiche, 
attraverso un controllo esterno (creato da terze parti) dialoga in 
ethernet con alcuni dispositivi.
Molto raramente succede che se chiudo l'applicativo mentre si verificano 
problemi di rete la terminazione non si completa (rimane il processo nel 
task manager).
In questa condizione, se nella mia "ProceduraTerminazione()" (chiamata 
da un apposito pulsante "cmdChiudi") termino i timer, scarico tutti i 
form, scarico tutti i controlli, insomma faccio il bravo programmatore, 
è consigliato inserire comunque un End alla fine di tutto o ci possono 
essere complicazioni?
Avevo notato che inserendo un "End" le risorse del sistema usate 
dall'applicativo al momento della chiusura passano da 20 mega a 200 in 
un attimo, poi ritornano a 20 e successivamente il processo sparisce. Se 
non inserisco l"End", le risorse rimangono a 20, e poi l'applicativo si 
chiude senza fare l'esoso.
E' normale?
Ciao e grazie