PDA

View Full Version : سوال: پنجره ی انتخاب پوشه



E power
جمعه 20 بهمن 1391, 19:25 عصر
سلام دوستان ...
این پنجره ی مخصوص انتخاب پوشه رو چجوری میشه ازش استفاده کنیم .. توی کامپوننت ها نبود!:متفکر:
99771

Vafa-1391
جمعه 20 بهمن 1391, 19: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, 11: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, 11:51 صبح
سلام

در ضمن با نصب هر كامپوننتي پروژه ها رو سنگين تر و آسيب پذيرتر نكنيد
ببخشید جسارت میکنم. لااقل از تاریخ عضویتتون میشه فهمید که تجربه بالایی دارید ولی به نظر من در این مورد خاص شما اشتباه می کنید. به نظر من با انجام این کار برنامه آسیب پذیر نمیشه! مثلاً کامپوننت های JVCL خیلی زیاد تست می شوند و معمولاً باگ ندارند ولی این کد شما ممکنه که در نسخه های بعدی ویندوز درست کار نکنه، البته این را هم نمی توان با قطعیت گفت و فقط یک احتمال است ولی آنچه که مسلم است این است که این کامپوننت ها با دقت بسیار زیادی ساخته می شوند. از طرفی هم درک کدی که قرار داده اید کار ساده ای نیست و اصلاً توجیهی وجود نداره که برای هر کار ساده ای بخواهیم کدی شبیه به این را ایجاد کنیم و بر عکس شما من فکر می کنم همین کدی که شما قرار داده اید برنامه را آسیب پذیر تر می کند و نه استفاده از یک کامپوننت معروف!

این پنجره ی مخصوص انتخاب پوشه رو چجوری میشه ازش استفاده کنیم .. توی کامپوننت ها نبود!
کامپوننت مربوط به این Dialog به طور پیش فرض در VCL موجود نیست ولی در مجموعه کامپوننت هایی مثل JVCL و TMS و ... وجود دارد. البته چند روش مختلف هم وجود داره که با همون VCL بتونید به این پنجره دسترسی داشته باشید. مثلاً مثل استفاده از تابع SelectDirectory از یونیت FileCtrl و چندین روش دیگه.

موفق باشید...