Verzeichnisauswahl wie in vx20.exe

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Verzeichnisauswahl wie in vx20.exe

Beitrag von Benz »

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.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
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

Beitrag von Wolfgang Ciriack »

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
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: Verzeichnisauswahl wie in vx20.exe

Beitrag von Benz »

Wo bekomme ich die Bap library her ? :P In der Version 1.90.355 ist die nicht vorhanden oder?
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
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

Beitrag von Werner_Bayern »

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!>
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: Verzeichnisauswahl wie in vx20.exe

Beitrag von AUGE_OHR »

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
Da geht es um den Windows-eigenen 'Browse for Folder'-Dialog. Sourcecode ist auch dabei
hinwies. es geht ja in jedem Fall darum per Windows API SHBrowseForFolder()*** das Control vom OS() aufzurufen.

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
dann werden Files gar nicht erst angezeigt -> nur Directory

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)
***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 !
gruss by OHR
Jimmy
Antworten