Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

XbpFileDialog() [Erledigt]

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

XbpFileDialog() [Erledigt]

Beitrag von Jan » Mi, 10. Jan 2018 11:10

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13976
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von brandelh » Mi, 10. Jan 2018 11:36

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.
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6883
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von Tom » Mi, 10. Jan 2018 11:40

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:
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13976
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von brandelh » Mi, 10. Jan 2018 11:42

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
Gruß
Hubert

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von Jan » Mi, 10. Jan 2018 12:03

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 368
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

Re: XbpFileDialog()

Beitrag von mini990 » Mi, 10. Jan 2018 12:21

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)

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 309
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: XbpFileDialog()

Beitrag von HaPe » Mi, 10. Jan 2018 12:23

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
--
Hans-Peter

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von Jan » Mi, 10. Jan 2018 12:32

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von Jan » Mi, 10. Jan 2018 12:41

Hmm. Das Teil klappt soweit ganz gut. Aber aus irgend einem Grund werden gemappte Laufwerke nicht mit aufgeführt. Das ist ja ärgerlich.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von Jan » Mi, 10. Jan 2018 13:27

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13976
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpFileDialog()

Beitrag von brandelh » Mi, 10. Jan 2018 14:12

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:
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10806
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpFileDialog()

Beitrag von AUGE_OHR » Mi, 10. Jan 2018 20:11

Jan hat geschrieben:
Mi, 10. Jan 2018 12:32
In 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) 7-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2332
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von Wolfgang Ciriack » 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 ?
Viele Grüße
Wolfgang

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10806
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpFileDialog() [Erledigt]

Beitrag von AUGE_OHR » Mi, 10. Jan 2018 23:26

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.
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13976
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von brandelh » Do, 11. Jan 2018 7:26

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.
Gruß
Hubert

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von Jan » Do, 11. Jan 2018 7:48

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13976
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von brandelh » Do, 11. Jan 2018 8:12

Da hatte ich wohl Scheuklappen auf, klar kann man den Code aus dem DLL Verzeichnis direkt nutzen, das sollte ich bald mal machen ;-)
Gruß
Hubert

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 309
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: XbpFileDialog() [Erledigt]

Beitrag von HaPe » Do, 11. Jan 2018 9:34

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?
--
Hans-Peter

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13890
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von Martin Altmann » Do, 11. Jan 2018 9:35

Du musst dich einloggen und dann findest du es im Downloadbereich.

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

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 309
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: XbpFileDialog() [Erledigt]

Beitrag von HaPe » Do, 11. Jan 2018 9:44

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
--
Hans-Peter

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12632
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von Jan » Do, 11. Jan 2018 9:47

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 309
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: XbpFileDialog() [Erledigt]

Beitrag von HaPe » Do, 11. Jan 2018 10:22

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 ...
--
Hans-Peter

Antworten