Verzeichnisauswahl wie in vx20.exe
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Verzeichnisauswahl wie in vx20.exe
Hi, ich weiß es gab schon ein ähnliches Thema, leider bin ich daraus nicht ganz schlau geworden und zum Teil
leider auch die Links nicht mehr ganz aktuell sind.
Und zwar, wenn man das vx20.exe startet kann man ein neues Projekt anlegen. Dazu muss man einen Pfad angeben. Weiß man den Pfad nicht drückt man auf etwas ähnliches wie "Durchsuchen".
Es erscheint eine baumartige Struktur, bei der man ein Verzeichnis auswählen kann (keine Datei).
Wo bekomme ich genau so etwas her?
Mit dem FileDialog geht das, wenn ich das andere Thema richtig verstanden habe, nicht. Da muss man immer eine Datei auswählen udn dann nachträglich vom Dateipfad den Dateinamen wegkürzen, um an das Verzeichnis zu kommen, was ich aber nicht gerne habe.
leider auch die Links nicht mehr ganz aktuell sind.
Und zwar, wenn man das vx20.exe startet kann man ein neues Projekt anlegen. Dazu muss man einen Pfad angeben. Weiß man den Pfad nicht drückt man auf etwas ähnliches wie "Durchsuchen".
Es erscheint eine baumartige Struktur, bei der man ein Verzeichnis auswählen kann (keine Datei).
Wo bekomme ich genau so etwas her?
Mit dem FileDialog geht das, wenn ich das andere Thema richtig verstanden habe, nicht. Da muss man immer eine Datei auswählen udn dann nachträglich vom Dateipfad den Dateinamen wegkürzen, um an das Verzeichnis zu kommen, was ich aber nicht gerne habe.
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2935
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Verzeichnisauswahl wie in vx20.exe
Diese Funktion habe ich mal aus dem Alaska Forum gezogen, benötigt die Library "BAP":
Code: Alles auswählen
******************************************************
* FUNCTION MxBrowseForFolder
******************************************************
#pragma library("bap")
#define NULL 0
#define BIF_RETURNONLYFSDIRS 0x0001 // For finding a folder to start document searching
#define BIF_DONTGOBELOWDOMAIN 0x0002 // For starting the Find Computer
#define BIF_STATUSTEXT 0x0004
#define BIF_RETURNFSANCESTORS 0x0008
#define BIF_EDITBOX 0x0010
#define BIF_VALIDATE 0x0020 // insist on valid result (or CANCEL)
#define BIF_BROWSEFORCOMPUTER 0x1000 // Browsing for Computers.
#define BIF_BROWSEFORPRINTER 0x2000 // Browsing for Printers
#define BIF_BROWSEINCLUDEFILES 0x4000 // Browsing for Everything
DLLFUNCTION SHBrowseForFolder( cStru ) USING STDCALL FROM SHELL32.DLL
DLLFUNCTION SHGetPathFromIDList(pidl,@cFolderName) USING STDCALL FROM SHELL32.DLL
DLLFUNCTION CoTaskMemFree(p) USING STDCALL FROM OLE32.DLL
******************************************************
FUNCTION MxBrowseForFolder( oWin, cPrompt, lEditBox, lValidate, lFiles )
LOCAL hWnd := IIF(oWIn=NIL,SetAppWindow():getHWND(),oWin:getHWND())
LOCAL aOFN
LOCAL cOFN
LOCAL nFlags := 0
LOCAL ret := ''
LOCAL nIDL := 0
LOCAL cFolderName := replicate(chr(0),260)
DEFAULT lEditBox TO .F.
DEFAULT lValidate TO .F.
DEFAULT lFiles TO .F.
cPrompt = ConvToAnsiCP(IIF(cPrompt=NIL,'',cPrompt)+CHR(0))
IF lEditBox
nFlags := nFlags+BIF_EDITBOX
ENDIF
IF lValidate
nFlags := nFlags+BIF_VALIDATE
ENDIF
aOFN = BaInit(8)
BaStruct(aOFN,hWnd) // hwndOwner
BaStruct(aOFN,NULL) // pidlRoot
BaStruct(aOFN,@cFolderName) // lpstrFolder
BaStruct(aOFN,@cPrompt) // lpstrPrompt
BaStruct(aOFN,nFlags) // nFlags
BaStruct(aOFN,0) // CallBackProc
BaStruct(aOFN,0) // lParam
BaStruct(aOFN,0) // iImage
cOFN = BaAccess(aOFN)
nIDL = SHBrowseForFolder(cOFN)
IF nIDL > 0
SHGetPathFromIDList(nIDL,@cFolderName)
CoTaskMemFree(nIDL)
ret = ConvToOEMCP(substr(cFolderName,1,at(chr(0),cFolderName)-1))
ENDIF
RETURN(ret)
Viele Grüße
Wolfgang
Wolfgang
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: Verzeichnisauswahl wie in vx20.exe
Wo bekomme ich die Bap library her ? :P In der Version 1.90.355 ist die nicht vorhanden oder?
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Verzeichnisauswahl wie in vx20.exe
Die kann man von der Alaska Seite laden.
Aber Pablo hat eine BAP2 die er verbessert hat und in der OT4XB sollen die Befehle auch enthalten sein.
Aber Pablo hat eine BAP2 die er verbessert hat und in der OT4XB sollen die Befehle auch enthalten sein.
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Verzeichnisauswahl wie in vx20.exe
Ich mache das schon mit FileDialog:
Code: Alles auswählen
function pfadauswahl(cPfad, lNurPfad, aFilter)
LOCAL oFileDlg, cPathName, nPosi := 0, cOrgPfad := cPfad
if lNurPfad == NIL
lNurPfad := .f.
endif
if aFilter == NIL
aFilter := {}
endif
oFileDlg := XbpFileDialog():new()
// oFileDlg:center := .T. // da sind sonst die Linkfavoriten weg
oFileDlg:title := ConvToOemCP(if(lNurPfad, "Wählen Sie den entsprechenden Ordner aus", "Wählen Sie die Datei aus"))
oFileDlg:fileFilters := aFilter
oFileDlg:restoreDir := .t.
oFileDlg:create()
if lNurPfad
if .not. right(cPfad, 1) == "\"
cPfad += "\"
endif
cPfad += "ENTER oder Öffnen wählen"
endif
cPfad := ConvToOemCP(cPfad)
cPathName := oFileDlg:open(cPfad)
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Verzeichnisauswahl wie in vx20.exe
hi,
wer das Xbase++ "Service Pack 3" hat sollte dort ein "FolderPicker" finden.
wer sich nun dafür interessiert was "dahinter" steckt ( API ) der sollte sich das ansehen :
es gab dazu hier im Forum einen Thread http://www.xbaseforum.de/viewtopic.php?f=32&t=860
in dem Günter Beyes auf eine Lösung im Alaska Newsforum in den Thread
public.xbase++.gui
Window api call'
8. Januar 2005
wenn man nun, wie in Wolfgangs Beispiel, "lFiles" nicht angibtdann werden Files gar nicht erst angezeigt -> nur Directory
hier noch paar BIF_* Konstanten welche man als "Flag" verwenden kann
***es wird NICHT , wie bei Günter oder Pablo, die SHBrowseForFolderA() verwendet d.h. kein UNICODE !
Anmerkung : Günter hat es OHNE BAP oder ot4xb gelöst !
wer das Xbase++ "Service Pack 3" hat sollte dort ein "FolderPicker" finden.
wer sich nun dafür interessiert was "dahinter" steckt ( API ) der sollte sich das ansehen :
es gab dazu hier im Forum einen Thread http://www.xbaseforum.de/viewtopic.php?f=32&t=860
in dem Günter Beyes auf eine Lösung im Alaska Newsforum in den Thread
public.xbase++.gui
Window api call'
8. Januar 2005
hinwies. es geht ja in jedem Fall darum per Windows API SHBrowseForFolder()*** das Control vom OS() aufzurufen.Da geht es um den Windows-eigenen 'Browse for Folder'-Dialog. Sourcecode ist auch dabei
wenn man nun, wie in Wolfgangs Beispiel, "lFiles" nicht angibt
Code: Alles auswählen
FUNCTION MxBrowseForFolder( oWin, cPrompt, lEditBox, lValidate, lFiles )
DEFAULT lFiles TO .F.
...
IF lFiles
nFlags := nFlags+BIF_BROWSEINCLUDEFILES
ENDIF
hier noch paar BIF_* Konstanten welche man als "Flag" verwenden kann
Code: Alles auswählen
/* Set Flags */
nFlags+=IF(::Computers,BIF_BROWSEFORCOMPUTER,0)
nFlags+=IF(::Printers,BIF_BROWSEFORPRINTER,0)
nFlags+=IF(::ShowFiles,BIF_BROWSEINCLUDEFILES,0)
nFlags+=IF(::ShowURLs,BIF_BROWSEINCLUDEURLS,0)
nFlags+=IF(::LimitDomainLevel,BIF_DONTGOBELOWDOMAIN,0)
nFlags+=IF(::EditBox,BIF_EDITBOX,0)
nFlags+=IF(::Extended,BIF_NEWDIALOGSTYLE,0)
nFlags+=IF(!::NewButton,0,BIF_NONEWFOLDERBUTTON)
nFlags+=IF(!::Translate,0,BIF_NOTRANSLATETARGETS)
nFlags+=IF(::OnlyFSAncestors,BIF_RETURNFSANCESTORS,0)
nFlags+=IF(::OnlyFSDirectories,BIF_RETURNONLYFSDIRS,0)
nFlags+=IF(::ShowShares,BIF_SHAREABLE,0)
nFlags+=IF(::ShowHint,BIF_UAHINT,0)
Anmerkung : Günter hat es OHNE BAP oder ot4xb gelöst !
gruss by OHR
Jimmy
Jimmy