Suite

Boîte de dialogue Ouvrir un fichier de toute extension

Boîte de dialogue Ouvrir un fichier de toute extension


GetOpenFilename ne fonctionne pas dans arcobjects VBA, je dois donc utiliser pGxDialog.

Le standard pGxDialog ne permet pas d'ouvrir n'importe quel fichier que je veux, quelques extensions sont disponibles uniquement (shp, dxf, xls… ).

Peut-être que je ne sais tout simplement pas comment définir un filtre.

Je n'ai pas besoin d'ouvrir des fichiers d'extension supplémentaires pour la lecture/écriture, j'ai juste besoin de renvoyer le PATH du document à une variable, qui sera utilisée plus tard dans le code.

Je script en VBA, arcgis 10.2.2


Vous pouvez appeler directement la dll de l'objet COM

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 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 Function f_OpenFileName (Titre' As String) As String Dim OpenFile As OPENFILENAME Dim lReturn As Long Dim sFilter As String OpenFile.lStructSize = Len(OpenFile) 'Filter sFilter = "prj" & Chr(0) & "*.prj" & Chr(0) & Chr(0) OpenFile. lpstrFilter = sFilter OpenFile.nFilterIndex = 1 OpenFile.lpstrFile = String(257, 0) OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1 OpenFile.lpstrFileTitle = O penFile.lpstrFile OpenFile.nMaxFileTitle = OpenFile.nMaxFile ' chemin par défaut OpenFile.lpstrInitialDir = "c:" 'Title OpenFile.lpstrTitle = Titre OpenFile.flags = 0 lReturn = GetOpenFileName(OpenFile) Si lReturn = 0 Then 'message f_OpenFileName = 0 Sinon f_OpenFileName = Trim(OpenFile.lpstrFile) End If End Function

utiliser la fonction :

Dim txtSelectFile As String path = f_OpenFileName( "Sélectionnez un fichier" )

C'est essentiellement le travail de Radar dans une réponse à une question similaire, en utilisant les mêmes ArcObjects que Hornbydd.

J'ai modifié la fonction de Radar pour que mes clients sélectionnent un fichier texte délimité, puis cette fonction renvoie à la fois le chemin d'accès au fichier sélectionné et le nom du fichier. Cela répond à la demande d'Alex de "… renvoyer le PATH du document à une variable"

Je l'ai un peu réduit pour qu'il utilise uniquement les bibliothèques ArcObjects de base.

Fonction publique BrowseForTextFile (ByVal sTitle As String, ByRef sFolder As String, ByRef sName As String) As Boolean 'Source: Radar /questions/9000/opening-geodatabase-files-using-browse-dialog-command-vb-net-c- of-arcobjects Dim pGxDialog As IGxDialog = Nouveau GxDialog Dim pGxObjectFilter As IGxObjectFilter = New ESRI.ArcGIS.Catalog.GxFilterTextFiles() Dim pFilterCol As IGxObjectFilterCollection Dim pEnumGx "Collection d'objets pEnumGx As IEnumGxF" AddFilter(pGxObjectFilter, True) pGxDialog.RememberLocation = True pGxDialog.AllowMultiSelect = False pGxDialog.Title = sTitle Si pGxDialog.DoModalOpen(0, pEnumGx) Alors pGxObject = pEnumGx.NextName.Name Fin si fonction de fin

Vous pouvez appeler cela avec

Importe ESRI.ArcGIS.Catalog 'pour IGxObjectFilter Importe ESRI.ArcGIS.CatalogUI 'pour IGXdialog Friend m_sFilePathName As String '… snipped Dim sCSVPath As String Dim sCSVName As String If BrowseForTextFile("Choisissez ensuite un fichier texte à charger, sCSVPath", sCSVPath m_sFilePathName = sCSVPath & "" & sCSVName MsgBox("Le fichier que vous avez choisi était " & m_sFilePathName,MsgBoxStyle.Information, "Result") Else 'Rien choisi, Abandonner Exit Sub End If

Dans ce cas, tout ce que je veux afficher dans la boîte de dialogue sont des fichiers texte délimités, j'utilise donc 'GxObjectFilter' de 'GxFilterTextFiles'. Vous pouvez spécifier « GxFilterFiles » si vous souhaitez simplement pouvoir sélectionner « n'importe quel fichier »

Il existe également des scores sur des scores de coclasses et de classes pour chaque objet dans ArcCatalog si vous devez filtrer la boîte de dialogue du navigateur sur un autre type. Par exemple, vous pouvez utiliser 'GxFilterMaps' pour cibler les documents .mxd ou 'GxFilterFileGeodatabases' pour spécifier les FGDB. Vous pouvez être encore plus précis, par exemple pour ne choisir des classes d'entités dans les géodatabases fichier que si c'est ce que vous devez faire.


Ci-dessous le code dont vous avez besoin :

Public Sub OpenDataset () ' Ouvre une boîte de dialogue permettant à l'utilisateur de sélectionner FeatureClasses Dim pEnumGXObject As IEnumGxObject Set pEnumGXObject = Nothing Dim pGxDialog As IGxDialog Dim pGXObjectFilter As IGxObjectFilter Set pGXObjectFilter = New GxFilter With pGxDiatleClasses Set = pGxDialog Sélectionnez un fichier" .ButtonCaption = "Select" Set .ObjectFilter = pGXObjectFilter .DoModalOpen 0, pEnumGXObject End With pEnumGXObject.Reset Dim pGxobject As IGxObject Set pGxobject = pEnumGXObject.Next MsgBox pGxobject.FullName End Sub

Je sais que la question était spécifiquement pour VBA et qu'elle est un peu datée, mais comme j'ai trouvé cette question dans la recherche d'une solution à ma situation similaire, en utilisant c#.net, je publierai la solution que j'ai trouvée.

Tout d'abord, pour ouvrir une extension non déjà fournie par Catalog, vous devez définir votre propre classe de filtre GX personnalisée. Ci-dessous, je crée un filtre pour les extensions XML.

classe publique GxCustomFilter : ESRI.ArcGIS.Catalog.IGxObjectFilter { privé IGxObjectFilter _basicFilter; public GxCustomFilter(){ _basicFilter = new GxFilterBasicTypesClass(); } public bool CanChooseObject(ESRI.ArcGIS.Catalog.IGxObject obj, ref ESRI.ArcGIS.Catalog.esriDoubleClickResult result) { //Définir si l'objet sélectionné peut être choisi bool bCanChoose = false; bCanChoose = false; if (obj est IGxFile) { chaîne sExt = null; sExt = GetExtension(obj.Nom); if (sExt.ToLower() == ".xml") // définissez votre extension ici bCanChoose = true; } return bCanChoose; } public bool CanDisplayObject(ESRI.ArcGIS.Catalog.IGxObject obj) { //Vérifier si les objets peuvent être affichés try { //Vérifier les objets peuvent être affichés si (_basicFilter.CanDisplayObject(obj)) return true; else if (obj est IGxFile) { string sExt = null; sExt = GetExtension(obj.Nom); if (sExt.ToLower() == ".xml") // définissez votre extension ici return true; } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.ToString()); } renvoie faux ; } public bool CanSaveObject(ESRI.ArcGIS.Catalog.IGxObject Location, chaîne newObjectName, ref bool objectAlreadyExists) { return false; } chaîne publique Description { get { //Définir la description du fichier return "eXtensible Markup Language (.xml)" ; } } public string Name { get { //Définir le nom du filtre return "XML filter"; } } chaîne privée GetExtension(chaîne sFileName) { chaîne tempGetExtension = null; //Obtenir l'extension longue pExtPos = 0; pExtPos = (sFileName.LastIndexOf(".") + 1); if (pExtPos > 0) tempGetExtension = sFileName.Substring((Int32)pExtPos - 1); else tempGetExtension = ""; return tempGetExtension; } }

Ensuite, dans votre GxDialog, vous utilisez la classe personnalisée pour définir un ObjectFilter. Vous devez également définir des filtres de fichiers sur le GxDialog.InternalCatalog.

IGxDialog gxDialog = new GxDialog(); IGxCatalog gxCat = gxDialog.InternalCatalog; IGxFileFilter fileFilter = gxCat.FileFilter; if (fileFilter.FindFileType("XML") < 0) { fileFilter.AddFileType("XML", "eXtensible Markup Language ", ""); } IGxObjectFilter objFilter = new GxCustomFilter(); gxDialog.ObjectFilter = objFilter;

Si vous souhaitez utiliser le filtre avec un GxDialog.DoModalSave(), vous devez modifier la propriété de classe de filtre personnalisée CanSaveObject pour qu'elle renvoie true.

J'espère que cela aidera quelqu'un, car j'ai passé plus de temps que je ne l'aurais souhaité à le découvrir.


Voir la vidéo: EKAA KERTAA LUMILAUDALLA huvittavaa