Announcement

Collapse
No announcement yet.

Dialog zum Auswählen von Verzeichnissen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dialog zum Auswählen von Verzeichnissen

    Hallo, <p>
    wie bekomme ich es am schnellsten hin einen Dialog zum Auswählen von Verzeichnissen zu programmieren? Mit TOpenDialog kann man zwar wunderbar Dateien auswählen. Ich möchte aber nur Verzeichnisse auswählen können. Die Dateien in einem Verzeichnis sollen mit angezeigt werden.<p>

    Gruß<p>
    Wolfgang Roller

  • #2
    Der Befehl SelectDirectory aus der unit FileCtrl ist das was Du brauchst, in der Delphi Hilfe gibt es auch noch Hilfe dazu, da sollte man auch reinsehen weil es zwei Versionen davon gibt.

    Comment


    • #3
      Hallo!
      Ich habe mal eine Unit dafür geschrieben. In dieser Auswahlbox wird auch noch der freie Festplattenspeicherplatz und die vorhandenen Dateien des gewählten Ordners angezeigt.
      Falls interesse besteht.

      http://rasmus.weigel.bei.t-online.de

      gruss
      rasmu

      Comment


      • #4
        Hallo,

        Gibt es auch eine Möglichkeit, diesen Dialog absolute zu positionieren. Wenn ich nämlich diesen Dialog aufrufe plaziert er sich immer an die gleiche Stelle. Weiß jemand Rat?

        Gruß Roma

        Comment


        • #5
          Ich weis zwar nicht genau was du möchtest, aber versuch es mal damit:

          Damit kann einen Vetrzeichnissbaum darstellen, mit dem sich auch UNC-Pfade wählen lassen!

          function Getfolder(root: integer; cCaption: string; var cPfad: string): boolean;
          //Siehe Buch Borland Delphi 4 Kochbuch Seite 401 ff. Rezept 155

          var
          bi : TBROWSEINFO;
          lpBuffer : PChar;
          pidlPrograms,
          pidlBrowse : PItemIDList;

          begin
          Result := False;
          if (not SUCCEEDED(SHGetSpecialFolderLocation(getactivewind ow, root, pidlPrograms))) then exit;
          lpBuffer := StrAlloc(max_path);

          bi.hwndOwner := getactivewindow;
          bi.pidlRoot := pidlPrograms;
          bi.pszDisplayName := lpBuffer;
          bi.lpszTitle := pChar(cCaption);
          bi.ulFlags := BIF_RETURNONLYFSDIRS;
          bi.lpfn := nil;
          bi.lParam := 0;

          pidlBrowse := SHBrowseForFolder(bi);
          if (pidlBrowse <> nil) then begin
          Result := True;
          if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) then cPfad:=lpBuffer;
          end else Result := False;
          StrDispose(lpBuffer);
          end;

          Gib mir bitte eine Rückmeldung, wenn Du was damit anfangen kontest!

          Gruß Günte

          Comment


          • #6
            Hier nochmal dasselbe! Die Formatierung vorhin hat nicht geklappt! <p>
            <br>
            Ich weis zwar nicht genau was du möchtest, aber versuch es mal damit:
            <p>
            Damit kann einen Vetrzeichnissbaum darstellen, mit dem sich auch UNC-Pfade wählen lassen! <p>
            <p>
            function Getfolder(root: integer; cCaption: string; var cPfad: string): boolean;
            //Siehe Buch Borland Delphi 4 Kochbuch Seite 401 ff. Rezept 155

            var <br>
            bi : TBROWSEINFO; <br>
            lpBuffer : PChar; <br>
            pidlPrograms, <br>
            pidlBrowse : PItemIDList; <br>
            <br>
            begin <br>
            Result := False; <br>
            if (not SUCCEEDED(SHGetSpecialFolderLocation(getactivewind ow, root, pidlPrograms))) then exit; <br>
            lpBuffer := StrAlloc(max_path); <br>
            <br>
            bi.hwndOwner := getactivewindow; <br>
            bi.pidlRoot := pidlPrograms; <br>
            bi.pszDisplayName := lpBuffer; <br>
            bi.lpszTitle := pChar(cCaption); <br>
            bi.ulFlags := BIF_RETURNONLYFSDIRS; <br>
            bi.lpfn := nil; <br>
            bi.lParam := 0; <br>
            <br>
            pidlBrowse := SHBrowseForFolder(bi); <br>
            if (pidlBrowse <> nil) then begin <br>
            Result := True; <br>
            if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) then cPfad:=lpBuffer; <br>
            end else Result := False; <br>
            StrDispose(lpBuffer); <br>
            end; <br>
            <br>
            <br>
            Gib mir bitte eine Rückmeldung, wenn Du was damit anfangen kontest! <br>
            <br>
            Gruß Günter <br&gt

            Comment


            • #7
              Hallo Günter,

              ich bedanke mich für Deine prompte Antwort. Was ich genau meinte war die Funktion SelectDirectory. Wenn man diese Funktion ausführt, wird der StandardWindows Directory Dialog ausgeführt. Doch wenn dieser am Bildschirm erscheint, ist er immer an der gleichen Stelle. In der Funktion "SelectDirectory" selber finden sich keine Parameter, diesen Dialog zu positionieren. Das wars, was ich meinte. Aber vielleicht hast Du auch für dieses Problem eine Antwort :-) Würde mich freuen.

              Gruß Roma

              Comment


              • #8
                Hallo Wolfgang,

                ich habe hier eine Lösung mit Hilfe der Callback-Funktion.

                Vielleicht gibt es eine auch einfachere Lösung, aber diese funktioniert. Wichtig ist, dass der Startpfad NICHT mit einem Backslash endet!

                Function BrowseCallbackProc( hwnd : HWND; uMsg :uint ; lparam :LPARAM; pldata :LPARAM ):integer;

                var msgLParam,
                msgWParam :integer;

                begin

                if (uMsg = BFFM_INITIALIZED) and (plData <> 0) then

                begin

                msgLParam := plData;

                msgWParam := integer( true );

                SendMessage( hwnd, BFFM_SETSELECTION , msgwParam, msglParam );

                end;

                result := 0;

                end;

                function GetFolder(Root:integer;Caption:string; sStartPath :String ):string;

                var
                bi : TBROWSEINFO;
                lpBuffer : PChar;
                pidlPrograms,
                pidlBrowse : PItemIDList;

                begin

                if (not SUCCEEDED(SHGetSpecialFolderLocation(getactivewind ow,Root,pidlPrograms))) then

                Exit;

                lpBuffer:=StrAlloc(max_path);

                bi.hwndOwner := getactivewindow;

                bi.pidlRoot := pidlPrograms;

                bi.pszDisplayName := lpBuffer;

                bi.lpszTitle := pChar(caption);

                bi.ulFlags := BIF_RETURNONLYFSDIRS ;

                bi.lpfn := BrowseCallbackProc;

                if (sStartPath <> '') then

                bi.lParam := integer( PChar( sStartPath ) )

                else

                bi.lParam := 0;

                pidlBrowse := SHBrowseForFolder(bi);

                if (pidlBrowse<>nil) then begin

                if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) then

                Result:=lpBuffer;

                end;

                StrDispose(lpBuffer);

                end; {GetFolder

                Comment


                • #9
                  hoi Wolfgang<p>
                  Hier noch eine kleine Anregung wie man einen Dialog zum Auswählen von Verzeichnissen programmieren kann.<p>

                  procedure TForm1.Button1Click(Sender: TObject);<br>
                  var<br>
                  sFile : string;<br>
                  begin<br>
                  sFile := PrvBrowseDialog('Choose a folder with mp3 files', BIF_RETURNONLYFSDIRS);<br>
                  Edit1.Text := sFile;<br>
                  end;<br>

                  //--------------------------------------------------------------------<br>//- private Methoden ---------------------------------------------<br>
                  //--------------------------------------------------------------------<br>

                  function TForm1.PrvBrowseDialog(const Title: string; const Flag: integer): string;<br>
                  var<br>
                  lpItemID : PItemIDList;<br>
                  BrowseInfo : TBrowseInfo;<br>
                  DisplayName : array[0..MAX_PATH] of char;<br>
                  TempPath : array[0..MAX_PATH] of char;<br>
                  begin<br>
                  Result:='';<br>
                  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);<br>
                  with BrowseInfo do begin<br>
                  hwndOwner := Application.Handle;<br>
                  pszDisplayName := @DisplayName;<br>
                  lpszTitle := PChar(Title);<br>
                  ulFlags := Flag;<br>
                  end;<br>
                  lpItemID := SHBrowseForFolder(BrowseInfo);<br>
                  if lpItemId <> nil then begin<br>
                  SHGetPathFromIDList(lpItemID, TempPath);<br>
                  Result := IncludeTrailingBackslash(TempPath);<br>
                  GlobalFreePtr(lpItemID);<br>
                  end;<br>
                  end; // TForm1.PrvBrowseDialog<br&gt

                  Comment

                  Working...
                  X