Newsgroup: it.comp.appl.access
Titolo: SubClassing.....!

Stavo provando a rendere la Form Bloccata come da un Post
precedente tramite il SubClassing, la cosa funziona, ma non
sempre.....!
Mi spiego meglio intercetto i messaggi WM_SYSCOMMAND=&H112
e WM_GETMINMAXINFO=&H24 e in effetti la Form non si muove
se non chè alcune volte mi rimane attaccata al Mouse e da quì ci sarà
credo un'altro messaggio che mi dice che la Form è attaccata....???
Il fatto è che quando si attacca non vengono più riconosciuti gli eventi
di cui sopra.
L'effetto è che la maschera attaccata si muove.
Qualcuno ha lumi d'accendermi.........!
Ho provato a rilevare i messaggi generati(Eventi) ma tra quelli
conosciuti non ho trovato nulla.
Grazie.
--
@Alex
ik2...@libero.it
http://digilander.libero.it/ik2zok

 ha scritto nel messaggio
news:OxhUa.204151$Ny5.5...@twister2.libero.it...

Mi sono perso il post originale, ma con AccessXp basta impostare la
proprietà Spostabile a no (Me.Moveable.=False) e la maschera non si muove.
Ciao Giorgio.


Il post era di un utente che non avendo specificato la versione di Access,
come
del resto no ho fatto nemmeno io......ha dat origine a malintesi....!
Io uso A97, pertanto Movable non c'è, sono per questo costretto a
SubClassare
ed intercettare i tentativi di Move(che peraltro non da origine ad evento in
A97)
ma che genera a livello di Procedure un Messaggio intercettabile.
Come accennavo subclassando e deviando la procedura originale funziona, se
non
chè mi si attiva alcune volte(Random) il DRAG sulla Form, mi rimane
appiccicata
al Mouse e da quì non ricevo più i messaggi standard da SendMessage.......!
Ciao.
@Alex.

 ha scritto nel messaggio
news:5_sUa.205127$lK4.5...@twister1.libero.it...

Ciao @Alex
Intercettando i valori di wParam a fronte del messaggio WM_SYSCOMMAND ho
notato che :
wParam è uguale a
61458 '=&hF012 quando si cerca di spostare il form
es è uguale a
61446 '=&hF006 quando si cerca di ridimensionarlo
Ti riporto solo la WindowProc, penso che il resto non ti interessa.
-------------------------------------------------------
Public Function WindowProc(ByVal hwnd As Long, _
    ByVal uMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
    Dim StopMouse As Boolean
      Select Case uMsg
         Case WM_SYSCOMMAND
              Select Case wParam
                 Case 61458 '=&hF012 intercetta lo spostamento del form
                 Case 61446 '=&hF006 intercetta il resize
                 Case Else
                      WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg,
wParam, lParam)
                End Select
         Case Else
           WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam,
lParam)
    End Select
End Function
--------------------------------------------------
In queso modo funziona bene.
Non ho capito perchè se metto
---------------
Case &hF012
Case &hF006
--------------
al posto di
--------------
Case 61458
Case 61446
--------------
non funziona più, indagherò.
Ciao Giorgio

 ha scritto nel messaggio
news:bfu5mg$q86$1...@lacerta.tiscalinet.it...

Dimenticavo ...
Un'altra cosa strana è che i due valori non corrispondono a
SC_CLOSE        0xF060
SC_MOVE         0xF010
Riportati in Win32 Programmer's Reference.
Ciao Giorgio.

 ha scritto nel messaggio
news:bfu6ft$qj8$1...@lacerta.tiscalinet.it...

Ciao Giorgio, non avevo pensato di intercettare i parametri rilasciati
dal messaggio in questione, ottimo lo provo subito poi ti so dire.
Win32 Programmer's Reference.....??
Dov'è....?
Chi l'ha visto.....?
Ciao.
Grazie di nuovo per la celere consulenza.
@Alex.


Ciao @Alex
Oltre a OfficeXp DEV ho anche il C++ della Borland e lo uso per piccoli
programmi che non necessitano di alcun Runtime.
Win32 Programmer's Reference č uno degli Help in linea fornito con il
compilatore, non so se č scaricabile da internet.
Ciao Giorgio.


Ciao Giorgio, avevo scaricato anch'io C++(Borland) ma mai avuto tempo di
guardarlo.
Ho sentito che CSharp non è male(Anche con il RUNTIME)......! MAH..........
Se trovo qualche mese di pace torno ad Assembler............che è il mio
2°AMORE
il primo è di tutt'altra natura............! ;-)
Tornando al nostro Post:
Ho provato ma non va ancora, rimane attivo il DRAG appiccicoso e non lo
molla
fintanto che non la rimetto giù.
Ho pensato di sfruttare prima dell'intercettazione di WM_SYSCOMMAND
l'API di seguito al fine di memorizzare le coordinate della Form.
Public Declare Sub CopyMemory Lib "kernel32" Alias _
            "RtlMoveMemory" (lpDest As Any, lpSource As Any, _
             ByVal cBytes&)
Poi intercettato Case 61458 '=&hF012 riaggiorno le
coordinate della Form con le precedenti salvate ed in teoria non dovrei
accorgermi dello spostamento.
Farò questa prova, e poi vediamo che risultati dà......!
Ciao.
@Alex.

 ha scritto nel messaggio
news:kONUa.206823$lK4.5...@twister1.libero.it...

Ciao @Alex
Forse la differenza di comportamento consiste nella diversa procedura per
subclassare la WindowProc, con AccXp si può fare senza l'ausilio di
vba332.dll passando a SetWindowsLong direttamente AddressOf WindowProc (come
per VB5 e VB6).
Questi sono i misteri della Sfinge.
Per quanto riguarda la seconda strada potresti usare GetWindowPlacement per
leggere le coordinate del form, e poi riassegnarle con SetWindowPlacement.
esempio
' IN un modulo BAS
-------------------------
Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Public Type POINTAPI
        x As Long
        y As Long
End Type
Public Type WINDOWPLACEMENT
        Length As Long
        flags As Long
        showCmd As Long
        ptMinPosition As POINTAPI
        ptMaxPosition As POINTAPI
        rcNormalPosition As RECT
End Type
Declare Function GetWindowPlacement Lib "user32" _
        (ByVal hwnd As Long, _
        lpwndpl As WINDOWPLACEMENT) As Long
Declare Function SetWindowPlacement Lib "user32" _
        (ByVal hwnd As Long, _
        lpwndpl As WINDOWPLACEMENT) As Long
---------------------------------------------------
In una Sub
------------------------------------------
Dim Pla As WINDOWPLACEMENT
Dim Result as Long
Pla.Length = LenB(Pla)
'Leggi la posizione del form
Result = GetWindowPlacement(Frm.hwnd, Pla)
.....
.....
......
' e poi le riassegni
Result = SetWindowPlacement(Frm.hwnd, Pla)
--------------------------------------------
Io le utilizzo per avere tutti i Form e i report con le stesse dimensioni e
nella stessa posizione a prescindere da come li hai memorizzati in fase di
progettazione.
Ciao Giorgio.

 ha scritto nel messaggio
news:bg0fjo$lfs$1...@lacerta.tiscalinet.it...

Si, ottimo razzolando tra le API avevo trovato anch'io questi Ref, ed in
effetti è un modo alternativo per ottenere quello che avrei voluto fare con
CopyMemory,
ma visto che gentilmente mi hai postato già il codice finito, ne approfitto
e ci riprovo.


Ciao @Ale
Il computer delle mie figlie ha office97 e ho voluto provare quanto fatto
con officeXp (con le dovute modifiche).
A me funziona perfettamente, se vuoi puoi scaricare un db di esempio che ho
fatto con Access97 che disabilita
1) La rotellina del mouse
2) Lo spostamento del Form
3) Il ridimensionamento del bordo (ovviamente se il form ha il bordo
dimensionabile)
Il tutto adattando il codice delle varie KB della Microsoft.
http://web.tiscali.it/giorgiorancati/mousewhell.htm
Fammi sapere se ti funziona.
Ciao Giorgio.

 Ciao Giorgio.
Incredibile......!
A parte il fatto che č esattamente ciň che ho fatto io...!
A casa mia non va, al lavoro si........!!!
Ora inizio ad avere dubbi amletici....!
Il SP installato č l'ultimo, l'unica differenza č che al lavoro
ho WinNT a casa Win98.
Adesso ci rismanetto un pochino, poi inizio a pregare, quindi
a sbattere la tastiera....!
Ciao Giorgio, grazie.
@Alex.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG
Ciao @Ale
Anche il mio computer ha Win98.
Ciao Giorgio.

al lavoro si........!!!
Cos'č: hai personalizzato Win '98 a casa tua?  ;-))

 Cos'è: hai personalizzato Win '98 a casa tua?  ;-))
Si, vedrai che se non scopro perchè non va lo personalizzo
io come si deve......!
In realtà ho scoperto cos'era...., ma ho vergogna a dirlo.
Nel fare copia/incolla ho perso un pezzo......!
Vabbè, risolto l'arcanò mi ritiro a nuove cose. 


 ha scritto nel messaggio
news:a91fd0b802c3e558e7...@mygate.mailgate.org...

Ciao @Alex
Adesso si potrebbe proporre l'esempio a chi ha chiesto come bloccare le
maschere di Access97, purtroppo con il server 
tiscali.it
 non vedo quel
thread, ci pensi tu ?
Ciao Giorgio.

 Ciao Giorgio.
Io direi che per correttezza gli allego l'indirizzo che hai
segnalato visto che l'esempio č ottimo ed abbondante...!
Sempre che per te sia OK.
Grazie mille.


 ha scritto nel messaggio
news:4ecb62391f620d6c92...@mygate.mailgate.org...

Ciao @Alex
L'Ho messo sul web quindi č a disposizione di tutti.
Ho fatto una piccola modifica, nel form ho inserito due check, uno per
abilitare o disabilitare la rotellina e l'altro per abilitare o disabilitare
lo spostamento del form.
Ciao Giorgio.


Grande....!
E' direi un'Ottimo esempio anche per il SC,  ma forse
quì si entrerebbe in sarcasmo.....!!!
Meglio il Link al tuo sito.
Bye.
@Alex.


Grazie @Alex
Per fare 100 ho tolto un BUG della KB278379 in cui viene utilizzata una
variabile globale per salvare l'indirizzo in lpPrevWndProc.
Per riprodurre il bug basta aprire un form con il subClassing quindi ne apri
un'altro sempre con il subClassing ma in Modal mode, quest'ultimo riassegna
lpPrevWndProc con un valore diverso dal precedente quindi chiudendolo e
passando al primo form Access va in crash.
Ho anche scoperto l'arcano sui valori non corrispondenti per la costante
SC_MOVE = &HF010  con l'help , infatti in una nota dice che bisogna fare il
bitwise di wParam in AND con &HFFF0, fatto questo tutto corrisponde.
Ciao alla prossima
Giorgio

 Giorgio
Riguardo al problema del BUG pensandoci è ovvio, stavo pensando se
non conviene sfruttare una Collection e la sua KEY per gestire in modo
comodo il SubClassing.....!
In questo modo hai la possibilità di sfruttare il metodo Add e Remove
in modo nativo......!
Ci penso un'attimo, nel senso che ci provo......!
Per il parametro ho notato altre anomalie come il Close, e visto il tuo
suggerimento
verifico se con quest'ultimo tutto quadra.
Saluti.
@Alex.