Announcement

Collapse
No announcement yet.

SHBrowseForFolder & Button "Neuer Ordner"

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

  • SHBrowseForFolder & Button "Neuer Ordner"

    Hallo Leute,

    ich suche seit einigen Tagen nach folgendem Parameter für
    die Funktion SHBrowseForFolder.

    Ich möchte diesen Dialog
    -- mit dem Button "Neuer Ordner" --
    aufrufen.

    Ist das ein anderer API Befehl ? Oder ist der Parameter
    nicht dokumentiert ?
    Bitte um Hilfe.

    Gruß
    M.Buch

  • #2
    Moin Mike,<br>
    <br>
    welche Flags setzt Du denn in der BROWSEINFO Struktur?<br>
    Eigentlich ist es umgekehrt. Man muss ein Flag setzten, damit der Button <u>nicht</u> angezeigt wird.<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      Hallo Chris,

      hier meine Funktion:
      Bei mir kommt dir Button nicht!
      Danke im Vorraus

      Mike
      <PRE>
      function BrowseForFolder: PChar;
      const
      OpValues : Array [TBrowseOpt] of UINT =
      (BIF_BROWSEINCLUDEFILES,
      BIF_STATUSTEXT,
      BIF_EDITBOX);
      OpValues2 : Array[TBrowseFor] of UINT =
      (BIF_RETURNONLYFSDIRS,
      BIF_BROWSEFORCOMPUTER,
      BIF_BROWSEFORPRINTER);
      var
      aBI : TBrowseInfo;
      szBuffer : array [0..MAX_PATH] of Char;
      pidl : pItemIDList;
      myRoot : pItemIDList;
      aBO : TBrowseOpt;
      aBF : TBrowseFor;
      Options: TBrowseOptions;
      OBrowseFor: TBrowseForOption;
      begin
      MyRoot := nil;
      Result := '';
      Options:= [];
      OBrowseFor:= [bfFolders];
      with aBI do begin
      hwndOwner := GetActiveWindow;
      pidlRoot := MyRoot;
      pszDisplayName := @szbuffer;
      szBuffer[0] := #0;
      lpszTitle := PChar('Verzeichnis wählen...');
      ulFlags:= 0;
      for aBO := Low(aBO) to High(aBO) do
      if aBO in options then
      ulFlags := ulFlags or OpValues[aBO];
      for aBF := Low(aBF) to High(aBF) do
      if aBF in obrowsefor then
      ulFlags := ulFlags or OpValues2[aBF];
      end;
      aBI.lpfn := @BrowseCallbackProc;
      aBI.lParam := 0;
      aBI.iImage := 0;
      pidl := ShBrowseForFolder(aBI);
      if pidl &lt;&gt; nil then
      begin
      if SHGetPathFromIDList(pidl, szBuffer) then
      Result := szBuffer;
      CoTaskMemFree(pidl);
      end;
      end;
      </PRE&gt

      Comment


      • #4
        Moin Mike,<br>
        <br>
        könntest Du dann auch noch mal Deine selbst deklarierten Typen angeben (z.B. TBrowseOpt usw.)<br>
        So kann ich das jetzt leider nicht nachvollziehen ;-)<br>
        <br>
        Ciao<br>
        Chri

        Comment


        • #5
          Hi nochmal,

          sorry hab gepennt !

          <PRE>
          type
          TBrowseOpt = (boIncludeFiles, boShowStatusText, boShowEditBox);
          TBrowseOptions = set of TBrowseOpt;
          TBrowseFor = (bfFolders, bfComputers, bfPrinters);
          TBrowseForOption = Set of TBrowseFor;
          </PRE&gt

          Comment


          • #6
            Ähhh Mike... und die Callback Funktion? ;-

            Comment


            • #7
              So :-/
              jetzt fehlt nix mehr !

              <PRE>
              library probrows;
              <p>
              uses
              SysUtils, ShlObj, ActiveX, Windows, Classes, Dialogs;
              <p>
              type
              TBrowseOpt = (boIncludeFiles, boShowStatusText, boShowEditBox);
              TBrowseOptions = set of TBrowseOpt;
              TBrowseFor = (bfFolders, bfComputers, bfPrinters);
              TBrowseForOption = Set of TBrowseFor;
              <p>
              {$R *.res}
              <p>
              function BrowseCallbackProc(BrowseHandle: hwnd; Event: UINT; lParam, lpData: LPARAM) : integer; stdcall;
              var szBuffer : array [0..MAX_PATH] of Char;
              sPath : String;
              doStatusText : String;
              begin
              Result:= -1;
              if Event = BFFM_INITIALIZED then begin
              SendMessage(BrowseHandle,BFFM_ENABLEOK ,0,0);
              end;
              doStatusText := EmptyStr;
              if Event = BFFM_SELCHANGED then begin
              SHGetPathFromIDList(PItemIDList(lparam), szBuffer);
              sPath := StrPas(szBuffer);
              SendMessage(BrowseHandle,BFFM_ENABLEOK ,0,1);
              if (Length(sPath) = 0) then
              SendMessage(BrowseHandle,BFFM_ENABLEOK ,0,0);
              end;
              end;
              <p>
              function BrowseForFolder(OBrowseFor: TBrowseForOption): PChar;
              const
              OpValues : Array [TBrowseOpt] of UINT =
              (BIF_BROWSEINCLUDEFILES,
              BIF_STATUSTEXT,
              BIF_EDITBOX);
              OpValues2 : Array[TBrowseFor] of UINT =
              (BIF_RETURNONLYFSDIRS,
              BIF_BROWSEFORCOMPUTER,
              BIF_BROWSEFORPRINTER);
              var
              aBI : TBrowseInfo;
              szBuffer : array [0..MAX_PATH] of Char;
              pidl : pItemIDList;
              myRoot : pItemIDList;
              aBO : TBrowseOpt;
              aBF : TBrowseFor;
              Options: TBrowseOptions;
              begin
              MyRoot := nil;
              Result := '';
              Options:= [];
              with aBI do begin
              hwndOwner := GetActiveWindow;
              pidlRoot := MyRoot;
              pszDisplayName := @szbuffer;
              szBuffer[0] := #0;
              lpszTitle := PChar('Verzeichnis wählen...');
              ulFlags:= 0;
              for aBO := Low(aBO) to High(aBO) do
              if aBO in options then
              ulFlags := ulFlags or OpValues[aBO];
              for aBF := Low(aBF) to High(aBF) do
              if aBF in obrowsefor then
              ulFlags := ulFlags or OpValues2[aBF];
              end;
              aBI.lpfn := @BrowseCallbackProc;
              aBI.lParam := 0;
              aBI.iImage := 0;
              pidl := ShBrowseForFolder(aBI);
              if pidl &lt;&gt; nil then
              begin
              if SHGetPathFromIDList(pidl, szBuffer) then
              Result := szBuffer;
              CoTaskMemFree(pidl);
              end;
              end;
              <p>
              function GetFolder(path: PChar; var Len: Integer): Boolean; stdcall;
              var sReturn: AnsiString;
              begin
              sReturn:= BrowseForFolder([bfFolders]);
              if (len &lt; Length(sReturn)) OR (Length(sReturn) = 0) then begin
              Result := False;
              Len := Length(sReturn);
              Path := #0;
              end
              else begin
              If sReturn[Length(sreturn)] &lt;&gt; '\' then
              sReturn := sReturn + '\';
              Result := True;
              StrPCopy(Path, sreturn);
              Len := Length(sreturn);
              end;
              end;
              <p>
              exports
              <p>
              GetFolder index 1 name 'f_BrowseForFolder';
              </PRE&gt

              Comment


              • #8
                Moin Mike,<br>
                <br>
                jetzt hab' ich's gefunden:<br>
                <br>
                Es fehlt das Flag, das dem Dialog angibt, dass der "neue Stil" verwendet werden soll (Einzelheiten siehe PSDK)<br>
                <br>
                for aBF := Low(aBF) to High(aBF) do <br>
                if aBF in obrowsefor then <br>
                ulFlags := ulFlags or OpValues2[aBF]; <br>
                <b>ulFlags := ulFlags or BIF_NEWDIALOGSTYLE;</b><br>
                <br>
                BIF_NEWDIALOGSTYLE hat den Wert $0040<br>
                <br>
                Ciao<br>
                Chri

                Comment


                • #9
                  Moin Chris,

                  SUPER Danke Danke Danke !!!!!!!
                  Geht jetzt.

                  Letzte Frage:
                  Funktioniert das bei jedem Betreibssystem ?
                  Und wenn nein, welche Vorraussetungen müssen geschaffen werden?

                  Und .... ääähhh .... was ist (P)SDK ?

                  Gruß
                  Mik

                  Comment


                  • #10
                    Moin Mike,<br>
                    <br>
                    wo das funktioniert ist leider schlecht dokumentiert, wie ich finde.<br>
                    Ab Windows 2000 /ME sollte es auf jeden Fall gehen, mit installiertem IE 5 könnte es auch unter 95/98/NT 4.0 gehen, erfahrungsgemäss allerdings nicht, da die entscheidende Datei die Shell32.DLL ist. Es muss Version 5.0 sein.<br>
                    Das Problem, dass nicht alles unter NT 4.0 funktioniert hatte ich gerade erst. :-(<br>
                    <br>
                    Das PSDK ist das Microsoft Platform Software Developers Kit.<br>
                    Die Dokumentation der Windows API. Das kannst Du unter<br>
                    <br>
                    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/<br>
                    <br>
                    herunterladen.<br>
                    Sind allerdings, bei Vollinstallation, so 350MB<br>
                    Du kannst unter dem Menüpunkt Downloads auswählen, was Du haben willst.<br>
                    Das wird, in eingeschränkter, und i.d.R. veralteter Form wohl auch bei Delphi mitgeliefert.<br>
                    <br>
                    Ciao<br>
                    Chri

                    Comment


                    • #11
                      Hallo Christian,

                      vielen Dank für die Super Hilfe !

                      Gruß
                      Mik

                      Comment

                      Working...
                      X