| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Dateipfad aus Formular generieren (1220 mal gelesen)
|
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 08. Jul. 2020 19:17 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgendes Problem. Es sollen verschiedene Dateien abgespeichert werden. Dazu habe ich eine Eingabemaske als Form erstellt. Darin gibt es eine Textbox. Hier könnte der Anwender einen Dateipfad eintippen. Besser wäre es aber, man hätte ein Eingabefenster, in dem man sich von einem vorgegebenen Startpfad durch die Ordner klicken kann und gegebenenfalls neue Ordner erstellt, bis man den endgültigen Speicherort hat. Diesen Speicherort möchte ich dann als String an mein Programm übergeben. Ich bin sicher, so eine Funktion gibt es schon irgendwo, da man das ja bei vielen Anwendungen sieht. Aber wo und unter welchem Stichwort finde ich dazu etwas? . Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meierjo Mitglied
Beiträge: 358 Registriert: 20.08.2003
|
erstellt am: 09. Jul. 2020 06:58 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo Mit diesem Code erhälst du eine Auswahl, wo du die Datei speichern möchtest. Vorbelegt wird der Pfad mit dem Projektpfad Code: Sub Exp_Test() Dim FSO As New FileSystemObject Dim MyFolder As Folder Dim MySubFolder As Folder Dim sPath As String Dim oDesignProjectMgr As DesignProjectManager Set oDesignProjectMgr = ThisApplication.DesignProjectManager Dim oFileDlg As Inventor.FileDialog ' FileDialog Call ThisApplication.CreateFileDialog(oFileDlg) 'sPath = oDesignProjectMgr.ActiveDesignProject.WorkspacePath & "\Export\" 'sPath = ThisApplication.FileLocations.Workspace & "\Export\" sPath = oDesignProjectMgr.ActiveDesignProject.WorkspacePath & "\" Set MyFolder = FSO.Getfolder(sPath) oFileDlg.ShowSave End Sub
Gruss Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 10. Jul. 2020 06:22 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo zusammen, unter VBA lief der Code von Meierjo bei mir nicht. Ich habe ihn leicht abgewandelt:
Code: Sub Exp_Test() Set FSO = CreateObject("Scripting.FileSystemObject") 'Hier geändert Dim MyFolder As String 'Hier geändert Dim MySubFolder As String 'Hier geändert Dim sPath As String Dim oDesignProjectMgr As DesignProjectManager Set oDesignProjectMgr = ThisApplication.DesignProjectManager Dim oFileDlg As Inventor.FileDialog ' FileDialog Call ThisApplication.CreateFileDialog(oFileDlg) 'sPath = oDesignProjectMgr.ActiveDesignProject.WorkspacePath & "\Export\" 'sPath = ThisApplication.FileLocations.Workspace & "\Export\" sPath = oDesignProjectMgr.ActiveDesignProject.WorkspacePath & "\" MyFolder = FSO.Getfolder(sPath) 'Hier geändert oFileDlg.ShowSave End Sub
Allerdings erwartet der Dialog die Auswahl eines Dateinamens und übergibt nicht einfach einen gewählten Ordner. Was wären hierfür die entsprechenden Abwandlungen um den Inventor FileDialog zu nutzen. Kann der Inv FD das überhaupt? Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meierjo Mitglied
Beiträge: 358 Registriert: 20.08.2003
|
erstellt am: 10. Jul. 2020 06:45 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
|
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 10. Jul. 2020 07:13 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Ich hatte Frankxx so verstanden, dass er einen Zielordner zum Speichern von ggf. mehreren Dateien anwählen wollte. Dafür ist folgender Code unter VBA geeignet
Code: 'Dialog zur Wahl / Erstellung eines Ordners Public Function Ordnerauswahl() As String Dim AppShell As Object Dim BrowseDir As Variant Dim SPfad As String Set AppShell = CreateObject("Shell.Application") Set BrowseDir = AppShell.BrowseForFolder(0, "Ordner auswählen", &H1000, 17) On Error Resume Next SPfad = BrowseDir.items().Item().Path If SPfad = "" Then Exit Function 'MsgBox SPfad, , "Ordnerwahl" Ordnerauswahl = SPfad & "\" On Error GoTo 0 End Function
Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meierjo Mitglied
Beiträge: 358 Registriert: 20.08.2003
|
erstellt am: 10. Jul. 2020 07:59 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
|
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 10. Jul. 2020 08:56 <-- editieren / zitieren --> Unities abgeben:
Hallo EIBe 3D und Meierjo, ich habe den Code von EIBe 3D kurz getestet und es entspricht dem, was ich gesucht habe. Ich muss nur noch im Detail verstehen, was da passiert, bin ja noch Anfänger, aber dafür nehme ich mir demnächst etwas Zeit. Also vielen Dank für die Hilfe. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 10. Jul. 2020 10:57 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Eine Function hat standardmässig einen Rückgabewert. In dem Fall wird der unter sPfad ausgewählte Ordner unter Ergänzung von \ in die Funktion Ordnerwahl geschrieben. Der Ausruf aus deinem Programm lautet z.B.
Pfad = Ordnerauswahl() oder falls du die Funktion in ein anderes Modul ausgelagert hast z.B. Pfad = UProgs.Ordnerauswahl() UProgs entspricht dem Namen des Moduls in dem die Function liegt. Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 10. Jul. 2020 11:20 <-- editieren / zitieren --> Unities abgeben:
Das habe ich soweit verstanden. Gibt es eine Möglichkeit die Funktion derart anzupassen, dass am Beginn der Suche ein vorgegebener Startordner sStartpfad und nicht "Dieser PC" steht? Als Startordner sStartpfad könnte ich z.B. den Verzeichnispfad der geöffneten Datei setzen. Wie ich diesen String generiere, habe ich inzwischen gelernt. Aber ich weiß nicht, wo der in Deiner Funktion hinterlegt werden muss, damit die Ordnersuche dort startet. Ich bin mit den dort verwendeten Funktionen noch nicht vertraut. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 10. Jul. 2020 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Du Kannst einen RootFolder voreinstellen, allerdings kann man dann keine Ebene ÜBER diesem Root Folder anwählen. Vielleicht gibts ja noch ne Möglichkeit die mir gerade nicht einfällt. Suchst du unter BrowseForFolder findest du entsprechende Beschreibungen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 10. Jul. 2020 13:21 <-- editieren / zitieren --> Unities abgeben:
|
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 15. Jul. 2020 21:46 <-- editieren / zitieren --> Unities abgeben:
Ich habe jetzt den Code zum Erstellen des Verzeichnisses in ein Formular eingebunden. Wenn man auf den Button btnSuchen_Click() klickt, öffnet sich das Browserfenster und man kann durch die Verzeichnisse wechseln, oder neue Verzeichnisse erstellen. Nach ENTER wird das letzte Verzeichnis noch mal in der MsgBox angezeigt. Wie greife ich nun z.B. vom Button btnTest_Click()auf den oben generierten Pfad z.B. als String zu? Private Sub btnSuchen_Click() 'Dialog zur Wahl / Erstellung eines Ordners Dim oAppShell As Object Dim vBrowseDir As Variant Dim sPfad As String Set oAppShell = CreateObject("Shell.Application") Set vBrowseDir = oAppShell.BrowseForFolder(0, "Ordner auswählen", &H1000, 17) On Error Resume Next sPfad = vBrowseDir.items().Item().Path If sPfad = "" Then Exit Sub MsgBox (sPfad & "\") On Error GoTo 0 End Sub Private Sub btnTest_Click() ' Testbutton Dim sTest As String sTest = btnSuchen() ' Wie muss diese Zeile lauten, damit sTest der Wert des generierten Zielpfades zugewiesen wird???? Bei mir gibt es nur eine Fehlermeldung. MsgBox (sTest & "\") End Sub . Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 15. Jul. 2020 22:18 <-- editieren / zitieren --> Unities abgeben:
|
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 16. Jul. 2020 08:17 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo Frankx, ohne jetzt genau geschaut zu haben. Globale Variablen möglichst vermeiden. Dafür eine Variable übergeben und zurück schreiben. Public Sub btnSuchen_Click(Ordnerpfad As String) . . . . Ordnerpfad = btnSuchen() . . End Sub Im aufrufenden Programm Setzt du Die Variable Vor Aufruf auf Ordnerpfad = "" Nach Aufruf ist Ordnerpfad = C:\xxx
Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 16. Jul. 2020 08:21 <-- editieren / zitieren --> Unities abgeben:
|
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 16. Jul. 2020 08:35 <-- editieren / zitieren --> Unities abgeben:
Bei mir gibt es schon hier die erste Fehlermeldung: Public Sub btnSuchen_Click(Ordnerpfad As String) Compile Error Procedure declaration does not match description of event or procedure having the same name Ich denke es könnte dem Formular zu tun haben. Vielleicht ist bei den xxxx_Click() so eine Übergabe nicht vorgesehen? . Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 16. Jul. 2020 08:55 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Private Sub btnSuch_Click() 'Dialog zur Wahl / Erstellung eines Ordners Dim oAppShell As Object Dim vBrowseDir As Variant Dim sPfad As String Set oAppShell = CreateObject("Shell.Application") Set vBrowseDir = oAppShell.BrowseForFolder(0, "Ordner auswählen", &H1000, 17) On Error Resume Next sPfad = vBrowseDir.items().Item().Path If sPfad = "" Then Exit Sub Call btnTest(sPfad) MsgBox (sPfad & "\") On Error GoTo 0 Unload Me End Sub Private Sub btnTest(sPfad As String) ' Testbutton Dim sTest As String sTest = sPfad ' Wie muss diese Zeile lauten, damit sTest der Wert des generierten Zielpfades zugewiesen wird???? 'Bei mir gibt es nur eine Fehlermeldung. MsgBox (sTest & "\") End Sub So klappts bei mir
Grüße
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 16. Jul. 2020 09:03 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
So wie ich es verstehe, gibt es auf dem Formular den Button "btnSuchen". Die Funktion von diesem scheint soweit geklärt. Gibt es die Textbox mit dem Dateipfad nicht mehr? Mein Vorgehen wäre es, die Textbox entweder von Hand zu befüllen (User tippt oder kopiert den Pfad da rein), oder durch den "btnSuchen". Dh. in dem Sub btnSuchen_Click wird am Ende der sPfad in die Textbox geschrieben. Der eigentliche Programm-Ablauf benötigt dann "btnSuchen" gar nicht, sondern greift sich nur den Text/Pfad aus der Textbox. Dieser sollte natürlich zu Beginn überprüft werden, ob er existiert (evtl. gibt es noch weitere Kriterien). OT damit wäre die Textbox nichts groß anderes als eine Variable auf Modul- bzw. Formularebene /OT Sorry, falls ich das alles zu flüchtig gelesen habe und am Thema vorbei schreibe. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 16. Jul. 2020 09:13 <-- editieren / zitieren --> Unities abgeben:
Bei Dir ist btnTest(sPfad) aber kein Button im Formular? Der müsste doch btnTest_Click() bezeichnet werden. Aber da gibt es immer die Fehlermeldung, sobald ich versuche, etwas in die Klammern zu scheiben, also z.B.: btnTest_Click(sPfad) Das _Click bedeutet doch, dass das Sub btnTest nach Anklicken des Buttons gestartet wird. Ich kann es also nicht einfach weglassen. Na ja, zur Not muss es eben doch mit den globalen Variablen funktionieren. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 16. Jul. 2020 09:28 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Ja nur ein Button in obigen Beispiel. Ich hatte es nur schnell zurechtgefummelt um zu zeigen wie du den Pfad in eine andere Sub bekommst. Obiges Bsp greift auf den Button btnSuchen_Click() zu. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |