VB6; CommonDialog

Hallo,
Ich überarbeite ein VB 6-Programm und stoße dabei auf Probleme.

Der CommonDialog zum Speichern einer Datei aus .FileName = in das Arbeitsverzechnis CurDir() funktioniert.
Problem:
Speichern in ein neues Verzeichnis, das nicht das Arbeitsverzeichnis ist und mit .initDir = zugewiesen wurde; nicht ausgewählt.
Ansatz:
Dieses Verzeichnis wurde vorher mit mkDir erzeugt. Die Zuweisung bei .initDir = wird akzeptiert.
Das anschließende Speichern der Datei mit .Flags = &H08&; .Flags = &H02&; .Action = 2 findet in .initDir statt; wie oben.
Danach (.Action = 2) ist der neue Pfad (.initDir) zum CurDir() geworden.
Und das Verzeichnis ist solange gesperrt, bis ich eine neue Datei lade.
Wenn in einem neuen Durchlauf das gleiche Verzeichnis erneut angesprochen wird, gibt es eine Fehlermeldung 75.
Frage:
Wie kann ich das ursprüngliche Arbeitsverzeichnis zurücksetzen?
Wie umgehe ich die Fehlermeldung, dass das Verzeichnis schon existiert?
Wie gebe ich dass neue Verzeichnis nach Abschluss des Speichervorgangs sofort frei.

Vielen Dank schon mal für die Hilfe
kps

Hallo,

ich hab’s mal getestet, allerdings erst mal ohne Commondialog, so war es bequemer. :smile:

Option Explicit

Private Declare Function PathFileExists Lib "shlwapi.dll" \_
 Alias "PathFileExistsA" (ByVal pszPath As String) As Long


Private Sub Command1\_Click()
 Dim Pfad As String
 Dim na As String
 Dim txt As String
 txt = Text1.Text

 na = "\Testdatei.txt"
 Pfad = "C:\Users\Papa\Documents\Testordner1\Testordner2\Testordner3"
 If Pfad "" Then
 mc Pfad
 Open Pfad & na For Output As #1
 Print #1, txt
 Close #1
 End If
End Sub

Private Sub mc(ByVal Pfad As String)
 Dim Pos As String, tmp As String
 Do While PathFileExists(Pfad) = False
 Pos = InStrRev(Pfad, "\")
 If Pos = 0 Then MsgBox "Laufwerk nicht gefunden!", vbCritical: End
 tmp = Left(Pfad, Pos - 1)
 mc tmp
 MkDir Pfad
 Loop
End Sub

Das Programm legr erst den Ordner ‚Testordner1‘ an, dann 2, dann 3, dann wird die Datei in Testordner3 geschrieben. Das läuft ohne Problem. An MkDir liegt Dein Problem nicht. Die Verzeicnisse werden nicht gesperrt.

Wenn Du Code zeigst, kann ich nach Deinem Fehler suchen. VB verursacht den Fehler nicht, den musst Du in Deinem Code suchen.

Gruß Rainer

Hallo
und Danke für den Code.
Ich habe es auch mit mkDir und einem kompletten Pfad versucht.
Der Ordner wird angelegt.
Der Dialog zum Speichern soll z.B. mit .initDir automatisch in dieses Verzeichnis gehen. Funktioniert auch.
Wenn ich aber im Dialog auf Abbruch statt OK klicke, gibt es Fehlermeldungen (75, 32755), die zwar behandle, aber irgend wie nicht korrekt.
Bei Abbruch soll der Ordner gelöscht werden. Dieser ist
a) gesperrt (MS Explorer, Eigenschaften
b) evtl. nicht leer.
Es haut nicht hin.

by The way: Wie kann ich mit cmdButton eine .doc oder .pdf starten (keine Datenübernahme ins Programm, nur laden und anzeigen)

Danke und vG

der KPS

nicht ausführbare Datei doc pdf starten

by The way: Wie kann ich mit cmdButton eine .doc oder .pdf
starten (keine Datenübernahme ins Programm, nur laden und
anzeigen)

Hallo KPS,

API-Funktion shellexecute
http://www.activevb.de/tipps/vb6tipps/tipp0416.html

Gruß
Reinhard

Hallo,

und Danke für den Code.
Ich habe es auch mit mkDir und einem kompletten Pfad versucht.
Der Ordner wird angelegt.
Der Dialog zum Speichern soll z.B. mit .initDir automatisch in
dieses Verzeichnis gehen. Funktioniert auch.
Wenn ich aber im Dialog auf Abbruch statt OK klicke, gibt es
Fehlermeldungen (75, 32755), die zwar behandle, aber irgend
wie nicht korrekt.
Bei Abbruch soll der Ordner gelöscht werden. Dieser ist
a) gesperrt (MS Explorer, Eigenschaften
b) evtl. nicht leer.
Es haut nicht hin.

Ohne Deinen Code kann ich nur raten, was falsch ist. Wenn Windows meint, das verzeichnis wäre nicht leer, dann ist es nicht leer. Eventuell versuchst Du ein anderes als das gerade neu angelegte Verzeichnis zu löschen?

Ich lege mal ein Verzeichnis an, rufe den Kommondialog auf und klicke da auf Abbruch. Wenn auf Abbruch geklickt wird, soll das neu angelegte Verzeichnis wieder gelöscht werden …

Private Sub Command1\_Click()
 Dim ret As VbVarType
 MkDir App.Path & "\Test1\"
 CommonDialog1.InitDir = App.Path & "\Test1\"
 CommonDialog1.CancelError = False
 CommonDialog1.FileName = ""
 CommonDialog1.ShowSave
 If CommonDialog1.FileName "" Then
 'Datei sichern
 'Open CommonDialog1.FileName For Output As #ff
 Else
 RmDir CommonDialog1.InitDir
 End If
End Sub

Läuft. Kein Problem.

by The way: Wie kann ich mit cmdButton eine .doc oder .pdf
starten (keine Datenübernahme ins Programm, nur laden und
anzeigen)

Shellexecute hat Dir Reinhard ja schon gezeigt.

Gruß Rainer

Noch ein Code
Hi,

Du schreibst ja etwas von Fehlerbehandlung, deshalb vermute ich mal, daß Du mit dem ErrorCode arbeiten möchtest.

Noch ein Code, der das selbe macht, wie der vorhergehende, nur unter Verwendung der Fehlerbehandlung. Läuft aber auch ohne Problem, ohne Fehlermeldung.

Ich mag ‚On Error Goto‘ nicht, das macht das Programm unübersichtlich. :smile:

Option Explicit

Private Sub Command1\_Click()
 MkDir App.Path & "\Test1\"
 CommonDialog1.InitDir = App.Path & "\Test1\"
 CommonDialog1.CancelError = True
 On Error GoTo err
 CommonDialog1.ShowSave
 'Datei sichern
 'Open CommonDialog1.FileName For Output As #ff
 Exit Sub
err:
 On Error GoTo 0
 RmDir CommonDialog1.InitDir
End Sub

Gruß Rainer

Hallo Rainer,

Noch ein Code, der das selbe macht, wie der vorhergehende, nur
unter Verwendung der Fehlerbehandlung. Läuft aber auch ohne
Problem, ohne Fehlermeldung.

glaub ich dir, wird bei mir auch laufen denn ich hab an meinem PC alle Rechte. Bei Netzwerk-usern kann das anders sein.

Ich mag ‚On Error Goto‘ nicht, das macht das Programm
unübersichtlich. :smile:

Mich stört einzig daran daß ich den Namen der Fehlerbehandlungs routine nicht einrücken kann, also nur optisches Problem.
Ansonsten ist das doch Klasse, man erfährt Fehlernummer, -Art und
auch die Codezeile in der er entsteht.

Übrigens, err, was ja in Vb(a) bekannt ist als Namen benutzen? Tsts :smile:)

cancelerror und initdir gibts nicht in Vba, okay, habe nachgelesen in VB. Schon klar was die tun.
Was auch in VB so sein wird, nur ChDir zu benutzen ist ein Risiko da nicht sicher.
Sicher ist das
ChDrive „C“
ChDir „C:\test\abc“

Ja, die Syntax bei ChDrive ist korrekt *gg*. May be bei InitDir
spielt das auch die Rolle wie bei ChDir, k.A.

Gruß
Reinhard, der sich auf die nächsten Tage freut, da solls kühler werden :smile:

Hallo Reinhard,

glaub ich dir, wird bei mir auch laufen denn ich hab an meinem
PC alle Rechte. Bei Netzwerk-usern kann das anders sein.

oder bei Windows7. :smile: Aber der Beispielpfad hat ja mit dem Code nichts zu tun.

Ich mag ‚On Error Goto‘ nicht, das macht das Programm
unübersichtlich. :smile:

Mich stört einzig daran daß ich den Namen der
Fehlerbehandlungs routine nicht einrücken kann, also nur
optisches Problem.
Ansonsten ist das doch Klasse, man erfährt Fehlernummer, -Art
und
auch die Codezeile in der er entsteht.

Ich hab’s lieber, wenn es keine Fehler zu behandeln gibt. :smile:

Übrigens, err, was ja in Vb(a) bekannt ist als Namen benutzen?
Tsts :smile:)

Tippfaul. Aber Du hast mal wieder Recht, ‚Fehlerbehandlung‘ wäre schöner gewesen.

cancelerror und initdir gibts nicht in Vba, okay, habe
nachgelesen in VB. Schon klar was die tun.
Was auch in VB so sein wird, nur ChDir zu benutzen ist ein
Risiko da nicht sicher.
Sicher ist das
ChDrive „C“
ChDir „C:\test\abc“

Ja, die Syntax bei ChDrive ist korrekt *gg*. May be bei
InitDir
spielt das auch die Rolle wie bei ChDir, k.A.

Der Coomondialog ist ein OCX, InitDir eine seiner Eigenschaften. Bei Bedarf das Laufwerk wechseln erledigt der Code im OCX.

Gruß Rainer

Hallo Rainer,

glaub ich dir, wird bei mir auch laufen denn ich hab an meinem
PC alle Rechte. Bei Netzwerk-usern kann das anders sein.

oder bei Windows7. :smile:

ja :smile:, wir hatten ja schon u.a. hier das Thema Win7 und VB. Grad die 64B Version macht da Probleme mit/bei Treibern u.ä.
Win7 kommt mir nicht auf meinen PC, vom Mitlesen her schon vor nem Jahr beschlossen.
Mein WinXp, mit dem ich sehr zufrieden bin, stabilste Win daß ich kennengelernt habe, bleibt. Mir gleich ob man mit Win7 gigantische RAM-Größen verwalten kann, die hat mein kleiner PC sowieso nicht *grins*
U.v.m.

Ich hab’s lieber, wenn es keine Fehler zu behandeln gibt. :smile:

Das geht leider nicht. Klar, VB-Code der nur auf deinem Rechner läuft,
da geht das schon, höchstwahrscheinlich.
Aber bei Fremdrechnern was ja auch noch erschwerend Fremduser
bedeutet mußte mit ALLEM rechnen, mit Dingen dakämen wir beide
nicht mal im Traum darauf so einen Mist interessanten Ansatz *hüstel* zu tun.

Übrigens, err, was ja in Vb(a) bekannt ist als Namen benutzen?
Tsts :smile:)

Tippfaul. Aber Du hast mal wieder Recht, ‚Fehlerbehandlung‘
wäre schöner gewesen.

? Bitte sei konsequent, Tippfaul ist Tippfaul wie auch ich.
hell:
ist grad mein Favorit *lächel*, schön kurz und aussagekräftig.
Kannst auch mist: owei: o.ä. nehmen…

Der Coomondialog ist ein OCX, InitDir eine seiner
Eigenschaften. Bei Bedarf das Laufwerk wechseln erledigt der
Code im OCX.

Hast DU selbst überprüft ob es das auch zuverlässig macht?
Ich habe nicht ohne triftigen Grund ChDrive erwähnt.
Denn bei bestimmten Konstellationen des aktuellen Pfades den Win
glaubt zu wissen geht ChDir schlichtweg schief.

Das passiert wenn verschiedene Laufwerke im Spiel sind und dann auch nicht immer.
*seufz* Ich ahne es, ich sitze hier im 6ten Stock unterm Dach,
es ist sehr heiß, keine Luftbewegung, mein Hirn dörrt langsam aus,
jetzt muß ich arme Socke wohl noch VB-Code basteln sodaß du es nachvollziehbar nachbauen kannst und testen kannst.
Also Code wo ChDir schiefgeht, um daran InitDir zu testen.
Okay, vielleicht aber erst morgen, da solls nur 23° werden *hoff*

