xbpFileDialog() und relative Pfadangaben [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

xbpFileDialog() und relative Pfadangaben [erledigt]

Beitrag von Manfred »

Hi,

ich versuche mich gerade damit, ein Auswahlfenster für Dateien anzuzeigen. Das geht auch eigentlich recht gut. Nur habe ich ein Problem, für das ich mal wieder keine Lösung finde. Da unter Windows pauschal automatisch ins Verzeichnis eigene Dateien gehopst und dann dort das Auswahlfenster angezeigt wird, muß natürlich das aktuelle Laufwerk angegeben werden. Da ich aber in Unterverzeichnissen des Programmes selbst Dateien anzeigen möchte, das Programm aber nicht weiß, wie das eigentliche Hauptverzeichnis des Programmes heißt, habe ich innerhalb des Programmes immer nur die Angabe ..\vz1\vz2\ usw. angegeben. Somit kann ich immer sagen, wohin ich will. Die Exe datei steht im Unterverzeichnis Programm, von dem ich dann halt wie oben erwähnt relative Angaben mache. Wie biege ich das denn jetzt dem XbasePart bei, das er relativ zum Programmverzeichnis aus arbeiten soll? Gibt es dazu einen Trick? Ich behelfe mir jetzt, dass ich einen Pfad höher wechsel, den erfrage und speicher, dann wieder zurück ins Programmverzeichnis gehe und dann erst den kompletten Pfad zusammenbaue.

Im Beispiel wird: CurDrive() + ":\" + CurDir() + "\" angegeben. Ich komme nicht drauf, wie ich dort einen relativen Pfad angeben kann, oder geht das nicht?
Zuletzt geändert von Manfred am Mo, 11. Mai 2009 20:30, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
CurDrive() + ":\" + CurDir() liefert doch Dein aktuelles Verzeichnis - dann kannst Du doch den relativen Pfad ranhängen, oder verstehe ich Dich jetzt falsch?
Das aktuelle Verzeichnis ist ja einfach das "."-Verzeichnis - aber einige der Funktionen brauchen halt absolute Pfade - und die hast Du halt mit dem obigen Beispiel...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: xbpFileDialog() und relative Pfadangaben

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: ... Da ich aber in Unterverzeichnissen des Programmes selbst Dateien anzeigen möchte, das Programm aber nicht weiß, wie das eigentliche Hauptverzeichnis des Programmes heißt,
du meist doch das Verzeuichniss in dem die EXE deine Xbase++
Application "installiert" ist ? das ist doch ganz "einfach" :

Code: Alles auswählen

PUBLIC zPath
//
// in diesem Verzeichniss ist die EXE gestartet worden
// angenommen C:\Programme\MYDIR\EXE\Xbase.EXE
//
zPath := left(AppName(.t.), len(AppName(.t.)) - len(AppName(.f.)))
//
// dann wäre der "Hauptpath" C:\Programme\MYDIR\
//
zPath := STRTRAN(zPath,"EXE","")

...

FUNCTIN FILEDLG(oParent .....)
LOCAL DrawingArea := oParent:drawingArea
LOCAL aFilters := { {"Playlist","*.JVD;*.M3U"},;
                             {"JVD Playlist","*.JVD"}  ,;
                             {"M3U Playlist","*.M3U"}   }

   oFileDlg   := XbpFileDialog():new()
   oFileDlg:fileFilters := aFilters
   oFileDlg:center      := .T.
   oFileDlg:create( DrawingArea )
...
so nun kommt es darauf an ob du ein "Verzeichniss" oder
eine "Datei" öffnen/auswählen möchtest ?

also erstmal, weil es einfacher ist, eine "Datei"

Code: Alles auswählen

   cPlayJVD := oFileDlg:open(ZPATH+"DATEN",.T.,.F.)  // single

will man nun "expliziet" eine spezielle Datei

Code: Alles auswählen

   // wenn man einen Dateinamen "vorgeben" will ...

   // BUG in v1.9.331
   // kann keine .Extension ”ffnen
   //
* cPlayJVD := oFileDlg:open(ZPATH+"DATEN\PLAYLIST.JVD",.T.,.F.)
   //
   // also dann OHNE Extension
   //    
   cPlayJVD := oFileDlg:open(ZPATH+"DATEN\PLAYLIST",.T.,.F.)  // single
so und nun zu einem "Verzeichniss". Das geht nur mit "Trick"

Code: Alles auswählen

cPathName := oFileDlg:saveAs(zpath+"Select Path, Press Enter or Click SAVE",,.T.)
auch wenn der Befehl eigendlich zum "abspeichern" gedacht ist,
kann man nun prima durch die Verzeichnisse navigieren ABER
er gibt eben nur ein "Verzeichniss" zurück !!!

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
die Variante von Jimmy (mit AppName()) ist auf jeden Fall sinnvoller!
Selbst wenn während der Laufzeit Deines Programmes das Verzeichnis mal geändert wurde, so gibt seine Version immer das selbe Verezichnis zurück (das Installationsverzeichnis), während meine Variante dann ein anderes Verzeichnis zurückgibt (das aktuelle).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi

ich werde im Hintergrund die Vorschläge austesten, aber jetzt kurz erklären wie ich es meine, weil ich mir nicht so ganz sicher bin, ob ich mich gestern Abend deutlich ausgedrückt habe.

Ich befinde mich auf einem Serververzeichnis im Netzwerk. (Samba)

LW (egal, Buchstabe kann genommen werden wie will)

LW:\Prgvz <--- hier steht alles drin, was zum Programm gehört (kann benannt werden wie will)

LW:\Prgvz\programm <-- hier stehen die Exe Files samt DLL drin (Name fest vorgegeben, von hier aus wird aber relativ adressiert)
LW:\PrgVz\datenbanken\umsatz\ <-- hier muß ich hin, bzw. von hier aus soll gestartet werden ( und noch tiefer, soll aber aus dem Auswahlfenster des XbpFileDialog anwählbar sein.)

Wenn ich jetzt direkt vom Programm aus auf Dateien zugreife, dann z.B. so: Use ..\datenbanken\umsatz\xyz

Um dem XbpFileDialog zu sagen, er soll in dem Verzeichnis

LW:\prgvz\datenbanken\umsatz\ anfangen, dann müßte ich zu dem Zeitpunkt den genauen Namen des prgvz wissen und den weiß ich nicht.

Jetzt habe ich gestern Abend noch folgendes ausprobiert:

Code: Alles auswählen

STATIC FUNCTION kassenberichtalt()
                LOCAL cFile
                LOCAL oDlg
                LOCAL cShdVerzeichnis, cUmsatzVerzeichnis

                DIRCHANGE("..\")                                                // in das Rootverzeichnis des Programmes
                cShdVerzeichnis := CurDir()                                     // ermitteln, wie das heißt
                DIRCHANGE(cShdVerzeichnis + "\programm")
                cUmsatzVerzeichnis := CurDrive()
                cUmsatzVerzeichnis += ":\"
                cUmsatzVerzeichnis += cShdVerzeichnis
                cUmsatzVerzeichnis += "\datenbanken\umsatz\"

                oDlg  := XbpFileDialog():new():create()
                cFile := oDlg:open( cUmsatzVerzeichnis + "*.dbf")

                oDlg:destroy()
                RETURN(.T.)
damit bin ich aber trotzdem im Startverzeichnis Eigene Dateien gelandet. Obwohl im Debugger der korrekte Pfad in der Var zu lesen war.
Da es spät Abends war, werde ich die Sache jetzt nochmals in Ruhe angehen und sehen, ob ich vielleicht einen Denkfehler gemacht habe.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi ich nochmal,

wie immer dasselbe......... :roll: :roll: :roll: :roll: :roll: :roll: :evil:

ich hatte einen Tippfehler. Das was ich oben angeführt habe, das klappt.

Jetzt werde ich es OHNE Tippfehler in das Beispiel einbauen von Alaska und dann nochmals sehen.

Manomanoman
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben:

Code: Alles auswählen

STATIC FUNCTION kassenberichtalt()
                cFile := oDlg:open( cUmsatzVerzeichnis + "*.dbf")
kein Wunder den so geht es nicht.

1.) wie ich im obrigen Beispiel zeigte funktionieren "Extension" NICHT !
2.) man kann zwar als Wildcard ein "*" benutzen, aber wie es auch im
Help File steht ist das nicht die "richtige" Methode.
"richtig" ist es die Methode ":fileFilters" zu benutzen und ein Array
zu übergeben.
3.) als "default" solltest immer eine "vorhandene" Datei angeben ABER
ohne "Extension"

nun solltest du auch das Verzeichniss "cUmsatzVerzeichnis" angezeigt
bekommen.

gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

Nachtrag :
AUGE_OHR hat geschrieben: 1.) wie ich im obrigen Beispiel zeigte funktionieren "Extension" NICHT !
scheint so als wenn von der 330 zur 331 also in der Release doch noch
behoben wurde und es jetzt doch mit "Extension" funktioniert, sorry.

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

der Tippfehler war eigentlich kein Tippfehler in dem Sinne. Ich hatte über länger Zeit hinweg das Unterverzeichnis "Umsatz" genannt und jetzt in "Kasse" umgetauft. Naja, und wie die Macht der Gewohnheit nun eben ist...
Bis ich dann endlich die Augen aufgemacht und erkannt hatte, das der Name falsch war.

Allerdings muß ich vorher über Verzeichniswechsel eins höher gehen, sprich in das "Hauptverzeichnis" des Programmes, mir das merken und dann den Rest des festen Verzeichnisses anhängen. Ich habe es nicht hinbekommen aus dem Programmunterverzeichnis über relative Pfadangaben das Umsatzverzeichnis anzuwählen.

PS: Wobei mich jetzt aber der Parameter :noWriteAccess etwas verwirrt. Irgendwie sehe ich keine Wirkung, oder verstehe ihn falsch. Kann ich damit nicht abschalten, dass der User neue Verzeichnisse, oder Dateien innerhalb dieses Dialoges erstellen kann?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten