listigerteppich
Goto Top

VB DirlistBox soll mit letztgeöffnetem Ordner Starten

Hallo beisammen,

ich schreibe an einem kleinen Programm, dass es erlaubt, Dateien aus einem Dateibaum auszuwählen und diese in der Folge zu verschicken. Sehr elegant wäre es wenn das Programm beim Aufruf direkt in den Ordner springt der beim letzten Schließen des Programmes ausgewählt war. Kann mir einer von euch sagen ob/bzw. wie dies umsetzbar ist?

viele Grüße,

Listiger

Content-ID: 130410

Url: https://administrator.de/forum/vb-dirlistbox-soll-mit-letztgeoeffnetem-ordner-starten-130410.html

Ausgedruckt am: 08.04.2025 um 15:04 Uhr

TsukiSan
TsukiSan 27.11.2009 um 14:46:14 Uhr
Goto Top
Du musst dir dafür eine "Gedankenstütze" in Form dieser zuletzt geöffneten Ordner bauen.
Das heisst, lege dir entweder einen Schlüssel in der Registry an, der beim Schließen des Programms sich diese Einstellung merkt, oder speichere dir diese Infos in einer gewöhnlichen Datei ab, die dann jedesmal beim Starten des Progis eingelesen und ausgwertet wird.

Gruss
Tsuki
listigerTeppich
listigerTeppich 27.11.2009 um 15:15:58 Uhr
Goto Top
Danke Tsuki!

Hört sich nach nem guten Vorhaben an. Die Registry-Variante scheidet bei unserer Umgebung aufgrund fehlender schreibrechte zwar aus, die Datei-Variante klingt aber durchaus vielversprechend. Hättest du, oder ein anderer User, zufällig eine Beispiel-Code-Umsetzung zu dieser Vatiante parat?

Danke und Gruß,

Listiger
TsukiSan
TsukiSan 27.11.2009 um 15:37:35 Uhr
Goto Top
Kein Problem.

Du hast dein Programm mit einer DIR-List und vermutlich auch mit einer DRIVE-List
Dann machst du einfach folgendes beim Schließen deines Programmsface-sadVB6)
on error resume next
kill (app.path & "\MyIni.ini" )  
D = Freefile
open app.path & "\MyIni.ini" for append as D  
Print # D, Drive.Drive
Print # D, Dir.Path
close
Damit kannst du deine letzten Daten abspeichern.
Zum Einlesen nimmst du den "umgekehrten" Fall
D = Freefile
open app.path & "\MyIni.ini" for Input as D  
Input # D, temp1$
Input # D, temp2$
close
Drive.Drive = temp1$
Dir.Path = temp2$

So könnte es funktionieren

Gruss
Tsuki
bastla
bastla 27.11.2009 um 20:43:28 Uhr
Goto Top
@tsuki
Zur Frustrationsvorbeugung sollte vielleicht im zweiten Schnipsel in den Zeilen 3 und 4 besser nicht "Print #" stehen ... face-wink

Grüße
bastla
TsukiSan
TsukiSan 27.11.2009 um 23:23:18 Uhr
Goto Top
@bastla,

oh jesses. Danke! und naklar! Muss
Input # D, temp1$
Input # D, temp2$
heissen.

Werd das gleich mal ändern. Wenn das einer liest face-wink

Gruss und schönes Wochenende

Tsuki
listigerTeppich
listigerTeppich 01.12.2009 um 10:38:06 Uhr
Goto Top
Hallo und Danke euch beiden,

hab eben versucht den Code in mein Programm einzubauen und bin dabei auf einige Schwierigkeiten gestoßen, die ich als VB-Anfänger nich selbst in den Griff bekomme.

der Compiler meckert bei folgendem Punkt:

der befehl "open" wurde nicht deklariert -- muss ich hier evtl. noch eine Bibliothek einbinden?

ich arbeite mit der VB 2008er Entwicklungsumgebung

könnte mir hier einer weiterhelfen?

Gruß,

Listiger
TsukiSan
TsukiSan 02.12.2009 um 04:06:22 Uhr
Goto Top
Hallo listiger Teppich,

da ich mit Vb2008 nichts am Hut habe, verweise ich auf die,die sich damit auskennen.

Gruss
Tsuki
listigerTeppich
listigerTeppich 07.12.2009 um 09:33:33 Uhr
Goto Top
Hi Tsuki,

Danke für den Link! Recht kompliziert das ganze, mh naja eigtl würds mir schon reichen wenn mein Programm immer in nem festen Ordner startet, das manövrieren im Dateibaum aber trotzdem noch frei möglich ist. Kannst du mir sagen wie ich das Starten in nem von mir bestimmten Order im Laufwerk "D:\" umsetzen kann?
TsukiSan
TsukiSan 08.12.2009 um 02:35:52 Uhr
Goto Top
Hallo listigerTeppich,

wie schon gesagt, in VB2008 sieht es anders aus, als in VB6 und ich hatte mit VB2008 noch nichts zu tun.
Aber eventuell findest du hier ein passendes Beispiel, welches dir die Anfangsparameter auf "D:\" stellt.
In VB6 würde soetwas so aussehen:
dir1.path = "D:\"  

Gruss
Tsuki
bastla
bastla 08.12.2009 um 16:12:13 Uhr
Goto Top
Hallo listiger Teppich!

Möchtest Du nicht mal Deinen Code (bzw den relevanten Teil davon) posten - das könnte es erleichtern, einen passenden Vorschlag zu machen ...

[Slightly OT}
@tsuki
... hatte mit VB2008 noch nichts zu tun.
Falls sich das ändern solle vielleicht nützlich (zumindest aber gratis face-wink): "Visual Basic 2008 - Das Entwicklerbuch"
[/Slightly OT]

Grüße
bastla
TsukiSan
TsukiSan 09.12.2009 um 06:02:20 Uhr
Goto Top
@bastla,

danke für den Link! Falls es mal für mich aktuell werden sollte - VB2008 habe ich bereits, aber noch nicht installiert, weil "no use" - dann gibt es sehr viele Infos im Netz und auch hier in unserem Forum sehr viele patente Menschen, die mir dann weiterhelfen können face-smile

Vielen Dank und viele Grüße

Tsuki
listigerTeppich
listigerTeppich 04.01.2010 um 10:25:07 Uhr
Goto Top
Hallo beisammen,

Sorry, ich war leider länger nicht da (Krankheit, Urlaub)..ich hoffe ihr schaut trotzdem noch ab und an hier rein. Das Problem den Anfangspfad meiner Dateiauswahl auf den letzgeöffneten Pfad zu legen besteht immer noch. Die vorgeschlagenen Lösung mittels einer ausgelagerten .ini Datei gefällt mir sehr gut. Nur weiss ich eben nicht wie ich das unter vb.net (VB 2008) hinbekomme. Der relevante Codeteil meines Programmes sieht so aus:

  Private Sub Laufwerk1_SelectedIndexChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Laufwerk1.SelectedIndexChanged
        'Laufwerkswechsel an Verzeichnislistenfeld melden  
        On Error Resume Next
        Verzeichnis1.Path = Laufwerk1.Drive
    End Sub

    Private Sub Verzeichnis1_Change(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Verzeichnis1.Change
        'Verzeichniswechsel an Dateilistenfeld melden  
        Datei1.Path = Verzeichnis1.Path
        Datei1.Refresh()
    End Sub

    Private Sub Datei1_SelectedIndexChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Datei1.SelectedIndexChanged
        'Anzahl der markierten Dateien ermitteln  
        'und in Bezeichnungsfeld ausgeben  
        Dim intAnzahl As Short
        Dim i As Short

        intAnzahl = 0
        For i = 0 To Datei1.Items.Count - 1
            If Datei1.GetSelected(i) = True Then
                'Markierung vorhanden  
                intAnzahl = intAnzahl + 1
            End If
        Next i
        'ausgeben  
        lblMarkiert.Text = Str(intAnzahl)
    End Sub
bastla
bastla 04.01.2010 um 12:02:51 Uhr
Goto Top
Hallo listiger Teppich!

Wo in Deinem Programm Du die entsprechende Funktionalität platzierst (insbes das Hinausschreiben des Pfades) musst Du selbst entscheiden - die beiden erforderlichen Codeschnipsel könnten aber etwa so aussehen:
Sub PfadSichern()
     Dim sw As StreamWriter
     Dim Ini As String = "D:\Pfad.ini"  
     Dim Pfad As String = Verzeichnis1.Path

     sw = New StreamWriter(Ini, False)
     sw.WriteLine(Pfad)
     sw.Close()
End Sub

Sub PfadSetzen()
     Dim sr As StreamReader
     Dim Ini As String = "D:\Pfad.ini"  
     Dim Pfad As String = "D:\" 'Defaultwert  

     If File.Exists(Ini) Then
          sr = New StreamReader(Ini)
          If Not sr.EndOfStream Then Pfad = sr.ReadLine
          sr.Close()
     End If

     Laufwerk1.Drive = Pfad
     Verzeichnis1.Path = Pfad
End Sub
Die Variable (oder auch Konstante) "Ini" sollte natürlich besser nur einmal zentral festgelegt werden ...

Grüße
bastla
listigerTeppich
listigerTeppich 05.01.2010 um 11:00:42 Uhr
Goto Top
Jow Prima! Danke Bastla!

war genau das wonach ich gesucht habe. Das wegsichern des Pfades würde ich mit dem Schließen des Programmes verbinden wollen..is auch kein problem soweit..ich tus einfach wegsichern wenn der close button gedrückt wurde..
nur wie schaff ich es, dass ich das PfadSetzen mit dem Programmstart verbinde? Zum Programmstart wird ja keine Action ausgeführt oder?
bastla
bastla 05.01.2010 um 11:12:12 Uhr
Goto Top
Hallo listiger Teppich!
Zum Programmstart wird ja keine Action ausgeführt oder?
Zumindest ein "Form_Load" (zum Code des Ereignisses wie immer per Doppelklick) gibt's sicher auch in Deinem Projekt ...

Grüße
bastla
listigerTeppich
listigerTeppich 05.01.2010 um 17:05:19 Uhr
Goto Top
1A Sache, Problem gelöst ! DANKE Bastla !
bastla
bastla 05.01.2010 um 17:11:40 Uhr
Goto Top
Hallo listiger Teppich!

Freut mich, wenn's klappt. face-smile

Grüße
bastla

P.S.: Ich hab' ja eigentlich nur Tsuki San assistiert ...
listigerTeppich
listigerTeppich 07.01.2010 um 13:09:46 Uhr
Goto Top
Hallo nochmal !

jo, natürlich auch Danke an Tsuki ! Aja, da die Lösung so wunderbar funktioniert hab ich ein wenig Blut geleckt, und möchte noch mehr Variablen in die .ini-Datei auslagern. Dazu müsste man aber im Programm bestimmen können, welche Variable von welcher Zeile der .ini-Datei gespeist werden soll. Habt ihr evtl. auch hierfür ne Lösung?

Grüße,

Listiger
bastla
bastla 07.01.2010 um 17:32:01 Uhr
Goto Top
Hallo listigerTeppich!

Natürlich kannst Du mehrere Variablenwerte auf diese Art speichern:
Sub WerteSichern()
     Dim sw As StreamWriter
     Dim Ini As String = "D:\Pfad.ini"  
     Dim Pfad As String = Verzeichnis1.Path

     sw = New StreamWriter(Ini, False)
     sw.WriteLine(Pfad)
     sw.WriteLine(Variable2) 
     sw.WriteLine(Variable3)
     sw.WriteLine(Variable4)
     sw.Close()
End Sub

Sub WerteHolen()
     Dim sr As StreamReader
     Dim Ini As String = "D:\Pfad.ini"  
     Dim Pfad As String = "D:\" 'Defaultwert  
     Dim Variable2 As String = "Default"  
     Dim Variable3 As String = "Auch Default"  
     Dim Variable4 As String = "Nochmal Default"  

     If File.Exists(Ini) Then
          sr = New StreamReader(Ini)
          If Not sr.EndOfStream Then Pfad = sr.ReadLine
          If Not sr.EndOfStream Then Variable2 = sr.ReadLine
          If Not sr.EndOfStream Then Variable3 = sr.ReadLine
          If Not sr.EndOfStream Then Variable4 = sr.ReadLine
          sr.Close()
     End If

     Laufwerk1.Drive = Pfad
     Verzeichnis1.Path = Pfad
End Sub
Durch das Setzen der Defaultwerte in "WerteHolen" wird für den Fall. dass die "ini"-Datei leer oder unvollständig wäre, vorgebeugt (wobei allerdings nicht Zeilen zwischendurch fehlen dürfen) ...

Grüße
bastla
listigerTeppich
listigerTeppich 22.02.2010 um 15:32:43 Uhr
Goto Top
Hallo Bastla,

jow, klappt echt alles prima, Danke ! Kannst du mir auch bei folgendem problem helfen:
in der erzeugten ini-Datei stehen jetzt verschiedene Werte...bei denen wahrscheinlich kein anderer durchblickt was genau sie darstellen. Gibt es ne Möglichkeit innerhalb der ini-Datei eine Art beschreibenden Text miteinzubringen?

Grüße,

Listiger
bastla
bastla 22.02.2010 um 17:21:08 Uhr
Goto Top
Hallo listiger Teppich!
Gibt es ne Möglichkeit innerhalb der ini-Datei eine Art beschreibenden Text miteinzubringen?
Die gibt es sicher - wie hättest Du's denn gerne?

Grüße
bastla
listigerTeppich
listigerTeppich 22.02.2010 um 17:56:52 Uhr
Goto Top
möglichst einfach, eheheh :D

na, ich hab mir vorgestellt, dasses iwie direkt beim schreiben der Werte in die ini.-Datei noch in der selben Zeile mitgegeben wird was genau das für ein Wert ist.
Wie man das umsetzt weiss ich aber nicht :L

wär cool wenn du ne idee hättest :}


Danke schonma und Gruß,


Listiger
bastla
bastla 22.02.2010 um 18:11:06 Uhr
Goto Top
Hallo listiger Teppich!

Absolut ungetestet etwa so:
Sub WerteSichern()
     Dim sw As StreamWriter
     Dim Delim As String = "|"  
     Dim Ini As String = "D:\Pfad.ini"  
     Dim Pfad As String = Verzeichnis1.Path

     sw = New StreamWriter(Ini, False)
     sw.WriteLine(Pfad)
     sw.WriteLine(Variable2 & Delim & "Erklärung der Variablen2")   
     sw.WriteLine(Variable3 & Delim & "Hinweis zur Variablen3")  
     sw.WriteLine(Variable4 & Delim & "Info über Variable4")  
     sw.Close()
End Sub

Sub WerteHolen()
     Dim sr As StreamReader
     Dim Delim As String = "|"  
     Dim Ini As String = "D:\Pfad.ini"  
     Dim Pfad As String = "D:\" 'Defaultwert  
     Dim Variable2 As String = "Default"  
     Dim Variable3 As String = "Auch Default"  
     Dim Variable4 As String = "Nochmal Default"  

     If File.Exists(Ini) Then
          sr = New StreamReader(Ini)
          If Not sr.EndOfStream Then Pfad = sr.ReadLine
          If Not sr.EndOfStream Then Variable2 = Split(sr.ReadLine, Delim)(0)
          If Not sr.EndOfStream Then Variable3 = Split(sr.ReadLine, Delim)(0)
          If Not sr.EndOfStream Then Variable4 = Split(sr.ReadLine, Delim)(0)
          sr.Close()
     End If

     Laufwerk1.Drive = Pfad
     Verzeichnis1.Path = Pfad
End Sub
Das Trennzeichen ("Delim"; im Beispiel oben "|") solltest Du so wählen, dass es nicht auch innerhalb der Variablenwerte vorkommt.

Geschrieben werden so immer die vorgegebnen Kommentare (zB "Erklärung der Variablen2") - Änderungen an den Kommentaren, die etwa durch direktes Editieren der "ini"-Datei entstanden sind, gehen dabei verloren ...

Grüße
bastla
listigerTeppich
listigerTeppich 04.03.2010 um 16:40:31 Uhr
Goto Top
Hallo Bastla!

jow, das sieht schon echt gut aus, Danke! Hab nur nochn echt bescheuertes Problem mit der Umsetzung. Wenn ich z.B. eine Variable "Datum" hab, und diese mit nem Wert aus der ini-Datei befüllen will, der streamloader aber in der form_load Sub steht, die Variable "Datum" aber z.B. in ner Button_Click -Sub steht, wie bekomm ich das hin, dass die Variable Datum der Button Click Sub mit den Werten der ini-Datei gefüttert wird?

Hoffentlich war die noob Frage wenigstens einigermaßen verständlich gestellt :D

Danke und Gruß,

Listiger
bastla
bastla 04.03.2010 um 16:47:43 Uhr
Goto Top
Hallo listiger Teppich!

Deklariere die entsprechende Variable noch vor dem ersten Sub ...

Grüße
bastla
listigerTeppich
listigerTeppich 19.03.2010 um 11:53:50 Uhr
Goto Top
Besten Dank ! Lappt alles wunderbar :D