View Full Version : سوال: پنجره ی انتخاب پوشه
  
E power
جمعه 20 بهمن 1391, 20:25 عصر
سلام دوستان ...
این پنجره ی مخصوص انتخاب پوشه رو چجوری میشه ازش استفاده کنیم .. توی کامپوننت ها نبود!:متفکر:
99771
Vafa-1391
جمعه 20 بهمن 1391, 20:58 عصر
بايد كامپوننت TMS Component Pack نصب كني 
بعد از نصب folder dialogرو انتخاب كن
بدونه كامپوننت هم ميشه
http://barnamenevis.org/showthread.php?278860-%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-dialog-folder-brows
samani
یک شنبه 22 بهمن 1391, 12:41 عصر
نيازي به نصب كامپوننت خاصي نيست شما ميتونيد از نمونه كد زير استفاده كنيد
در ضمن با نصب هر كامپوننتي پروژه ها رو سنگين تر و آسيب پذيرتر نكنيد
uses ..., ShlObj, ActiveX;
function AdvSelectDirectory(const Caption: string; const Root: WideString;
  var Directory: string; EditBox: Boolean = False; ShowFiles: Boolean = False;
  AllowCreateDirs: Boolean = True): Boolean;
  function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam)
    : Integer; stdcall;
  begin
    if uMsg = BFFM_INITIALIZED then
      SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
    Result := 0;
  end;
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
const
  BIF_USENEWUI = $0040;
  BIF_NOCREATEDIRS = $0200;
begin
  Result := False;
  if not DirectoryExists(Directory) then
    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;
      OleInitialize(nil);
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS or BIF_USENEWUI or BIF_EDITBOX *
          Ord(EditBox) or BIF_BROWSEINCLUDEFILES * Ord(ShowFiles) or
          BIF_NOCREATEDIRS * Ord(not AllowCreateDirs);
        lpfn := @SelectDirCB;
        if Directory <> '' then
          lParam := Integer(PChar(Directory));
      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
  dir: string;
begin
  dir := '';
  if AdvSelectDirectory('مسير مقصد را انتخاب كنيد', '', dir) then
    begin
      ...
    end;
end;
BORHAN TEC
یک شنبه 22 بهمن 1391, 12:51 عصر
سلام
در ضمن با نصب هر كامپوننتي پروژه ها رو سنگين تر و آسيب پذيرتر نكنيد
ببخشید جسارت میکنم. لااقل از تاریخ عضویتتون میشه فهمید که تجربه بالایی دارید ولی به نظر من در این مورد خاص شما اشتباه می کنید. به نظر من با انجام این کار برنامه آسیب پذیر نمیشه! مثلاً کامپوننت های JVCL خیلی زیاد تست می شوند و معمولاً باگ ندارند ولی این کد شما ممکنه که در نسخه های بعدی ویندوز درست کار نکنه، البته این را هم نمی توان با قطعیت گفت و فقط یک احتمال است ولی آنچه که مسلم است این است که این کامپوننت ها با دقت بسیار زیادی ساخته می شوند. از طرفی هم درک کدی که قرار داده اید کار ساده ای نیست و اصلاً توجیهی وجود نداره که برای هر کار ساده ای بخواهیم کدی شبیه به این را ایجاد کنیم و بر عکس شما من فکر می کنم همین کدی که شما قرار داده اید برنامه را آسیب پذیر تر می کند و نه استفاده از یک کامپوننت معروف! 
این پنجره ی مخصوص انتخاب پوشه رو چجوری میشه ازش استفاده کنیم .. توی کامپوننت ها نبود!
کامپوننت مربوط به این Dialog به طور پیش فرض در VCL موجود نیست ولی در مجموعه کامپوننت هایی مثل JVCL و TMS و ... وجود دارد. البته چند روش مختلف هم وجود داره که با همون VCL بتونید به این پنجره دسترسی داشته باشید. مثلاً مثل استفاده از تابع SelectDirectory از یونیت FileCtrl و چندین روش دیگه.
موفق باشید...
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.