| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: ListBox Inhalt automatisch aktualisieren (6260 mal gelesen)
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
  
 Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 24. Feb. 2008 13:38 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen! Ich habe auf einer UserForm 2 ListBoxen, hinter dem jeweils ein Verzeichnis steckt. z.B.: ListBox1 = c:\StartOrdner ListBox2 = y:\ZielOrdner Mittels FileCopy kopiere ich Dateien von einem Ordner in den anderen. Das funktioniert ja auch alles prima. Ich bekomme es aber nicht hin, daß der Inhalt der jeweiligen ListBox nach dem Kopiervorgang automatisch neu angezeigt wird, so das ich direkt nach dem kopieren die eingefügten Dateien sehen kann. Wie bekomme ich das mit der automatischen Aktualisierung hin? Vielen Dank im voraus. Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nepumuk Mitglied Entwicklungsleiter
 
 Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 24. Feb. 2008 13:46 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
Hallo Dirk, ruf doch einfach den selben Code auf, mit dem du die Boxen füllst. Vorher aber noch flugs die Clear-Methode auf die Boxen anwenden, damit nichts doppelt drin steht. ------------------ Gruß Nepumuk  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002 AutoCAD ACA 2024 Solidworks 2022 Sp5 Enterprise PDM 2022 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell Precision 3660 Intel Core i9-12900K 32 GB Arbeitsspeicher 2x Dell U2415
|
erstellt am: 24. Feb. 2008 14:25 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
Hi Dirk, Mit dem Aktualisieren kann ich mich Nepumuk nur anschließen. Warum nutzt du denn da eine Listbox und nicht ein ListView-Steuerelement?! Damit könntest du dann auch ein Explorer-mäßige Darstellung nachahmen. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
  
 Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 25. Feb. 2008 07:40 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen! Da habt Ihr nartürlich recht. Das funktioniert ja auch. Ich hatte mein eigentliches Problem auch falsch geschiltert. Über einen Button wähle ich Objekte in der Zeichnung aus und speicher diese als DXF in einem Verzeichnis ab. Nach dem speichern soll die ListBox DXF aktualisiert werden. Das funktioniert aber erst nach dem erneuten Buttonklick.
Code:
Private Sub cmdObjekte_Click() Dim objDxf As AcadSelectionSet Dim strTempName As String Dim strTempPath As String Dim strFilename As String Dim objExportFile As AcadDocument Me.HideIf (tboCADName.Value = "") Then GoTo MyErrorHandler Select Case Cbo.ListIndex Case 0 'Abspeichern des WBloks unter R 18.dxf strTempPath = OptionenCNC.TextBoxDXF.Text & "\" & tboCADName.Text strFilename = RemoveExtension(ThisDrawing.Name) Set objDxf = ThisDrawing.SelectionSets.Add("dxfcnc"): objDxf.SelectOnScreen ThisDrawing.Wblock strTempPath, objDxf Set objExportFile = ThisDrawing.Application.Documents.Open(strTempPath) With objExportFile .SaveAs ThisDrawing.Path & "\" & tboCADName.Text, acR18_dxf .Close End With strTempPath = RemoveExtension(strTempPath) objDxf.Delete Set objDxf = Nothing Set objExportFile = Nothing Case 1 'Abspeichern des WBloks unter R 14.dxf strTempPath = OptionenCNC.TextBoxDXF.Text & "\" & tboCADName.Text strFilename = RemoveExtension(ThisDrawing.Name) Set objDxf = ThisDrawing.SelectionSets.Add("dxfcnc"): objDxf.SelectOnScreen ThisDrawing.Wblock strTempPath, objDxf Set objExportFile = ThisDrawing.Application.Documents.Open(strTempPath) With objExportFile .SaveAs ThisDrawing.Path & "\" & tboCADName.Text, acR14_dxf .Close End With strTempPath = RemoveExtension(strTempPath) objDxf.Delete Set objDxf = Nothing Set objExportFile = Nothing End Select Exit Sub MyErrorHandler: MsgBox "Bitte CAD-Namen eingeben", 64, "Hinweis" CNCDXFMPR.Show ListBoxDXF.Clear Dim DXFString As String DXFString = OptionenCNC.TextBoxDXF.Text & "\" Dim NurDXF As String NurDXF = Dir(DXFString & "*.dxf") Do While NurDXF <> "" 'Wiederholen bis cFile="" With CNCDXFMPR.ListBoxDXF .AddItem (NurDXF) 'nächste Datei NurDXF = Dir ' Aufruf der Funktion ohne Parameter!! '.ListIndex = 0 End With Loop End Sub
Woran kann dieses liegen? Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 25. Feb. 2008 10:10 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
Hallo Dirk, es liegt daran das du die Routine zum Füllen der Listbox nur in dem Fall aufruftst wenn ein "Fehler" vorliegt. Der tritt seltsamerweise nur auf wenn die Dateiangabe fehlt. Wie Nepumuk und Carsten schon beschrieben haben brauchst du lediglich die Funktion aufrufen, die die Listbox beim Laden des Formulars füllt. Diesen Code hast du ja nicht gepostet. Etwa so könnte es aussehen
Code: Private Sub cmdObjekte_Click() Dim objDxf As AcadSelectionSet Dim strTempName As String Dim strTempPath As String Dim strFilename As String Dim objExportFile As AcadDocument Dim DXF_Format as integer Dim DXF_Dateiname as string Me.Hide DXF_Dateiname = tboCADName.Value if DXF_Dateiname <> "" Then Select Case Cbo.ListIndex Case 0 'Abspeichern des WBloks unter R 18.dxf DXF_Format = acR18_dxf case 1 DXF_Format = acR14_dxf End select strTempPath = OptionenCNC.TextBoxDXF.Text & "\" & tboCADName.Text strFilename = RemoveExtension(ThisDrawing.Name) Set objDxf = ThisDrawing.SelectionSets.Add("dxfcnc"): objDxf.SelectOnScreen ThisDrawing.Wblock strTempPath, objDxf Set objExportFile = ThisDrawing.Application.Documents.Open(strTempPath) With objExportFile .SaveAs ThisDrawing.Path & "\" & tboCADName.Text, DXF_Format .Close End With strTempPath = RemoveExtension(strTempPath) objDxf.Delete Set objDxf = Nothing Set objExportFile = Nothing else MsgBox "Bitte CAD-Namen eingeben", 64, "Hinweis" end if ' Ist das das akuelle Formular ?? CNCDXFMPR.Show FillListbox me.ListBoxDxf, OptionenCNC.TextBoxDXF.Text & "\" end sub function FillListbox(ListBoxDXF as Listbox, Pfad as string) as boolean Dim DXFString As String ListBoxDXF.Clear DXFString = Pfad Dim NurDXF As String NurDXF = Dir(DXFString & "*.dxf") Do While NurDXF <> "" 'Wiederholen bis cFile="" With CNCDXFMPR.ListBoxDXF .AddItem (NurDXF) 'nächste Datei NurDXF = Dir ' Aufruf der Funktion ohne Parameter!! '.ListIndex = 0 End With Loop End function
Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
  
 Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 25. Feb. 2008 17:40 <-- editieren / zitieren --> Unities abgeben:         
Hallo Wilfried! Vielen Dank für Deine Antwort. Ich komme gerade von der EuroShop aus Düsseldorf wieder ins Büro. Dort hatte ich noch Carsten getroffen. Zitat:
' Ist das das akuelle Formular ?? CNCDXFMPR.Show
Ja! Bislang habe ich die ListBox erst nach dem laden des Formulars per Buttonklick gefüllt. Code:
Private Sub cmdListeMPR_Click() ListBoxMPR.Clear Dim MPRString As String MPRString = OptionenCNC.TextBoxMPR.Text & "\" Dim NurMPR As String NurMPR = Dir(MPRString & "*.mpr") Do While NurMPR <> "" With CNCDXFMPR.ListBoxMPR .AddItem (NurMPR) NurMPR = Dir End With Loop End Sub
GrußDirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
  
 Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2021/2022 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 26. Feb. 2008 16:22 <-- editieren / zitieren --> Unities abgeben:         
Hallo Wilfried! Hab mal einiges ausprobiert, aber die ListBox wird immer erst beim zweiten Click aktualisiert. Da ich ja bereits das Klickereignis zum aktualisieren der ListBox habe, ruf ich das mit Code: Call cmdListeDXF_Click
an den entsprechenden Stellen ab. Das habe ich nun auch beim laden des Formulars eingebaut.Code:
Private Sub UserForm_Initialize() ... ... Call cmdListeDXF_Click End Sub
Bei diesem Kopiervorgang funktioniert es super.
Code:
Private Sub cmdkopieren_Click() Dim StartFile As String StartFile = OptionenCNC.TextBoxMPR.Text & "\" Dim CopyName As String Dim g As Integer With ListBoxMPR For g = 0 To .ListCount - 1 If .Selected(g) = True Then CopyName = StartFile & .List(g) FileCopy CopyName, TWNodeFile & .List(g) End If Next g End With Call cmdListeBAZ_Click End Sub
?????? Gruß Dirk
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 26. Feb. 2008 18:32 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
Hallo Dirk, aus den Auschnitten kann man keinen direkten Fehler sehen. Ich bin kein Freund davon einen Eventhandler ("Button_Click") aus einer anderen Funktion aufzurufen. Kapsel doch die Funktion und rufe sie jeweils auf. Hier mal ein Beispiel
Code: Option Explicit Dim FSO As FileSystemObject Const Pfad As String = "C:\TEMP\TEST"Private Sub UserForm_Initialize() '' Du brauchst ein Formular '' mit einer Listbox Name= lst_Listbox '' mit einem Button Name= bt_NeueDatei '' und den Verweis auf Scripting Runtime 'Set FSO = CreateObject("Scripting.FileSystemObject") Set FSO = New FileSystemObject 'Liste füllen FillListview Me.lst_Dateiliste, Pfad End Sub Private Sub BT_NeueDatei_Click() Dim Datei As File Dim Dateiname As String Dateiname = FSO.GetTempName FSO.CreateTextFile Pfad & "\" & Dateiname FillListview Me.lst_Dateiliste, Pfad End Sub Function FillListview(lst_Listbox As Listbox, Pfad As String) Dim Dateiname As String Dim Ordner As Folder Dim Datei As File ' Variante 1 Set Ordner = FSO.GetFolder(Pfad) Me.Caption = Ordner.Files.Count & " Dateien aus " & Pfad lst_Listbox.Clear For Each Datei In Ordner.Files Dateiname = Datei.Name lst_Listbox.AddItem Dateiname Next ' Variante 2 'lst_Listbox.Clear 'Dateiname = Dir(Pfad & "\" & "*.tmp") 'While Dateiname <> "" ' lst_Listbox.AddItem Dateiname ' Dateiname = Dir 'Wend End Function
Wilfried Stelberg------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 26. Feb. 2008 18:37 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
Hallo Dirk, habe gerade noch gesehen das du beim "Button_Click" alle Files mit"*mpr" in die Liste füllst. Du speicherst doch "*dxf". Du hast bestimmt noch einen weiteren Code zum Füllen der Liste versteckt. Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
  
 Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 26. Feb. 2008 20:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo Wilfried! Ich glaube, daß ich das eigentliche Problem nun habe. Die ausgewählten Objekte werden ja als DXF - Datei in ein Verzeichnis gespeichert. Dieser Vorgang dauert ca. 2-3 Sekunden, also wird die neue DXF - Datei erst abgelegt, nachdem die Aktualisierung bereits stattgefunden hat. Kann man da eine Verzögerung oder wie unter Lisp eine pause einbauen? Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002 AutoCAD ACA 2024 Solidworks 2022 Sp5 Enterprise PDM 2022 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell Precision 3660 Intel Core i9-12900K 32 GB Arbeitsspeicher 2x Dell U2415
|
erstellt am: 26. Feb. 2008 20:32 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
  
 Beiträge: 534 Registriert: 25.11.2003
|
erstellt am: 27. Feb. 2008 13:17 <-- editieren / zitieren --> Unities abgeben:         
Hallo Wilfried! Hallo Carsten! Ich habe verschiedene Dinge ausprobiert, aber leider ohne den Erfolg, daß die Listboxen direkt aktualisiert werden. Nun habe ich eine kleine Verzögerung eingebaut. Dieses habe ich im WWW gefunden. Es ist vielleicht nicht die eleganteste Lösung, aber es funktioniert. Programm - Pause erzwingen
Code:
Private Declare Sub apiSleep Lib "kernel32" Alias "Sleep" (ByVal _ lngMilliSeconds As Long)
Der Aufruf erfolgt mit: Code:
Call apiSleep(500)
...und so funktionierts, bis auf, daß wenn ich kein Objekt ausgewählt habe, das Programm abbricht mit der Fehlermeldung, siehe Bildchen. Code:
Private Sub cmdObjekte_Click() Dim objDxf As AcadSelectionSet Dim strTempName As String Dim strTempPath As String Dim strFilename As String Dim objExportFile As AcadDocument Dim DXF_Format As Integer Dim DXF_Dateiname As StringSet objDxf = Nothing Set objExportFile = Nothing Me.Hide DXF_Dateiname = tboCADName.Value If DXF_Dateiname <> "" Then Select Case Cbo.ListIndex Case 0 'Abspeichern des WBloks unter R 18.dxf DXF_Format = acR18_dxf Case 1 'Abspeichern des WBloks unter R 14.dxf DXF_Format = acR14_dxf End Select strTempPath = OptionenCNC.TextBoxDXF.Text & "\" & tboCADName.Text strFilename = RemoveExtension(ThisDrawing.Name) Set objDxf = ThisDrawing.SelectionSets.Add("dxfcnc"): objDxf.SelectOnScreen ThisDrawing.Wblock strTempPath, objDxf Set objExportFile = ThisDrawing.Application.Documents.Open(strTempPath) With objExportFile .SaveAs ThisDrawing.Path & "\" & tboCADName.Text, DXF_Format .Close End With strTempPath = RemoveExtension(strTempPath) objDxf.Delete Set objDxf = Nothing Set objExportFile = Nothing Else MsgBox "Bitte CAD-Namen eingeben", 64, "Hinweis" End If Call apiSleep(500) Call cmdListeDXF_Click CNCDXFMPR.Show End Sub
Gruß
Dirk
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002 AutoCAD ACA 2024 Solidworks 2022 Sp5 Enterprise PDM 2022 Sp5 Pascam Woodworks Visual Studio 2017 Pro Windows 10 64Bit Dell Precision 3660 Intel Core i9-12900K 32 GB Arbeitsspeicher 2x Dell U2415
|
erstellt am: 27. Feb. 2008 13:26 <-- editieren / zitieren --> Unities abgeben:          Nur für Dirk.B
Hi Dirk, Ich denke, das der Fehler doch dann kommt, wenn er den WBlock schreiben will. Wenn du ihm nicht übergibst (Schau dir mal den Selectionset an), wird der Fehler auftauchen. Mach doch vor dem Wblock erstellen ne Abfrage, ob der Selectionset überhaupt Objekte enthält. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |