Dichiarazioni Funzioni menu popup 64 bit

di il
6 risposte

Dichiarazioni Funzioni menu popup 64 bit

Buongiorno,

premesso di non avere molta dimestichezza con le funzioni per vba, ho la necessità di dichiarare delle funzioni (a 64bit) per la costruzione di menu popup in un form access.

Le funzioni a 32bit sono le seguenti:

Public Const MF_CHECKED = &H8&
Public Const MF_APPEND = &H100&
Public Const MF_DISABLED = &H2&
Public Const MF_GRAYED = &H1&
Public Const MF_SEPARATOR = &H800&
Public Const MF_STRING = &H0&
'TrackPopupMenuEx constants required
Public Const TPM_CENTERALIGN = &H4&
Public Const TPM_LEFTALIGN = &H0&
Public Const TPM_RIGHTALIGN = &H8&
Public Const TPM_BOTTOMALIGN = &H20&
Public Const TPM_TOPALIGN = &H0&
Public Const TPM_VCENTERALIGN = &H10&
Public Const TPM_NONOTIFY = &H80&
Public Const TPM_RETURNCMD = &H100&
Public Const TPM_LEFTBUTTON = &H0&
Public Const TPM_RIGHTBUTTON = &H2&
'declare a user-defined data type containing two elements representing x and y locations
Public Type POINTAPI
x As Long
y As Long
End Type

Declare Function CreatePopupMenu Lib "user32" () As Long

Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, _
ByVal x As Long, ByVal y As Long, ByVal hWnd As Long, ByVal lptpm As Any) As Long

Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal _
wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long

Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long


Potrei avere indicazioni di come tradurle perché possano essere utilizzate a 64bit?

Grazie.

6 Risposte

  • Re: Dichiarazioni Funzioni menu popup 64 bit

    Esiste sicuramente l'elenco su internet. Perché non fai una ricerca?
  • Re: Dichiarazioni Funzioni menu popup 64 bit

    Giuro che è la prima volta che con Access sento una roba simile...!!!!
    I Popup con Access si costruiscono con il VBA con poche righe di codice, al massimo serve 1 Chiamata API per recuperare la posizione del Cursore in modo da passarla al metodo ShowPopup... ma solo se lo devi pilotare da Comando.

    Sei certo di aver preso la strada giusta...?

    Un esempio "banale":
    Crea una Form vuota e su Load scrivi:
    
    Private Sub Form_Load
       Call CreateFilterPopup()
       Me.ShortcutMenuBar=cMNU
    End Sub
    Quindi metti in un Modulo questo codice:
    
    Option Compare Database
    Option Explicit
    
    Public Const cMNU     As String = "MenuPopupCustom"
    
    Public Function CreateFilterPopup()
    
        Dim myBar                   As Object
        Dim myCtlBar                As Object
    
        Const msoControlButton = 1
        Const msoBarTypePopup = 2
        Const msoBarPopup = 5
        
        ' Cerca nell'insieme CommandBars l'Oggetto Menù = "mPopupRuntime"
        If CBRExist(cMNU) = False Then
            ' Se siamo quì il Menù non esiste, quindi lo CREA
            Set myBar = Application.CommandBars.Add(Name:=cMNU, Position:=msoBarPopup, Temporary:=True)
            Set myCtlBar = myBar.Controls.Add(Type:=msoControlButton)
                     
            With myCtlBar
                 .Caption = "Popup Menù Test"
                 .FaceId = 527
                 .OnAction = "=Prova()"
                 .BeginGroup = False
                 .Enabled = True
            End With
        End If
    End Function
    
    Private Function CBRExist(NomeCBR As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = Application.CommandBars(NomeCBR).Name
        CBRExist = Err.Number = 0
    End Function
    
    Public Function Prova()
       MsgBox "Hai premuto il POPUP MENU'"
    End Function
    Apri la Form e premi RIGHT_CLICK...
  • Re: Dichiarazioni Funzioni menu popup 64 bit

    Il codice su esposto funziona bene in un sistema a 32bit ma sostituendo con le function a 64bit ovvero:

    Public Declare PtrSafe Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As LongPtr, ByVal un As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal hWnd As LongPtr, lpTPMParams As TPMPARAMS) As Long

    ottengo l'errore: "tipo non definito dall'utente non definito" sulla chiamata alla funzione TrackPopupMenuEx. Forse qualche problema di libreria, non saprei.
  • Re: Dichiarazioni Funzioni menu popup 64 bit

    Ma di quale cosice parli???

    Hai letto le risposte o no?
  • Re: Dichiarazioni Funzioni menu popup 64 bit

    Si ovviamente funziona, ma perchè usare le API quando ci sono funzioni NATIVE che sono LIBERE da Versioni del S.O....?
    Questa cosa è solo questione di non aver idea di cosa si sta facendo, ma di aver fatto un Copy/Paste....

    Le API le devi adattarle a 64Bit ovviamente e non basta il PtrSafe... molti Pointer sono LngPTR e non Long, come vedi e tutto il codice va riconfigurato oppure scritto con Compilazione Condizionale...!

    Quello che fai è assolutamente insensato.
  • Re: Dichiarazioni Funzioni menu popup 64 bit

    E sicuramente ti manca il tipo

    TPMPARAMS
Devi accedere o registrarti per scrivere nel forum
6 risposte