Finestra di dialogo

Anonimo
2018-02-05T16:02:05+00:00

Il codice di cui sotto (interamente copiato da un sito, di cui non ricordo l'indirizzo, e poi successivamente modificato) lo utilizzo da anni. Da quando mi hanno istallato una nuova versione di Office, non ha più intenzione di funzionare:

Option Compare Database
Option Explicit

Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
            Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
   lStructSize As Long
   hwndOwner As Long
   hInstance As Long
   lpstrFilter As String
   lpstrCustomFilter As String
   nMaxCustFilter As Long
   nFilterIndex As Long
   lpstrFile As String
   nMaxFile As Long
   lpstrFileTitle As String
   nMaxFileTitle As Long
   lpstrInitialDir As String
   lpstrTitle As String
   flags As Long
   nFileOffset As Integer
   nFileExtension As Integer
   lpstrDefExt As String
   lCustData As Long
   lpfnHook As Long
   lpTemplateName As String
End Type

Public Function cmdlg_file(n_ot As Byte)
' "n_ot" -> Variabile legata al programma e fa riferimento
'           alle cartelle in cui sono contenuti  le immagini.
'           Da modificare per ogni programma.

   Dim OpenFile As OPENFILENAME
   Dim lReturn As Long
   Dim sFilter As String
   
   OpenFile.lStructSize = Len(OpenFile)

   sFilter = "*.jpg; *.tif; *.pdf" & Chr(0)
   'sFilter = "Immagini (*.jpg)" & Chr(0) & "*.jpg" & Chr(0)

   OpenFile.hwndOwner = Application.hWndAccessApp
   OpenFile.lpstrFilter = sFilter
   OpenFile.nFilterIndex = 1
   OpenFile.lpstrFile = String(257, 0)
   OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1
   OpenFile.lpstrFileTitle = OpenFile.lpstrFile
   OpenFile.nMaxFileTitle = OpenFile.nMaxFile
   
   If n_ot = 10 Then
        OpenFile.lpstrInitialDir = P_disco & Left(KK_Ind_4, Len(KK_Ind_4) - 1)
    Else
        Exit Function
    End If

   OpenFile.lpstrTitle = "Selezione"
   OpenFile.flags = 0
   lReturn = GetOpenFileName(OpenFile)
   
   If lReturn = 0 Then
      cmdlg_file = ""
   Else
      cmdlg_file = Left(OpenFile.lpstrFile, InStr(OpenFile.lpstrFile, Chr$(0)) - 1)
   End If
End Function

Ho modificato la dichiarazione aggiungendo queste righe di codice:

#If Vba7 Then Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long #Else Declare Function GetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long #EndIf

ma anche in questa maniera non mi apre la finestra di dialogo.

Poi, scoperto che le API non vengono più usate, sono approdato a questo indirizzo: https://msdn.microsoft.com/en-us/vba/access-vba/articles/application-filedialog-property-access .... peggio che andar di notte.

Ho capito (forse) che bisogna fare una dichiarazione, ma non so di che e di cosa e come ... e mi sono bloccato.

Scusate la mia "pochezza", venitemi incontro.

Grazie

Angelo

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-02-05T19:14:22+00:00

ciao Angelo,

non è che le Api non sono più utilizzate anzi....in certo ambiti in cui office non mette a disposizione gli strumenti che invece sono disponibili a livelli di sistema operativo le Api rappresentano l'unica soluzione.

Non sono sempre l'unica soluzione per tutti i problemi, ma come detto, ci sono una miriade di problemi che possono essere risolti solo invocando Api di windows.

Gli sviluppatori tendono sempre ad utilizzare strumenti nativi e poco gli oggetti esterni in quanto garantiscono  ( i primi ) una certa garanzia di funzionamento indipendentemente dalle versioni.

Gli oggetti esterni invece sono più difficilmente controllabili, Api incluse.

Con l'introduzione di Office a 64 dalla versione 2010 nel momento in cui l'applicazione deve lavorare in ambienti diversi, le dichiarazioni Api devono essere impostate per entrambe le versioni 64 e 32 bit, e per ottemperare a questa esigenza si utilizza la formattazione condizionale, quella che hai individuato...sarebbe da impostarla un po' meglio....

L'argomento è molto vasto e mi fermo qui.

Il codice completo della chiamata Api del commonDialog lo trovi qui :

https://answers.microsoft.com/it-it/msoffice/forum/msoffice\_access-msoffice\_custom/problema-conversione-codice-32bit-a-64bit/fd809d35-c5f4-469b-b492-53228ace7d6f

oppure anche qui :

https://answers.microsoft.com/it-it/msoffice/forum/msoffice\_access-mso\_win10-mso\_2016/da-access-2007-ad-access-2016-errore-istruzione/56c2fc6f-9865-46dc-bf74-32a6aba53936

ti consiglierei però di applicare il filedialog, esattamente quello che hai autonomamente individuato, vedi qui per una soluzione pratica per restituire il percorso completo del file :

https://answers.microsoft.com/it-it/msoffice/forum/msoffice\_access-mso\_win10-mso\_2016/filedialog/5418ebf2-a1e3-4c09-947e-462b147c0747

Per quello che serve a te, la chiamata APi in questo caso non è la soluzione migliore.

HTH.

Ciao, Sandro.

La risposta è stata utile?

5 persone hanno trovato utile questa risposta.
0 commenti Nessun commento

1 risposta aggiuntiva

Ordina per: Più utili
  1. Anonimo
    2018-02-06T14:12:28+00:00

    Ti ringrazio. Ho provato la terza soluzione da te proposta e va bene.

    Angelo

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento