CommonDialog

Xervek

Mitglied
Hallo,

irgendwie wird es langsam zur Plage das alles, immerzu nachfragen zu müssen und am Ende ist es doch einfach... es geht um den "CommonDialog".

Folgendes ich habe 2 Button, ein Textfeld.

Tippe ich in das Textfeld den Pfad zu meinem File Manuell ein, klicke "Save" und der Inhalt dieses Textfeldes wird ohne meckern und murren gespeichert. Und zwar in einer Datei namens "game1.game". Nun habe ich jedoch einen CommonDialog hinzugefügt um das elendige Eintippen des Pfades unterbinden zu können. Prompt tritt also der 2. Button in Kraft namens "Open". Klick auf "Open", Dialog öffnet sich, ich wähle meine Datei aus, der Dialog geht automatisch wieder zu und der komplette (und korrekte Pfad) wird in das vorhandene Textfeld eingetragen. Klicke ich nun allerdings wieder auf den "Save" Button, welcher den Inhalt sichern soll, bekomme ich kurzehand nen "Laufzeitfehler '76' - Pfad nicht gefunden.

Nach Klick auf Debuggen sagt er mir, er hat den Pfad nicht gefunden, um die Datei mit dem Inhalt der Textbox zu speichern.

Open ("game1.game") For Output As #1
Write #1, buildversion(1)
Write #1, game_name(1)
Write #1, game_path(1)
Write #1, image_path(1)
Close #1

Ich werde irgendwie nicht schlau darauf. Gebe ich es EXAKT so ein, wie es mir der CommonDialog ausließt funktioniert es, lasse ich mir den Pfad aber vom Dialog auslesen bekomme ich nen Fehler, dass er die Datei nicht speichern kann, ich sehe darin keinen Sinn?

Edit:

Ich habe es jetzt durchschaut was er tut. Wenn ich manuell eintippe, wird die Datei an dem Ort gespeichert andem ich grade bin, so wies auch sein soll. Wenn ich jetzt aber per CommonDialog eine Datei öffne, danach speichere wird die Datei an dem Ort gespeichert, andem auch die Datei liegt, die ich grade per CommonDialog geöffnet habe. Wieso ist das denn so? bzw. kann man dagegen was machen? Davon mal abgesehen befehle ich ihm doch nur, dass er auslesen soll wie der pfad ist und diesen soll er speichern, was mischt er sich denn da ein, wohin die Datei gesichert werden soll?

Edit²:

Ich raff es nicht. Programm geschlossen -> Neu gestartet, jetzt speichert er die Dateien auch an der Stelle, ander ich zueletzt eine Datei per CommonDialog eingelesen habe. Spinn ich oder spinnt er?
 
Zuletzt bearbeitet:
Ich kann dich beruhigen. Du spinnst nicht.

Ich hatte dieses Problem auch schon mal, wenn du die Anwendung schließt und neu startest wird der Anwendungspfad irgendwie 'mitgenommen'.

Wenn ich deine Frage richtig verstanden habe kann er die Datei nicht im Anwendungspfad speichern.

--> Vielleicht hast du im Commondlg den Dateiname nicht richtig angegeben, dh. nur den Pfad, dann ist die Rückgabe "".

--> Wozu einen Commondlg wenn er die Datei eh nur im Anwendungspfad speichern soll?

--> Ja. Dagegen kann man etwas machen:

Commondlg.Filename = App.Path & "\" & Dateiname
Commondlg.ShowOpen

Man kann die Filename-Eigenschaft mit Pfad angeben. Dann wird er automatisch geöffnet.

Ich hoffe ich hab dir damit irgendwie geholfen. Frag sonst einfach nochmal.
 
Hallo,

mir ist echt nach fluchen zumutue. Mittlerweile macht es es mal und mal macht er es nicht. Alles was ich möchte ist, einen "öffnen" Dialog, sodass ich mich mit der Maus durch den Rechner klicken kann, am Ende eine Datei auswählen kann und mir der Pfad in einem Textfeld gespeichert wird. Daher dachte ich jetzt, der CommonDialog wäre das ideale, habe es getestet und es erfüllt in der Tat seinen Sinn und Zweck. Datei suchen und auswählen mit dem CommonDialog -> Übernommen und voila! Irgendwie bekomme ich grade ne Klatsche, ich stehe kurz vorm Heulen. Das Problem scheint gar nicht mal der Commondialog zu sein sondern... der Speichervorgang in die Datei selber. Mittlerweile kommt dieser Fehler auch immer öfter ohne das ich den Dialog nutze... er kommt aber immer willkürlich, und ich habe NICHTS am Code selber verändert, er macht was er will, als würde er nen Eigenleben führen, soein Mist!

Dashier ist der Speichervorgang:

Code:
Open ("games\game1.game") For Output As #1
       Write #1, buildversion(1)
       Write #1, game_name(1)
       Write #1, game_path(1)
       Write #1, image_path(1)
Close #1

Nach dem Auslesen mit dem Commondialog ist es so, als hätte ich etwas manuell eingegeben. Lass mich mal versuchen es so zu sagen wie ich denke, dass es ist...
Ich habe einen Ordner mit folgendem Inhalt:

games (ordner)
programm.exe

Jedoch gibt mir die der Debugger permanent aus, dass der Pfad nicht geöffnet werden kann. Müsste er nicht versuchen, in meinem Programm Ordner unter "games" zu speichern was ich ihm gesagt habe? Ist doch bei HTML auch so, oder? Aber genau DAS tut er nicht. Wenn ich nun mit dem Commondialog eine Datei auswähle die Außerhalb des Ordners liegt, will er automatisch DORT speichern, aber wieso zum Geier? Mein Programm liegt also auf C:\Mein Programm\Mein Programm.exe, wenn ich nun eine Datei auswähle die auf beispielweise D:\ liegt (egal ob im Root oder sonstwo) will er die Datei dea speichern (da es aber den Ordner "games" dort nicht gibt) gibt er mir nen Fehler aus. Er will aber immer DORT meine Dateien speichern, wo die letzte Datei mit dem CommonDialog geöffnet wurde, aber wieso herrje?

Ich habe jetzt immerzu das Gleiche gefragt und sicher versteht keiner was ich will... hoffe aber das denoch jemand eine Antwort hat, ich bin wirklich am Verzweifeln!
 
Hallo,

Ich glaub jetzt hab ichs verstanden. Du willst also einen Ordner auswählen, und darin eine Datei speichern und dieser Ordner kann irgendwo im System liegen oder?
der Commondlg wählt nämlich einen Pfad + Datei aus. Du bräuchtest aber nur den Pfad.

Pfad mit Datei würde so aussehen:
Code:
Open (Commondlg.Filename) For Output As #1
       Write #1, buildversion(1)
       Write #1, game_name(1)
       Write #1, game_path(1)
       Write #1, image_path(1)
Close #1

Man könnte natürlich nur den Pfadauswählen lassen:
z.B.: C:\Mein Programm\
ein 'games' dranhengen
C:\Mein Programm\games\
und die Datei speichern

FilrNm = "C:\Mein Programm\games\game1.game"
Open (FileNm) For Output As #1 ...
 
Du solltest bei der Open-Anweisung immer den ganzen Pfad übergeben und nicht nur einen Teil. Anstatt
Code:
Open ("game1.game") For Output As #1
solltest du
Code:
Open ("C:\Ordner\game1.game") For Output As #1
verwenden. Mit App.Path kannst du übrigens das Verzeichnis deiner Exe-Datei ermitteln, also beispielsweise dann so:
Code:
Open ("App.Path & "\" & game1.game") For Output As #1

Was den CommonDialog angeht:
Ich bin mir nicht sicher (weil ich es nicht ausprobiert habe) aber ich vermute folgendes:
VB hat eine Funktion namens "CurDir", diese liefert das aktuell eingestellte Verzeichnis. Mit "ChDir" bzw. "ChDrive" kannst du dieses Verzeichnis ändern. Wenn man nun eine Datei öffnet, so wie du es gemacht hast, ohne den gesamten Pfad sondern nur den Dateinamen anzugeben, dann wird die Datei in dem Verzeichnis geöffnet, welches die Funktion "CurDir" zurückgibt. Was ich nun vermute, ist, dass der CommonDialog dieses Verzeichnis ändert, wenn der User ein Verzeichnis auswählt.

Du solltest dein Problem also lösen können, indem du bei der Open-Anweisung immer den gesamten Pfad eingibst.
 
Shakie hat gesagt.:
Code:
Open ("App.Path & "\" & game1.game") For Output As #1

Du solltest dein Problem also lösen können, indem du bei der Open-Anweisung immer den gesamten Pfad eingibst.

Hallo,

Versucht, es gibt 2 unterschiedliche Fehlermeldungen. Zum Einen habe ich es so versucht, wie du es geschrieben hast, also exakt

Open ("App.Path & "\" & game1.game") For Output As #1, es wird mir aber folgendermaßen angezeigt
Open ("App.Path & " \ " & game1.game") For Output As #1, beim Test gibts nen "Laufzeitfehler '13' - Typen unverträglich, er gibt mir die oben genannte Zeile beim Debuggen an.

Also habe ichs noch mal so versucht:
Open (App.Path & "\" & game1.game) For Output As #1, es bleibt so stehen, gibt aber folgenden Fehler:
"Laufzeitfehler '434' - Objekt erforderlich".

Bei meinen angegebenen Beispielen achte bitte einfach auf die Anführungszeichen.

Und ja, ich stimme dir zu. Da ich allerdings nicht immer davon ausgehe, das mein Programm immer auf C:\Programme\Mein Programm\ liegt, muss ich es per "App.Path" machen, ich kannte nur den Befehl bisher nicht. Nur eben scheint das jetzt auch nicht zu funktionieren...
 
Entschuldigung, mein Codebeispiel oben war falsch, da waren ein paar Anführungszeichen zu viel. Aber du bist ja fast selber drauf gekommen.
So müsste es gehen:
Code:
Open App.Path & "\game1.game" For Output As #1
 
Hallo,

vielen Dank codeman und Shakie! Es funktioniert jetzt wieder allerbestens! Waren nur nen paar Zeichen mehr und es funktionierte wieder, schon erstaunlich. Auch wenn ich die Formatierung von VB manchmal nicht so ganz raffe, ich hätte selbst drauf kommen können mit dem (app.path & "...") nur manchmal will VB die " haben und mal nicht, naja vielen Dank, jetzt funktioniert es allerbestens!
 
Zurück