Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème API GetOpenFileName

2 réponses
Avatar
le_troll
Bonjour,

Dans l'API GetOpenFileName (ouverture de la boîte de dialogue donc)
Ça marche si je choisis un fichier pour mettre dans une PictureBoxe, mais:
Si je ferme par la croix [X] rouge, ou <Annuler> ou <Alt+F4>, ben ça me
ferme l'appli, il doit y avoir des params de retour à rediriger pour éviter
ça, mais je ne sais pas lesquels, avez-vous une idée, voici le code (une
tartine cette API):
------------------------------------------------
Dim cheficPH As String * 255
'
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
'
Private Enum OFN_Constants
OFN_ALLOWMULTISELECT = &H200
OFN_CREATEPROMPT = &H2000
OFN_DONTADDTORECENT = &H2000000
OFN_ENABLEHOOK = &H20
OFN_ENABLEINCLUDENOTIFY = &H400000
OFN_ENABLESIZING = &H800000
OFN_ENABLETEMPLATE = &H40
OFN_ENABLETEMPLATEHANDLE = &H80
OFN_EX_NOPLACESBAR = &H1
OFN_EXPLORER = &H80000
OFN_EXTENSIONDIFFERENT = &H400
OFN_FILEMUSTEXIST = &H1000
OFN_FORCESHOWHIDDEN = &H10000000
OFN_HIDEREADONLY = &H4
OFN_LONGNAMES = &H200000
OFN_NOCHANGEDIR = &H8
OFN_NODEREFERENCELINKS = &H100000
OFN_NOLONGNAMES = &H40000
OFN_NONETWORKBUTTON = &H20000
OFN_NOREADONLYRETURN = &H8000
OFN_NOTESTFILECREATE = &H10000
OFN_NOVALIDATE = &H100
OFN_OVERWRITEPROMPT = &H2
OFN_PATHMUSTEXIST = &H800
OFN_READONLY = &H1
OFN_SHAREAWARE = &H4000
OFN_SHAREFALLTHROUGH = 2
OFN_SHARENOWARN = 1
OFN_SHAREWARN = 0
OFN_SHOWHELP = &H10
OFN_USEMONIKERS = &H1000000
End Enum
'
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
'
Private Function OpenFileDialog(Optional DialogTitle As String, Optional
sFilter As String, Optional Flags As OFN_Constants, Optional InitialDir As
String, Optional hwndOwner As Long, Optional hInstance As Long) As String
Dim OFName As OPENFILENAME
'
OFName.lStructSize = Len(OFName)
OFName.hwndOwner = hwndOwner
OFName.hInstance = hInstance
OFName.lpstrFilter = "Fichiers jpg (*.jpg)" & vbNullChar & "*.jpg" &
vbNullChar & "Fichiers bitmap (*.bmp)" & vbNullChar & "*.bmp" & vbNullChar &
vbNullChar ' filtres fichiers
OFName.lpstrFile = Space$(254)
OFName.nMaxFile = 255
OFName.lpstrFileTitle = Space$(254)
OFName.nMaxFileTitle = 255
OFName.lpstrInitialDir = InitialDir
OFName.lpstrTitle = "Sélectionner votre image" ' titre
OFName.Flags = OFN_READONLY ' [X] lecture seule
If GetOpenFileName(OFName) Then: OpenFileDialog =
Trim$(OFName.lpstrFile)
'
cheficPH = OFName.lpstrFile
End Function

Sub Command3_Click() 'photo
Call OpenFileDialog 'APPEL

''' SI RETOUR ICI SANS CHARGEMENT PHOTO = FERME L'APPLI !!!

If Len(cheficPH) > 9 Then: Picture1.Picture = LoadPicture(cheficPH)
ChDrive App.Path
ChDir App.Path
End Sub

--
Merci, @+, bye, Joe : ng75@noos.fr
----------------------------------------------------------
Avec une hache, celui qui tient le manche a toujours raison.
----------------------------------------------------------

2 réponses

Avatar
François Picalausa
Bonjour/soir,

Ce code semble être celui de la faq.
Il s'agit donc d'une fonction qui retourne une valeur (la variable cheficPH
est inutile)
Il suffit de stocker le résultat de la fonction et si ce résultat est une
chaine vide, on sait qu'on a annulé.
Note que la procédure à un paramètre permettant de passer des flags. aussi,
il est inutile de le hardcoder dans la fonction.

Dim strFichier As String
strFichier = OpenFileDialog(Paramètres, dont le flag)

If Len(strFichier) Then
'Traitement si fichier
Else
Unload Me
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"le_troll" a écrit dans le message de
news:OJPsA6r$
Bonjour,

Dans l'API GetOpenFileName (ouverture de la boîte de dialogue
donc)
Ça marche si je choisis un fichier pour mettre dans une PictureBoxe,
mais: Si je ferme par la croix [X] rouge, ou <Annuler> ou <Alt+F4>,
ben ça me ferme l'appli, il doit y avoir des params de retour à
rediriger pour éviter ça, mais je ne sais pas lesquels, avez-vous une
idée, voici le code (une tartine cette API):
------------------------------------------------
Dim cheficPH As String * 255
'
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
'
Private Enum OFN_Constants
OFN_ALLOWMULTISELECT = &H200
OFN_CREATEPROMPT = &H2000
OFN_DONTADDTORECENT = &H2000000
OFN_ENABLEHOOK = &H20
OFN_ENABLEINCLUDENOTIFY = &H400000
OFN_ENABLESIZING = &H800000
OFN_ENABLETEMPLATE = &H40
OFN_ENABLETEMPLATEHANDLE = &H80
OFN_EX_NOPLACESBAR = &H1
OFN_EXPLORER = &H80000
OFN_EXTENSIONDIFFERENT = &H400
OFN_FILEMUSTEXIST = &H1000
OFN_FORCESHOWHIDDEN = &H10000000
OFN_HIDEREADONLY = &H4
OFN_LONGNAMES = &H200000
OFN_NOCHANGEDIR = &H8
OFN_NODEREFERENCELINKS = &H100000
OFN_NOLONGNAMES = &H40000
OFN_NONETWORKBUTTON = &H20000
OFN_NOREADONLYRETURN = &H8000
OFN_NOTESTFILECREATE = &H10000
OFN_NOVALIDATE = &H100
OFN_OVERWRITEPROMPT = &H2
OFN_PATHMUSTEXIST = &H800
OFN_READONLY = &H1
OFN_SHAREAWARE = &H4000
OFN_SHAREFALLTHROUGH = 2
OFN_SHARENOWARN = 1
OFN_SHAREWARN = 0
OFN_SHOWHELP = &H10
OFN_USEMONIKERS = &H1000000
End Enum
'
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
'
Private Function OpenFileDialog(Optional DialogTitle As String,
Optional sFilter As String, Optional Flags As OFN_Constants, Optional
InitialDir As String, Optional hwndOwner As Long, Optional hInstance
As Long) As String Dim OFName As OPENFILENAME
'
OFName.lStructSize = Len(OFName)
OFName.hwndOwner = hwndOwner
OFName.hInstance = hInstance
OFName.lpstrFilter = "Fichiers jpg (*.jpg)" & vbNullChar &
"*.jpg" & vbNullChar & "Fichiers bitmap (*.bmp)" & vbNullChar &
"*.bmp" & vbNullChar & vbNullChar ' filtres fichiers
OFName.lpstrFile = Space$(254)
OFName.nMaxFile = 255
OFName.lpstrFileTitle = Space$(254)
OFName.nMaxFileTitle = 255
OFName.lpstrInitialDir = InitialDir
OFName.lpstrTitle = "Sélectionner votre image" ' titre
OFName.Flags = OFN_READONLY ' [X] lecture seule
If GetOpenFileName(OFName) Then : OpenFileDialog > Trim$(OFName.lpstrFile)
'
cheficPH = OFName.lpstrFile
End Function

Sub Command3_Click() 'photo
Call OpenFileDialog 'APPEL

''' SI RETOUR ICI SANS CHARGEMENT PHOTO = FERME L'APPLI !!!

If Len(cheficPH) > 9 Then: Picture1.Picture = LoadPicture(cheficPH)
ChDrive App.Path
ChDir App.Path
End Sub


Avatar
le_troll
Bonjour,

Merci, ça marche, en réponse, petite erreur je pense?

Le problème étant la fermeture de l'appli, ce n'est pas en retour

Unload Me

mais

"Load Me"
-- -----------------------------------
Merci, @+, bye, Joe :
----------------------------------------------------------
Avec une hache, celui qui tient le manche a toujours raison.
----------------------------------------------------------


"François Picalausa" a écrit dans le message de news:
u$w0JVs$
Bonjour/soir,

