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-Key: 130410

Url: https://administrator.de/contentid/130410

Printed on: April 25, 2024 at 22:04 o'clock

Member: TsukiSan
TsukiSan Nov 27, 2009 at 13:46:14 (UTC)
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
Member: listigerTeppich
listigerTeppich Nov 27, 2009 at 14:15:58 (UTC)
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
Member: TsukiSan
TsukiSan Nov 27, 2009 at 14:37:35 (UTC)
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
Member: bastla
bastla Nov 27, 2009 at 19:43:28 (UTC)
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
Member: TsukiSan
TsukiSan Nov 27, 2009 at 22:23:18 (UTC)
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
Member: listigerTeppich
listigerTeppich Dec 01, 2009 at 09:38:06 (UTC)
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
Member: TsukiSan
TsukiSan Dec 02, 2009 at 03:06:22 (UTC)
Goto Top
Hallo listiger Teppich,

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

Gruss
Tsuki
Member: listigerTeppich
listigerTeppich Dec 07, 2009 at 08:33:33 (UTC)
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?
Member: TsukiSan
TsukiSan Dec 08, 2009 at 01:35:52 (UTC)
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
Member: bastla
bastla Dec 08, 2009 at 15:12:13 (UTC)
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
Member: TsukiSan
TsukiSan Dec 09, 2009 at 05:02:20 (UTC)
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
Member: listigerTeppich
listigerTeppich Jan 04, 2010 at 09:25:07 (UTC)
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
Member: bastla
bastla Jan 04, 2010 at 11:02:51 (UTC)
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
Member: listigerTeppich
listigerTeppich Jan 05, 2010 at 10:00:42 (UTC)
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?
Member: bastla
bastla Jan 05, 2010 at 10:12:12 (UTC)
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
Member: listigerTeppich
listigerTeppich Jan 05, 2010 at 16:05:19 (UTC)
Goto Top
1A Sache, Problem gelöst ! DANKE Bastla !
Member: bastla
bastla Jan 05, 2010 at 16:11:40 (UTC)
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 ...
Member: listigerTeppich
listigerTeppich Jan 07, 2010 at 12:09:46 (UTC)
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
Member: bastla
bastla Jan 07, 2010 at 16:32:01 (UTC)
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
Member: listigerTeppich
listigerTeppich Feb 22, 2010 at 14:32:43 (UTC)
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
Member: bastla
bastla Feb 22, 2010 at 16:21:08 (UTC)
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
Member: listigerTeppich
listigerTeppich Feb 22, 2010 at 16:56:52 (UTC)
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
Member: bastla
bastla Feb 22, 2010 at 17:11:06 (UTC)
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
Member: listigerTeppich
listigerTeppich Mar 04, 2010 at 15:40:31 (UTC)
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
Member: bastla
bastla Mar 04, 2010 at 15:47:43 (UTC)
Goto Top
Hallo listiger Teppich!

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

Grüße
bastla
Member: listigerTeppich
listigerTeppich Mar 19, 2010 at 10:53:50 (UTC)
Goto Top
Besten Dank ! Lappt alles wunderbar :D