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
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

XbpFileDialog() [Erledigt]

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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:
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: XbpFileDialog()

Beitrag 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)
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: XbpFileDialog()

Beitrag 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
--
Hans-Peter
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpFileDialog()

Beitrag 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:
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: XbpFileDialog()

Beitrag 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) 238-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag 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 ?
Viele Grüße
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: XbpFileDialog() [Erledigt]

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: XbpFileDialog() [Erledigt]

Beitrag 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?
--
Hans-Peter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag von Martin Altmann »

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: 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
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: XbpFileDialog() [Erledigt]

Beitrag 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
--
Hans-Peter
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: XbpFileDialog() [Erledigt]

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: XbpFileDialog() [Erledigt]

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