Seite 1 von 1

XbpFileDialog() [Erledigt]

Verfasst: Mi, 10. Jan 2018 11:10
von Jan
Hallo,

mit XbpFileDialog() bekomme ich ja den Pfad und den Namen der ausgewählten Datei zurück. Ich komme da aber nur raus, wenn ich entweder abbreche oder real eine Datei auswähle.

Ich brauche aber die Auswahlmöglichkeit eines Verzeichnisses. Gibt es da einen Parameter, mit dem ich das erreichen kann? Oder eine andere Funktion? Oder muß der Ansatz dann komplett anders sein?

Jan

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 11:36
von brandelh
Der FILE-Dialog verlangt eine Datei, basta !
Du müsstest dann den Pfad zu der Datei ermitteln. Es gibt eigentlich in der API (wenn ich mich nicht total irre) auch einen FolderDialog(), den hat Alaska aber vergessen ...
Eventuell hat Jimmy da eine Idee ?

In älteren Versionen habe ich das mit Directory() und Listboxen nachgebaut, heute würde das wohl keiner mehr sehen wollen ...
Ein eigener Treeview könnte auch gehen, aber die komplette Platte zu durchsuchen und dann so aufzubauen ist sehr langsam bei den riesen Platten.

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 11:40
von Tom
Der heißt FolderBrowserDialog. Hier ein Wrapperbeispiel für .NET:

https://dotnet-snippets.de/snippet/verz ... dialog/840

Einen Directory-Browser kann man mit einem Browse oder einer Combobox oder sogar einem Treeview relativ leicht bauen, und ein rekursives Directory() zum Einlesen einer Verzeichnisstruktur ist auch schnell programmiert. Ich nutze allerdings das Tool aus eXpress++. :wink:

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 11:42
von brandelh
Hier ein Beispiel von mit dem XbpFileDialog() mir:

Code: Alles auswählen

    if empty(::ImportVerzeichnis)
       cDatei := GetFilenameOpen("Eine Importdatei aus gewnschtem Import Verzeichnis w„hlen",.t.,DatenVerzeichnis()+"import\*.txt")
       if ! empty(cDatei)
          if rat("\",cDatei) > 3
             ::ImportVerzeichnis := GetPath(cDatei)
          else
             ErrBox("Keine Datei gew„hlt, Abbruch.")
          endif
       endif
    endif


*---------------------------------------------------------------------------------------
function GetPath(cDatei)
   local x
   x := rat("\",cDatei)
   if x > 3
      cDatei := left(cDatei,x) // mit \ am Ende
   endif
return alltrim(cDatei)
*---------------------------------------------------------------------------------------
*-------------------------------------------------------------
FUNCTION GetFilenameOpen(cTitle,lCenter,cFilter,aFileFilters) // aFileFilters nur Win32
   local oFileDlg, cFile, cAltCurDir, cAltCurDrive, cFilterOhnePfad

   DEFAULT cTitle  TO "™ffnen ..."
   DEFAULT lCenter TO .t.
   DEFAULT cFilter TO "*.*"

   * Wegen PDR in 2.00.785 center verhindern.
   lCenter := .f.

   do case
      case "\" $ cFilter
           cFilterOhnePfad := substr(cFilter,rat("\",cFilter)+1 )
      case ":" $ cFilter
           cFilterOhnePfad := substr(cFilter,rat(":",cFilter)+1 )
      otherwise
           cFilterOhnePfad := cFilter
   endcase
   DEFAULT aFileFilters TO     { { cFilterOhnePfad , cFilterOhnePfad } }

   cAltCurDrive  := CurDrive()
   cAltCurDir    := CurDir()

   oFileDlg := XbpFileDialog():new()
   oFileDlg:center      := lCenter
   oFileDlg:title       := cTitle
   oFileDlg:FileFilters := aFileFilters
   oFileDlg:create()

   cFile := oFileDlg:open(cFilter)

   oFileDlg:destroy()
   // Pfad wieder herstellen
   if left(cAltCurDir,2)="\\" // UNC-Name
      CurDrive(cAltCurDir)
      CurDir(cAltCurDir)
   else
      CurDrive(cAltCurDrive)
      CurDir(cAltCurDrive+":\"+cAltCurDir)
   endif

return cFile

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 12:03
von Jan
Hallo Ihr beiden,

Danke für die Hinweise. Mal schauen, ob ich daraus was bauen kann. Ich hatte halt die Hoffnung, das es da was undokumentiertes oder sonstwie einfacheres gäbe.

Es wäre übrigens überhaupt kein Problem, aus der zurückgegebenen Zeichenkette der ausgewählten Datei den Ordner rauszulesen. Dumm nur, wenn in dem gewünschten Verzeichnis überhaupt keine Datei liegt. Dann ist da auch nix zum Auswählen, und dort scheitert dann halt der XbpFileDialog(). Ich muß halt die Möglichkeit haben, auch leere Verzeichnisse auswählen zu können. Und wenn möglich soll das teil ja auch noch optisch wie der FileDialog wirken. Was tut man nicht alles für das Auge und die Gewohnheit des Kunden ...

Jan

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 12:21
von mini990
Hallo Jan,
probier mal das...
Gruß Stefan

Code: Alles auswählen

oSle2:lbDblClick := {| MP1, uNIL, o| oSle2:setdata(SuchePfad(o:editbuffer(),oXbp0,@o)),;
		sik_zus1:= oSle2:Getdata() }

FUNCTION SuchePfad(istammpfad, oParent)
LOCAL oFileDlg, cPathName, nPosi := 0
LOCAL orgpfad:=iStammpfad 
LOCAL aSize, aRefsize, aPos
aSize    := {588,296}
aRefSize:=oParent:currentSize()
aPos:= { Int( (aRefSize[1] - aSize[1]) / 2 ) ;
   , Int( (aRefSize[2] - aSize[2]) / 2 ) }


oFileDlg := XbpFileDialog():new( oParent, , aPos, aSize, , .F.)
***oFileDlg := XbpFileDialog():new()

//   oFileDlg:center := .T.   // da sind sonst die Linkfavoriten weg
oFileDlg:title := "W„hlen Sie den entsprechenden Ordner aus"
oFileDlg:fileFilters := {}
oFileDlg:restoreDir := .t.
oFileDlg:create()
if .not. right(iStammpfad, 1) == "\"
   iStammpfad += "\"
endif
iStammpfad += "Enter oder ™ffnen "
cPathName := oFileDlg:open(iStammpfad)
if cPathname = NIL
	 iStammpfad:=orgpfad
	 RETURN (istammpfad)
endif
cPathname:=Left( cPathname, RAt( "\", cPathname )  ) 
RETURN (cPathName)

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 12:23
von HaPe
Hallo Jan !
Ich brauche aber die Auswahlmöglichkeit eines Verzeichnisses. Gibt es da einen Parameter, mit dem ich das erreichen kann? Oder eine andere Funktion? Oder muß der Ansatz dann komplett anders sein?
Zwei Möglichkeiten:
SHBrowseForFolder: https://msdn.microsoft.com/en-us/librar ... s.85).aspx
viewtopic.php?f=23&t=8227

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 12:32
von Jan
Hallo,

der Hinweis von Tom auf die Systemklasse hat mich weiter gebracht. Einfach mal danach + xbase gegoogelt - et voila - da gibt es in der Alaska-NG einen Thread über das Xbpack 3. In der es einen XbFolderDialog gibt. Leider ActiveX, aber das sieht schon mal ganz nett aus. Mal schauen, was da noch bei raus kommt.

Aus irgend einem Grund haben die den XbPack 3 nicht in die Assets übernommen. 1 und 2 sind drin. 3 fehlt. mal den Support fragen ...

Jan

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 12:41
von Jan
Hmm. Das Teil klappt soweit ganz gut. Aber aus irgend einem Grund werden gemappte Laufwerke nicht mit aufgeführt. Das ist ja ärgerlich.

Jan

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 13:27
von Jan
Gefunden. Ich muß an den Flags etwas schrauben, dann klappt das auch.

OK, damit ist der Fall gelöst. danke für alle, die sich da den Kopf drüber zerbrochen haben.

Jan

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 14:12
von brandelh
Jan hat geschrieben: Mi, 10. Jan 2018 12:32 da gibt es in der Alaska-NG einen Thread über das Xbpack 3. In der es einen XbFolderDialog gibt.
das Teil liegt auch auf meiner Platte ... und hab ich total vergessen :shock:

Re: XbpFileDialog()

Verfasst: Mi, 10. Jan 2018 20:11
von AUGE_OHR
Jan hat geschrieben: Mi, 10. Jan 2018 12:32In der es einen XbFolderDialog gibt. Leider ActiveX,
IMHO ist es die "falsche" Function [-X
klar "kann" man das auch über ActiveX

Code: Alles auswählen

CreateObject( "Shell.Application" )
machen aber es gibt dafür eine "native" Function.

"richtig" wäre der Vorschlag von HaPe : SHBrowseForFolder
wer die "Service Pack 3" nicht hat kann diesen Source von Pablo benutzen
TestBrowseForFolder.rar
need ot4xb
(19.39 KiB) 241-mal heruntergeladen

Re: XbpFileDialog() [Erledigt]

Verfasst: Mi, 10. Jan 2018 22:11
von Wolfgang Ciriack
Dazu liest man dann my MS:
For Windows Vista or later, it is recommended that you use IFileDialog with the FOS_PICKFOLDERS option rather than the SHBrowseForFolder function.
Hat das denn schon jemand umgesetzt und in Benutzung ?

Re: XbpFileDialog() [Erledigt]

Verfasst: Mi, 10. Jan 2018 23:26
von AUGE_OHR
hi,
Wolfgang Ciriack hat geschrieben: Mi, 10. Jan 2018 22:11 Dazu liest man dann my MS:
For Windows Vista or later, it is recommended that you use IFileDialog with the FOS_PICKFOLDERS option rather than the SHBrowseForFolder function.
Hat das denn schon jemand umgesetzt und in Benutzung ?
soviel ich weiss geht IFileDialog über das iUnKnown Interface womit Xbase++ "so" nicht umgehen kann.

ich hatte das Problem bei iTaskList (Progressbar minimiert in der Taskleiste) und die Lösung ist ähnlich DotNet DLL COM.

Code: Alles auswählen

#xtranslate ITaskbarList_uuidof()                                          => UuidFromString("56FDF342-FD6D-11d0-958A-006097C9A090")
#xtranslate ITaskbarList_QueryInterface( <pi>, [<params,...>])             =>  IFpQCall( 0,"__sl__sl__pt_@sl",<pi> [,<params>] )
#xtranslate ITaskbarList_AddRef( <pi>)                                     =>  IFpQCall( 1,"__sl__sl",<pi>)
man erstellt eine Xbase++ CH Datei mit #xtranslate
als erstes kommt immer die UUID welches die CLSID_* Konstanten darstellen.
nun kommen die Methoden "in der Reihenfolge" wie sie im Source sind wobei es mit 0 (zero) los geht

grob gesagt wird die Methode nicht mit "Namen" sondern mit der "Hausnummer" angesprochen.

---

nun gilt für IFileDialog IMHO das selbe wie für CreateObject( "Shell.Application" ) : nicht abwärts kompatibel. [-X
die "alte" Version läuft unter Win98se bis Windows 10. solange das funktioniert sehe ich keinen Grund was neues zu verwenden.

ein Problem hat man wenn die Hardware ein "alte" APi benutzt die nicht mehr funktioniert unter neuem OS() und damit obsolet wird. das ist z.b. bei Scanner ( Twain -> WIA ) oder TV Karten ( DirectShow -> DWM/DRM ) die man unter Windows 10 benutzten will der Fall.

das sollte aber für Controls / Common Dialog kein Problem sein denn auch DotNet verwendet die "alten" Controls (nur neu verpackt) ja immer noch.

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 7:26
von brandelh
Sowohl Pablos Code (link siehe oben) also auch der "xbppack3" konnte ich mit 1.90 und 2.00 kompilieren.
Es sieht beides im Prinzip gleich aus, als scheint Windows intern auf das gleiche Fenster zurückzugreifen.

Pablos interner code ist ja ganz schön heftig, aber den muss man ja auch nicht verstehen.
Leider hat er den Aufruf der Klasse nicht nach den Parameter Regeln der anderen XbParts gemacht, da muss man sich halt an seine halten. Der Aufruf ist grundsätzlich aber einfach.
Das "XbpPack3" hält sich an die Aufrufkonventionen, aber man muss für jede Xbase++ Haupt-Version die DLL und LIB erzeugen und vorhalten, hier wäre mir eine reine PRG Lösung lieber gewesen ...

Das Ergebnis sieht auf jeden Fall gut aus, schade dass das nicht gleich enthalten war.

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 7:48
von Jan
Hubert,

ich nutze niemals die XbPacks als DLL. Da ich immer nur einzelne Teile daraus verwende (wie die ProgressBar aus dem XbPack 2), lege ich die prg und die dazugehörige ch in entsprechende Verzeichnisse ab, und baue die direkt in meine Projekte ein. Dann passt das immer, und ich brauche keine zusätzliche dll beim Kunden.

Jan

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 8:12
von brandelh
Da hatte ich wohl Scheuklappen auf, klar kann man den Code aus dem DLL Verzeichnis direkt nutzen, das sollte ich bald mal machen ;-)

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 9:34
von HaPe
Hallo Zusammen !

Ich hatte auf der Alaska-Seite nach den drei XbpPacks gesucht, aber nichts gefunden (ich habe eine aktive Professional-Subskription).

Kann mir jemand einen Tipp geben wo ich das bei Alaska finde?

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 9:35
von Martin Altmann
Du musst dich einloggen und dann findest du es im Downloadbereich.

Viele Grüße,
Martin

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 9:44
von HaPe
Hallo Martin !
Du musst dich einloggen und dann findest du es im Downloadbereich
Danke, jetzt habe ich sie gefunden.

Ich hatte mich naürlich eingeloggt und nur über das Menü gesucht.
In den Downloadbereich kommt man aber nur direkt nach dem Einloggen und die Xbase part packs erscheinen auch nur wenn man bei der Version 1.90 (die ich nicht habe) das Häkchen setzt. :D

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 9:47
von Jan
Die XbPacks 1 und 2 sind in der 2.0 als Assets vorhanden. Die 3 soll auch kommen, ist aber lt. Aussage Alaska noch offen, wann.

Ich denke mal die die Asset-Versionen zu bevorzugen sind. Da hat es noch Code-Anderungen gegeben. Die wohl der Stabilität, Integration in die 2.0, Fehelrkorrektur, was auch immer dienen sollen.

Jan

Re: XbpFileDialog() [Erledigt]

Verfasst: Do, 11. Jan 2018 10:22
von HaPe
Hallo Jan !
Die XbPacks 1 und 2 sind in der 2.0 als Assets vorhanden.
Ja, habe ich als parts-pack-no1-1.2.zip und parts-pack-no2-1.2.zip unter c:\Users\myusername\Documents\Xbase++\.assets\ gefunden.
Die PRGs in den ZIPs sind identisch mit denen aus dem Download von Alaska ...