Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi SelectDirectory (https://www.delphipraxis.net/196006-selectdirectory.html)

Walter Landwehr 13. Apr 2018 17:34

SelectDirectory
 
Hallo, gibt es etwas wie SelectDirectory das auch die verbundenen Laufwerke mit anzeigt.

mkinzler 13. Apr 2018 17:42

AW: SelectDirectory
 
SelectDirectory() sollte das beim Setzen der Option sdShowShares können.

KodeZwerg 13. Apr 2018 18:00

AW: SelectDirectory
 
Vielleicht magst Du ja eine Zwei-In-Einem Variante, für WindowsXP dein SelectDirectory und ab Vista das neue Fenster.
Ist Hauptsächlich nur die Optik.

Delphi-Quellcode:
function SelDir ( StartPath : String; var SelectedDir : String ) : Boolean;
begin
  Result := False;
  if Win32MajorVersion >= 6 then
  with TFileOpenDialog.Create(nil) do
    try
      Title := 'Select Directory';
      Options := [fdoPickFolders, fdoPathMustExist, fdoForceFileSystem];
      OkButtonLabel := 'Select';
      DefaultFolder := StartPath;
      FileName := StartPath;
      if Execute then
      begin
        SelectedDir := FileName;
        Result := True;
      end;
    finally
      Free;
    end
    else
    if SelectDirectory('Select Directory', ExtractFileDrive(StartPath), StartPath,
                       [sdNewUI, sdNewFolder, sdShowShares]) then
     begin
       SelectedDir := StartPath;
       Result := True;
     end;
end;


// Beispiel Aufruf:
procedure TForm2.Button1Click(Sender: TObject);
var
  s : String;
begin
 if SelDir('',S) then ShowMessage(s);
end;
Unterschiede zwischen Vista und XP Dialog wäre falls Du so
Delphi-Quellcode:
SelDir('C:\XYZ\',S)
den Aufruf machst, unter Vista wäre der User beim Aufruf bereits in "C:\XYZ\" drinnen bei XP hingegen hätte der Dialog "C:\XYZ\" ausgewählt.

Walter Landwehr 13. Apr 2018 18:48

AW: SelectDirectory
 
Hallo Markus, hat ich auch gedacht, funktioniert aber nicht.

Hier mein Code:

Delphi-Quellcode:
procedure TOptionenFrm.dedtSicherungspfadPropertiesButtonClick(Sender: TObject;
  AButtonIndex: Integer);
Var Dir : string;
begin
  if (dmMain.ibqryOptionen.State <> dsEdit) then
      dmMain.ibqryOptionen.Edit;

  SelectDirectory('Einen Ordner zum Speichern wählen.', '', Dir, [sdShowEdit, sdNewFolder, sdShowShares, sdNewUI]);

  dmMain.ibqryOptionen.FieldByName('SICHERUNGSPFAD').AsString := Dir;
end;
Hallo CodeZwerg,

werde ich morgen mal probieren, berichte dann.

KodeZwerg 13. Apr 2018 19:07

AW: SelectDirectory
 
Hallo, ich habe noch mal ein wenig rumprobiert und etwas festgestellt:
Wenn ich SelectDirectory() aufrufe mit einem Start-Verzeichniss als Parameter, dann werden merkwürdigerweise alle Laufwerke ausgeblendet, auch lokale, es wird nur das Laufwerk eingeblendet was im Start-Parameter übergeben wurde.
Könnte es daran liegen das es bei Dir nicht fruchtet?

himitsu 13. Apr 2018 20:17

AW: SelectDirectory
 
Lasst doch bitte das uralte SelectDirectory links liegen und verwendet TFileOpenDialog mit fdoPickFolders. (bzw. siehe Kapselungen ala dem SelDir von da oben)
Den der alte Dialog ist absolut nicht benutzerfreundlich und dazu auch noch hässlich.

Einzig und allein das SelectDirectory mit dem Directories:TArray<string> wäre brauchbar, denn das nutzt oben genannten Dialog.

Zitat:

Wenn ich SelectDirectory() aufrufe mit einem Start-Verzeichniss als Parameter
Ich seh alles.

KodeZwerg 13. Apr 2018 20:31

AW: SelectDirectory
 
Ja ich hatte auch probiert die andere SelectDirectory() Methode zu verwenden aber bin nicht dahintergekommen wie ich den korrekt Aufrufe, könntest Du so lieb sein ein Beispiel dafür geben?

himitsu 13. Apr 2018 20:53

AW: SelectDirectory
 
Ich nutze ein eigenes TFileOpenDialog mit fdoPickFolders, quasi in einer etwas aufgemotzteren Version dieses SelDir.

Aber ein Blick in das Code Insight oder in die OH und schon kommt sowas bei raus, als Minimalbeispiel.
Delphi-Quellcode:
var
  A: TArray<string>;
begin
  //if SelectDirectory('', A) then
  //if SelectDirectory('D:\', A) then
  if SelectDirectory('D:\', A, [sdAllowMultiselect], 'Der Titel', 'Ein Label', 'Der Button') then
    ShowMessage(string.Join(sLineBreak, A)); // bei nur einem reicht A[0]

  if FileOpenDialog1.Execute then // mit fdoPickFolders und sdAllowMultiselect
    ShowMessage(FileOpenDialog1.Files.Text); // FileOpenDialog1.FileName

KodeZwerg 13. Apr 2018 20:56

AW: SelectDirectory
 
Vielen Dank, teste ich gleich mal aus und "upgrade" den OldSchool Dialog.
Ps: Ich vermute ein "TArray<string>;" weil damit auch Multiple-Sachen selektiert werden können.

edit
Nun weiß ich warum mein voriger Versuch immer fehlschlug, da gibt es ja ein anderes Option-Set :wall:

himitsu 13. Apr 2018 20:59

AW: SelectDirectory
 
War'n kleiner Copy&Paste-Error drin.

PS: Bei den neuen Open-/SaveDialogs kann man eine GUID angeben, damit speichert Windows das zuletzt ausgewählte Verzeichnis.
Wird wieder ein Dialog mit dieser GUID aufgerufen, dann wird InitialDir ignoriert und das letzte Verzeichnis geladen.

KodeZwerg 13. Apr 2018 21:49

AW: SelectDirectory
 
SelDir() Update

Delphi-Quellcode:
function SelDir ( StartPath : String; var SelectedDir : String ) : Boolean;
var
 tmp : TArray<string>;
begin
  Result := False;
  if Win32MajorVersion >= 6 then
  with TFileOpenDialog.Create(nil) do
    try
      Title := 'Select Directory';
      Options := [fdoPickFolders, fdoPathMustExist, fdoForceFileSystem];
      OkButtonLabel := 'Select';
      DefaultFolder := StartPath;
      FileName := StartPath;
      if Execute then
      begin
        SelectedDir := FileName;
        Result := True;
      end;
    finally
      Free;
    end
    else
//  Mögliche Options: sdHidePinnedPlaces, sdNoDereferenceLinks, sdForceShowHidden, sdAllowMultiselect
     if SelectDirectory(StartPath, tmp, [sdForceShowHidden], 'Select Directory', 'Foldername:', 'Select')
// BACKUP - hier noch der Aufruf für den kleinen Dialog
//  Mögliche Options: sdNewFolder, sdShowEdit, sdShowShares, sdNewUI, sdShowFiles, sdValidateDir
//  mit Option sdShowFiles wird aus dem auch ein Datei-Selektor
//    if SelectDirectory('Select Directory', ExtractFileDrive(StartPath), StartPath,
//                       [sdNewFolder, sdShowEdit, sdShowShares, sdNewUI, sdValidateDir])
     then begin
       SelectedDir := tmp[0]; // Achtung, hier wird nur der erste Eintrag genommen! Also so nicht "sdAllowMultiselect" fähig
//       SelectedDir := StartPath; //  BACKUP - für den alten Dialog
       Result := True;
     end;
end;


// Beispiel Aufruf:
procedure TForm2.Button1Click(Sender: TObject);
var
  s : String;
begin
 if SelDir('C:\Tools\',S) then ShowMessage(s);
end;
Dank gilt himitsu für's Zeit nehmen und Erklären und das bei mir endlich der Groschen gefallen ist warum ich's Anfang nicht hinbekam, es gibt zwei Unterschiedliche Option-Sets, muss man auch erstmal draufkommen :)

Nun sehen Dialoge unter XP und Vista sogut wie gleich aus, beide Verhalten sich relativ identisch.

Walter Landwehr 14. Apr 2018 09:17

AW: SelectDirectory
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das sieht zwar sehr schön aus, aber mir fehlen immer noch die verbundenen Laufwerke. (siehe Anhang) Für den Anwender ist es einfacher, wenn diese sichtbar sind, als über das Netzwerk diese zu suchen was die meisten nicht mal verstehen.
Gibt's da noch einen Trick?

Ansonsten wirklich super, vielen Dank schon mal.

KodeZwerg 14. Apr 2018 09:43

AW: SelectDirectory
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1399213)
mir fehlen immer noch die verbundenen Laufwerke

Das verstehe ich gerade nicht, im Bild sind doch Netzlaufwerke abgebildet?

Walter Landwehr 14. Apr 2018 10:07

AW: SelectDirectory
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry das Bild kommt von dem Windows Explorer. Hier das Bild von TFileOpenDialog.

Walter Landwehr 14. Apr 2018 10:39

AW: SelectDirectory
 
Es geht wenn man mit net use die Laufwerke zuweist.

KodeZwerg 14. Apr 2018 10:41

AW: SelectDirectory
 
Delphi-Quellcode:
function SelDir ( StartPath : String; var SelectedDir : String ) : Boolean;
begin
  Result := False;
  with TFileOpenDialog.Create(nil) do
    try
      Title := 'Select Directory';
      Options := [fdoPickFolders, fdoPathMustExist, fdoAllNonStorageItems, fdoShareAware, fdoForceShowHidden, fdoDefaultNoMiniMode];
      OkButtonLabel := 'Select';
      DefaultFolder := StartPath;
      FileName := StartPath;
      if Execute then
      begin
        SelectedDir := FileName;
        Result := True;
      end;
    finally
      Free;
    end
end;
Nur ein Versuch, hier habe ich andere Optionen gewählt die Eigentlich auch Netzlaufwerke Anzeigen sollte.
Bitte einmal Testen, Danke.
Ps: Hier ist der XP Dialog komplett weg.

Nachteil: Es werden dummerweise auch Archive angezeigt :(

edit
hab diese Überbleibsel entfernt
Code:
var tmp : TArray<string>;

Walter Landwehr 14. Apr 2018 10:52

AW: SelectDirectory
 
Ja das funktioniert auch. Danke für Deine Hilfe.

KodeZwerg 14. Apr 2018 10:59

AW: SelectDirectory
 
Das freut mich wenn alles nun klappt!
Da leider auch, zumindest bei mir, auch Archive angezeigt werden wäre da eventuell noch ein "ExtractFilePath()" sinnvoll.
Nicht das Dein Programm Versucht eine Datei als Ordner zu benutzen.

KodeZwerg 14. Apr 2018 11:09

AW: SelectDirectory
 
Delphi-Quellcode:
function SelDir ( StartPath : String; var SelectedDir : String ) : Boolean;
begin
  Result := False;
  with TFileOpenDialog.Create(nil) do
    try
      Title := 'Select Directory';
      Options := [fdoPickFolders, fdoPathMustExist, fdoAllNonStorageItems, fdoShareAware, fdoForceShowHidden, fdoDefaultNoMiniMode];
      OkButtonLabel := 'Select';
      DefaultFolder := StartPath;
      FileName := StartPath;
      if Execute then
      begin
        if FileExists(FileName) then SelectedDir := ExtractFilePath(FileName) else SelectedDir := FileName;
        Result := True;
      end;
    finally
      Free;
    end
end;
So wärst Du auf der sicheren Seite, falls User eine .CAB Datei wählt, wird dessen Verzeichniss genommen anstelle des Archivnamens.

Walter Landwehr 14. Apr 2018 12:21

AW: SelectDirectory
 
Danke habe ich umgesetzt.

KodeZwerg 14. Apr 2018 15:22

AW: SelectDirectory
 
Gern geschehen und weiterhin Viel Erfolg!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz