Newsgroup: it.comp.lang.visual-basic
Titolo: Limitare il resize entro certi limiti

Vorrei far sì che la mia finestra non fosse resizabile oltre un certo limite.
Ho quindi posto, nell'evento resize del Form una verifica che reimposta al volo le dimensioni del form nel caso l'utente cerchi di ridimensionare il form oltre il limite che ho scelto, funziona ma...
if Form1.Height<5000 then
    Form1.Height = 5000
end if
Il problema è soprattutto estetico. Quando l'utente effettua il resize sotto il limite impostato, il form, pur mantenendo le dimensioni indicate, sfarfalla letteralmente ed è una cosa molto brutta a vedersi, per cui mi chiedevo se non esistesse una soluzione più "bella"...

Dimio ha scritto:

Ipotizzo VB6......?
Quello che stai facendo non è il modo corretto.
Per ottenere quello che chiedi devi SubClassare la Form ed intercettare
il Messaggio WM_GETMINMAXINFO
Public Function NewWindowProc(ByVal hwnd As Long, _
                              ByVal msg As Long, _
                              ByVal wParam As Long, _
                              ByVal lParam As Long) As Long
   Const WM_GETMINMAXINFO = &H24
Dim mmiT          As MINMAXINFO
Select Case msg
     Case WM_GETMINMAXINFO
          ' Copy parameter to local variable for processing
          CopyMemory mmiT, ByVal lParam, LenB(mmiT)
          ' Minimium width and height for sizing
          mmiT.ptMinTrackSize.x = XMIN_VALUE
          mmiT.ptMinTrackSize.Y = YMIN_VALUE
          ' Maximum width and height for sizing
          mmiT.ptMaxTrackSize.x = XMAX_VALUE
          mmiT.ptMaxTrackSize.Y = YMAX_VALUE
          ' Copy modified results back to parameter
          CopyMemory ByVal lParam, mmiT, LenB(mmiT)
    Case else
             retVal = CallWindowProc(OldWindowProc, _
                                                   hwnd, msg, _
                                                   wParam, lParam)
   End Select
   ' Continua il normale processamento. IMPORTANTISSIMO!
   NewWindowProc = retVal
End Function
Ovviamente XMIN_VALUE e fratelli vari sono i veri valori da passare
come constanti.....
se poi rendo un pò più flessibile la funzione, che quì è
volutamente all'osso potrai inserirli
come Costanti nelle Form e, implementando un'interfaccia dirottare
conil SubClassing
direttamente nella Form stessa.....
@Alex

il Messaggio WM_GETMINMAXINFO
Oddio, io speravo in qualcosa di più semplice... cioè, sicuramente il tuo è il metodo "definitivo", ma mi chiedevo se non esistesse qualcosa tipo un piccolo trucco per farlo.

Dimio ha scritto:

Che io sappia, anche il sistema che hai prospettato tu da origine a
flare video, e personalmente gli sfarfallii dovuti ai Redraw sono
inaccettabili.
@Alex

flare video, e personalmente gli sfarfallii dovuti ai Redraw sono inaccettabili.
Vero purtroppo...
Qualche miglioramento l'ho ottenuto disabilitando e riabilitando il form al volo:
if Form1.Height<5000 then
    Form1.Enabled = False
    Form1.Height = 5000
    Form1.Enabled = True
end if
Così gli sfarfallii scompaiono, però non è perfetto...

Dimio ha scritto:

Ma qual'è la difficoltà di farlo SubClassando...?
Funziona benissimo in Access figurati in VB6.
Usa la Dll per SubClassare senza problemi che trovi pubblicata su
VbAccelerator
se non sei in grado di gestirlo da te, ed inserisci il codice che ti ho
passato nella
Form.
Se  non ricordo male la DLL è in grado già di deviarti il Messaggio
specifico così
da non porti nemmeno il problema di cosa fare...!
Boh....
@Alex

>Ma qual'è la difficoltà di farlo SubClassando...?
Non fraintendermi, riuscire a subclassare non è certo il problema :-)
Il programma è un'utilità destinata a girare in background, per cui è vitale cercare di ridurre al massimo il consumo di risorse.
Il subclass fatto nella maniera standard, come sai, causa problemi nel debug (crash), per evitare il problema si possono utilizzare dei sistemi alternativi (dll o l'ottima classe di Paul Caton che è anche meglio), ma in ogni caso avrei preferito una soluzione da 2 linee (se ci fosse stata).

Dimio ha scritto:

Io sviluppo 90% per Access, e limito al minimo l'uso del Subclassing
non solo per il Debug ma anche perchè con Access ci sono problemi a
farlo funzionare
in IDE, infatti funziona solo se non viene aperto(l'ide) altrimenti
Crasha.
In ogni caso l'impegno di risorse in questo caso è veramente minimo,
soprattutto se l'applicazione gira in Back, è come se non ci fosse il
subclassing
in quanto non verrà mai intercettao il messaggio...., comunque
concordo con te che le 2 righe di condizione sarebbero state più
leggere..... ma quì oltre quanto già detto non saprei cosa proporti,
magari chi ha più esperienza pratica con VB6 di me potrebbe avere
trovato un sistema migliore.
P.S. non conosco la classe di Canton, io utilizzo un sistema di Probst
che è equi8valente della Dll di VbAccelerator(senza DLL) che sfrutta
proprio una Classe
come Interfaccia, e mi rilancia nella Form il SubClass.
Se puoi indicarmi dove trovare la Classe in questione gli butto
un'occhio.
Ciao
@Alex

Se puoi indicarmi dove trovare la Classe in questione gli butto un'occhio.
La classe di Caton sembra molto simile a quella che usi tu (una classe + un'altra implementata come interfaccia)... in pratica scrive in ram direttamente un mini programma in codice macchina che gestisce il subclass (e anche il superclass volendo).
I vantaggi sono che:
1. è più veloce di qualsiasi dll.
2. non fa piantare il programma anche se si interrompe/termina il programma dall'IDE.
Stranamente non riesco a ritrovarla molti l'hanno usata come base per realizzarne delle versioni personalizzate e si trovano queste (grosse e inutilmente complicate IMHO).

Dimio ha scritto:

Se ti dovesse ricapitare tra le mani.......
@Alex

>Se ti dovesse ricapitare tra le mani.......
Trovato! :-)
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=37102&lngWId=-1

 
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=37102&lngWId=-1
Visto.
Nonostante abbia qualche base di ASM che risale al 6502 ed allo Z80, ed
anche se ho "intuito" il funzionamento è molto fuori dalla mia
portata.
Decisamente interessante peccato non possa implementarla in VBA.....
Grazie
@Alex