Ce code semble être celui de la faq.
Il s'agit donc d'une fonction qui retourne une valeur (la variable


cheficPH
est inutile)
Il suffit de stocker le résultat de la fonction et si ce résultat est une
chaine vide, on sait qu'on a annulé.
Note que la procédure à un paramètre permettant de passer des flags.


aussi,
il est inutile de le hardcoder dans la fonction.

Dim strFichier As String
strFichier = OpenFileDialog(Paramètres, dont le flag)

If Len(strFichier) Then
'Traitement si fichier
Else
Unload Me
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"le_troll" a écrit dans le message de
news:OJPsA6r$
> Bonjour,
>
> Dans l'API GetOpenFileName (ouverture de la boîte de dialogue
> donc)
> Ça marche si je choisis un fichier pour mettre dans une PictureBoxe,
> mais: Si je ferme par la croix [X] rouge, ou <Annuler> ou <Alt+F4>,
> ben ça me ferme l'appli, il doit y avoir des params de retour à
> rediriger pour éviter ça, mais je ne sais pas lesquels, avez-vous une
> idée, voici le code (une tartine cette API):
> ------------------------------------------------
> Dim cheficPH As String * 255
> '
> Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
> "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
> '
> Private Enum OFN_Constants
> OFN_ALLOWMULTISELECT = &H200
> OFN_CREATEPROMPT = &H2000
> OFN_DONTADDTORECENT = &H2000000
> OFN_ENABLEHOOK = &H20
> OFN_ENABLEINCLUDENOTIFY = &H400000
> OFN_ENABLESIZING = &H800000
> OFN_ENABLETEMPLATE = &H40
> OFN_ENABLETEMPLATEHANDLE = &H80
> OFN_EX_NOPLACESBAR = &H1
> OFN_EXPLORER = &H80000
> OFN_EXTENSIONDIFFERENT = &H400
> OFN_FILEMUSTEXIST = &H1000
> OFN_FORCESHOWHIDDEN = &H10000000
> OFN_HIDEREADONLY = &H4
> OFN_LONGNAMES = &H200000
> OFN_NOCHANGEDIR = &H8
> OFN_NODEREFERENCELINKS = &H100000
> OFN_NOLONGNAMES = &H40000
> OFN_NONETWORKBUTTON = &H20000
> OFN_NOREADONLYRETURN = &H8000
> OFN_NOTESTFILECREATE = &H10000
> OFN_NOVALIDATE = &H100
> OFN_OVERWRITEPROMPT = &H2
> OFN_PATHMUSTEXIST = &H800
> OFN_READONLY = &H1
> OFN_SHAREAWARE = &H4000
> OFN_SHAREFALLTHROUGH = 2
> OFN_SHARENOWARN = 1
> OFN_SHAREWARN = 0
> OFN_SHOWHELP = &H10
> OFN_USEMONIKERS = &H1000000
> End Enum
> '
> 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
> '
> Private Function OpenFileDialog(Optional DialogTitle As String,
> Optional sFilter As String, Optional Flags As OFN_Constants, Optional
> InitialDir As String, Optional hwndOwner As Long, Optional hInstance
> As Long) As String Dim OFName As OPENFILENAME
> '
> OFName.lStructSize = Len(OFName)
> OFName.hwndOwner = hwndOwner
> OFName.hInstance = hInstance
> OFName.lpstrFilter = "Fichiers jpg (*.jpg)" & vbNullChar &
> "*.jpg" & vbNullChar & "Fichiers bitmap (*.bmp)" & vbNullChar &
> "*.bmp" & vbNullChar & vbNullChar ' filtres fichiers
> OFName.lpstrFile = Space$(254)
> OFName.nMaxFile = 255
> OFName.lpstrFileTitle = Space$(254)
> OFName.nMaxFileTitle = 255
> OFName.lpstrInitialDir = InitialDir
> OFName.lpstrTitle = "Sélectionner votre image" ' titre
> OFName.Flags = OFN_READONLY ' [X] lecture seule
> If GetOpenFileName(OFName) Then : OpenFileDialog > > Trim$(OFName.lpstrFile)
> '
> cheficPH = OFName.lpstrFile
> End Function
>
> Sub Command3_Click() 'photo
> Call OpenFileDialog 'APPEL
>
> ''' SI RETOUR ICI SANS CHARGEMENT PHOTO = FERME L'APPLI !!!
>
> If Len(cheficPH) > 9 Then: Picture1.Picture = LoadPicture(cheficPH)
> ChDrive App.Path
> ChDir App.Path
> End Sub