Gruß
Reinhard

Hallo Reinhard,

glaub ich dir, wird bei mir auch laufen denn ich hab an meinem
PC alle Rechte. Bei Netzwerk-usern kann das anders sein.

oder bei Windows7. :smile:

ja :smile:, wir hatten ja schon u.a. hier das Thema Win7 und VB.
Grad die 64B Version macht da Probleme mit/bei Treibern u.ä.
Win7 kommt mir nicht auf meinen PC, vom Mitlesen her schon vor
nem Jahr beschlossen.

Ich hab’ inzwischen Win7, 32Bit. Der alte Rechner war abgeraucht. Das macht mit VB6 keine Probleme. Mit eingeschaltetem Aero etwas schwierig in der darstellung, aber wer braucht schon Aero? Ohne läuft alles ohne Problem.

Mit 64 Bit muss man an manchen Stellen objektorientiert arbeiten, wo man es nicht gewöhnt ist. Z.B. beim Zugriff auf Datenbanken. Wir hatten hier Problemchen mit SQL-Server, aber lösbar.

Ich hab’s lieber, wenn es keine Fehler zu behandeln gibt. :smile:

Das geht leider nicht. Klar, VB-Code der nur auf deinem
Rechner läuft,
da geht das schon, höchstwahrscheinlich.
Aber bei Fremdrechnern was ja auch noch erschwerend Fremduser
bedeutet mußte mit ALLEM rechnen, mit Dingen dakämen wir beide
nicht mal im Traum darauf so einen Mist interessanten Ansatz
*hüstel* zu tun.

*gg* Das kenn ich, das ist mein tägliches Brot. Ich hatte mal eine Zeit, in der ich bei bestimmten Mitarbeitern fast täglich auf die ‚Num‘ Taste gedrückt habe, nachdem die geschreien haben: ‚geht nicht!‘ :smile:

Der Coomondialog ist ein OCX, InitDir eine seiner
Eigenschaften. Bei Bedarf das Laufwerk wechseln erledigt der
Code im OCX.

Hast DU selbst überprüft ob es das auch zuverlässig macht?

Nein, mach ich nachher mal. Es würde mich aber sehr wundern, wenn das nicht perfekt wäre. Das wäre sicher schon mal aufgefallen.

Ich habe nicht ohne triftigen Grund ChDrive erwähnt.
Denn bei bestimmten Konstellationen des aktuellen Pfades den
Win
glaubt zu wissen geht ChDir schlichtweg schief.

Das passiert wenn verschiedene Laufwerke im Spiel sind und
dann auch nicht immer.
*seufz* Ich ahne es, ich sitze hier im 6ten Stock unterm Dach,
es ist sehr heiß, keine Luftbewegung, mein Hirn dörrt langsam
aus,
jetzt muß ich arme Socke wohl noch VB-Code basteln sodaß du es
nachvollziehbar nachbauen kannst und testen kannst.

Nein, musst Du nicht! Das Problem kenne ich, darüber haben wir schon mal gesprochen, dazu gäb’s hier im Archiv Beispielcode, wenn ich den nicht schon kennen würde. :smile:

Also Code wo ChDir schiefgeht, um daran InitDir zu testen.
Okay, vielleicht aber erst morgen, da solls nur 23° werden
*hoff*

Na, dann wünsche ich Dir mal freudlicheres Wetter! Ich kann mich notfalls in den Serverraum verdrücken, der ist klimatisiert. :smile:

Gruß Rainer

Hallo Rainer,

Ich hab’ inzwischen Win7, 32Bit. Der alte Rechner war
abgeraucht. Das macht mit VB6 keine Probleme. Mit
eingeschaltetem Aero etwas schwierig in der darstellung, aber
wer braucht schon Aero? Ohne läuft alles ohne Problem.

DAS sehe ich blind genauso. Äh, was issn das dieses Aero?
Muß ich das am Flughafen kaufen *grins*
Nein, schon okay, google weiß viel.

Mit 64 Bit muss man an manchen Stellen objektorientiert
arbeiten, wo man es nicht gewöhnt ist. Z.B. beim Zugriff auf
Datenbanken. Wir hatten hier Problemchen mit SQL-Server, aber
lösbar.

Von mir aus gesehen geschehen da seltsame Dinge bei 64B.
Die API-Sleep-Funktion geht da nicht in vertrauter Syntax.
Man muß die anderst deklarieren dann klappt das wieder.
Dazu habe ich (noch) aktuell hier bei w-w-w was geschrieben wie das aussieht. Brett weiß ich grad nicht, steht u.a. Sleep im Betreff.

Okay, mit dem „Wissen“ wie es da geht könnte ich möglicherweise auch ähnlich deklarierte kleine API-Funktionen auf 64B umrüsten.
Aber wenn da die Deklaration 4 Codezeilen umfasst dann stehe ich aufm Schlauch was da genau zu tun ist.
Vor allem weiß ich nicht ob damit die Problematik zu lösen ist,
selbst wenn ich da „richtig“ umrüsten würde.

*gg* Das kenn ich, das ist mein tägliches Brot. Ich hatte mal
eine Zeit, in der ich bei bestimmten Mitarbeitern fast täglich
auf die ‚Num‘ Taste gedrückt habe, nachdem die geschreien
haben: ‚geht nicht!‘ :smile:

Glaub ich dir. Du kennst das?
User, Physiker, Chemiker sitzen in drei Zellen im kerker. Der
Wärter denkt sich, ach gebe ich mal jedem eine Glaskugel, mal schauen was passiert.
Stunde später schaut er nach, der Physiker ist immer noch emsig
beschäftigt Radius, Volumen, Gewicht, Rockwellhärte uvm. der Kugel zu bestimmen.

Der Chemiker prüft auf seine Weise wie die Kugel auf bestimmte Materialien, Chemikalien reagiert.
Der Wärter schaut auch in die Zelle des Users. Die Glasscheibe des
Fensters ist kaputt, die Kugel liegt draußen.
Der User sagt: „Ich hab nix gemact“ :smile:

Nein, musst Du nicht!

Sehr schön *gg*

Gruß
Reinhard

Hi Reinhard,

Äh, was issn das dieses Aero?
Muß ich das am Flughafen kaufen *grins*
Nein, schon okay, google weiß viel.

Halbtransparente Rahmen um die Fenster, Fenster in ‚3-D‘ anzeigen, Blättern … Nur Spielereien mit dem Design.

Du kennst das?
User, Physiker, Chemiker sitzen in drei Zellen im kerker. Der
Wärter denkt sich, ach gebe ich mal jedem eine Glaskugel, mal
schauen was passiert.
Stunde später schaut er nach, der Physiker ist immer noch
emsig
beschäftigt Radius, Volumen, Gewicht, Rockwellhärte uvm. der
Kugel zu bestimmen.

Der Chemiker prüft auf seine Weise wie die Kugel auf bestimmte
Materialien, Chemikalien reagiert.
Der Wärter schaut auch in die Zelle des Users. Die Glasscheibe
des
Fensters ist kaputt, die Kugel liegt draußen.
Der User sagt: „Ich hab nix gemact“ :smile:

Ja, kenn ich. Der User arbeitet hier. :smile:
Damit beschäftige ich mich aber nur noch 6 Monate. *gg*

Gruß Rainer

Hallo,
funktionierenden Code gibt es ja nun genug; vielen Dank!
Das eigentliche Problem war ich wieder selbst: im Wechsel zwischen dem Laden-Dialog und dem Speicher-Dialog, dort noch mit angehängtem neuen Ordner, habe ich die vom Programm gemerkten Pfade oft verbogen und den Überblick verloren. Nun rette ich den Pfad vor Aufrufen des Dialogs und stelle ihn anschließend wieder her. Eine vollständige Beschreibung des Standarddialogs wäre nett gewesen. Aber nun ist es auch egal.

Ich habe danach mal eine Rich Textbox für die Darstellung des geladenen Dateiinhalts versucht, da diese mehr Zeichen als die einfache Textbox aufnehmen kann. Und: auf einigen XP-Rechnern (SP3) gibt es die Fehlermeldung, das dieses Objekt nicht darstellbar ist. „OCX… nicht gefunden… beschädigt“ oder so ähnlich. Ach, irgendwas ist immer.
Jetzt nehme ich halt die einfache Textbox.

vG
der_kps