我想让用户选择一个文件夹,所以使用selectdirectory函数来弹出选择窗口
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
但是当窗口弹出后,总是出现在屏幕的右下角,特别别扭,不知怎么控制它的弹出位置,让他从屏幕中央。

解决方案 »

  1.   

    uses
      ShlObj, ActiveX;function SelectDirectory(const Caption: string; const Root: WideString;
      OwnerWindow: THandle; out Directory: string): Boolean;
    var
      WindowList: Pointer;
      BrowseInfo: TBrowseInfo;
      Buffer: PChar;
      RootItemIDList, ItemIDList: PItemIDList;
      ShellMalloc: IMalloc;
      IDesktopFolder: IShellFolder;
      Eaten, Flags: LongWord;
    begin
      Result := False;
      Directory := '';
      FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
      if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
      begin
        Buffer := ShellMalloc.Alloc(MAX_PATH);
        try
          RootItemIDList := nil;
          if Root <> '' then
          begin
            SHGetDesktopFolder(IDesktopFolder);
            IDesktopFolder.ParseDisplayName(Application.Handle, nil,
              POleStr(Root), Eaten, RootItemIDList, Flags);
          end;
          with BrowseInfo do
          begin
            hwndOwner := OwnerWindow;
            pidlRoot := RootItemIDList;
            pszDisplayName := Buffer;
            lpszTitle := PChar(Caption);
            ulFlags := BIF_RETURNONLYFSDIRS;
          end;
          WindowList := DisableTaskWindows(0);
          try
            ItemIDList := ShBrowseForFolder(BrowseInfo);
          finally
            EnableTaskWindows(WindowList);
          end;
          Result :=  ItemIDList <> nil;
          if Result then
          begin
            ShGetPathFromIDList(ItemIDList, Buffer);
            ShellMalloc.Free(ItemIDList);
            Directory := Buffer;
          end;
        finally
          ShellMalloc.Free(Buffer);
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      vDirectory: string;
    begin
      SelectDirectory('Select Path', '', Handle, vDirectory);
    end;