PDA

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



mbshareat
دوشنبه 27 شهریور 1391, 12:12 عصر
سلام
من میخوام یه پنجره انتخاب شاخه داشته باشم که یه Edit هم داشته باشه که اگه از یه جا آدرس رو کپی گرفته بودم بتونم توش الصاق کنم!
می دونم SelectDirectory برای انتخاب شاخه داریم اما اون Edit که گفتم رو نداره!
خواستم خودم پنجره شون پیاده سازی کنم؛ اما توی تعیین شاخه پیشفرض و حتی CurrentDirectory مشکل دارم. این کد رو نگاه کنین:

Uses
FileCtrl,ComCtrls, ShellCtrls;
Function SelectDir(DefaultDir:String;Var OutDir:String):Boolean;
procedure SmoothFont(F: TFont);
var
tagLOGFONT: TLogFont;
begin
GetObject(F.Handle, SizeOf(TLogFont), @tagLOGFONT);
tagLOGFONT.lfQuality := 5;
F.Handle := CreateFontIndirect(tagLOGFONT);
end;
Var
F:TForm;
TV:TShellTreeView;
DirEdit:TEdit;
begin
If DirectoryExists(DefaultDir) then
SetCurrentDirectory(PChar(DefaultDir));
F:=TForm.Create(Application);
With F Do
Begin
Font.Name:='Tahoma';
Font.Size:=12;
Width:=380;
Height:=500;
BorderStyle:=bsDialog;
with TLabel.Create(F) do
begin
Parent := F;
AlignMent:=taRightJustify;
SetBounds(10, 10, 350, 30);
Caption := ':لطفاً شاخه مورد نظر خود را انتخاب نماييد';
Font.Color:=clBlue;
SmoothFont(Font);
end;
TV := TShellTreeView.Create(F);
with TV do
begin
Parent := F;
Font.Size:=10;
SetBounds(10, 40, 350,350);
TabOrder := 0;
TabStop := True;
Path:=DefaultDir;
SmoothFont(Font);
end;
DirEdit:=TEdit.Create(F);
with DirEdit do
begin
Parent := F;
Font.Size:=10;
Font.Color:=clBlue;
SetBounds(10, 395, 350, 20);
Text:='';
SmoothFont(Font);
end;
with TButton.Create(F) do
begin
Parent := F;
SetBounds(10, 425,100 ,30);
Caption := 'تأييد';
Default:=True;
ModalResult:=mrOk ;
SmoothFont(Font);
end;
with TButton.Create(F) do
begin
Parent := F;
SetBounds(260, 425,100 ,30);
Caption := 'انصراف';
Cancel:=True;
ModalResult:=mrCancel;
SmoothFont(Font);
end;
if ShowModal = mrOk then
Begin
Result:=True;
If DirEdit.Text<>'' then
OutDir:=Trim(DirEdit.Text)
Else
OutDir:=TV.Path;
End;
End;
F.Free;
end;

این هم نحوه استفاده:
if SelectDir(Dir,Dir) then
FileListBox1.Directory:=Dir;

SetCurrentDirectory و همچنین تعیین Path برای ShellTreeView کمکی برای منتقل شدن به شاخه مورد نظر در پنجره ایجاد شده نمیکنه!

Felony
دوشنبه 27 شهریور 1391, 12:29 عصر
کد که مشکلی نداشت ؛ من یه نگاه کلی بهش انداختم و به نظرم بهتره به این صورت نوشته بشه :

Function SelectDir(DefaultDir: String; Var OutDir: String): Boolean;
procedure SmoothFont(F: TFont);
var
tagLOGFONT: TLogFont;
begin
GetObject(F.Handle, SizeOf(TLogFont), @tagLOGFONT);
tagLOGFONT.lfQuality := 5;
F.Handle := CreateFontIndirect(tagLOGFONT);
end;

Var
F: TForm;
TV: TShellTreeView;
DirEdit: TEdit;
begin
F := TForm.Create(Application);
With F Do
Begin
Font.Name := 'Tahoma';
Font.Size := 12;
Width := 380;
Height := 500;
BorderStyle := bsDialog;
with TLabel.Create(F) do
begin
Parent := F;
AlignMent := taRightJustify;
SetBounds(10, 10, 350, 30);
Caption := ':لطفاً شاخه مورد نظر خود را انتخاب نماييد';
Font.Color := clBlue;
SmoothFont(Font);
end;
TV := TShellTreeView.Create(F);
with TV do
begin
Parent := F;
Font.Size := 10;
SetBounds(10, 40, 350, 350);
TabOrder := 0;
TabStop := True;
SmoothFont(Font);
If DirectoryExists(DefaultDir) then
TV.Path := DefaultDir;
end;
DirEdit := TEdit.Create(F);
with DirEdit do
begin
Parent := F;
Font.Size := 10;
Font.Color := clBlue;
SetBounds(10, 395, 350, 20);
Text := '';
SmoothFont(Font);
end;
with TButton.Create(F) do
begin
Parent := F;
SetBounds(10, 425, 100, 30);
Caption := 'تأييد';
Default := True;
ModalResult := mrOk;
SmoothFont(Font);
end;
with TButton.Create(F) do
begin
Parent := F;
SetBounds(260, 425, 100, 30);
Caption := 'انصراف';
Cancel := True;
ModalResult := mrCancel;
SmoothFont(Font);
end;
if ShowModal = mrOk then
Begin
Result := True;
If DirectoryExists(DirEdit.Text) then
OutDir := Trim(DirEdit.Text)
Else
OutDir := TV.Path;
End;
End;
F.Free;
end;

mbshareat
دوشنبه 27 شهریور 1391, 14:40 عصر
سلام بر دوستان
سالروز تولد حضرت معصومه (س) رو پیشاپیش به همگی تبریک عرض می کنم.
ممنونم که کد رو بررسی کردین.
لطفا بفرمایین راهی هست که همون اول که پنجره میاد شاخه ای که به عنوان پارامتر DefaultDir به پروسیجر میدم توی ShellTreeView انتخاب شده باشه؟(مثل اینکه روی شاخه کلیک کرده باشیم!)
در حال حاضر با کد بالا همیشه Desktop شاخه نمایش یابنده هستش و اگه یه مسیر طولانی بدیم می بینیم به اون مسیر نرفته.
البته منظورم تعیین Root نیست که دیگه نتونیم به شاخه بالاتر بریم!
من فکر می کردم تعیین شاخه جاری کمک کنه ولی اشتباه می کردم.
متاسفانه راهنمای دلفی ShellTreeView رو درست پوشش نداده.
سوال دوم:به نظرم تو برنامه دیگه ای دیدم که چیزی مثل SelectDirectory داشت با یه Edit. آیا چنین چیزی آماده نداریم؟

Felony
دوشنبه 27 شهریور 1391, 15:02 عصر
اگر هدفت از اون همه کد فقط اضافه کردن یک Edit و انتخاب شاخه پیش فرض هست خود تابع SelectDirectory همه این ها رو داره :

var
Dir: string;
begin
Dir:= 'C:\Windows';
if FileCtrl.SelectDirectory('Select Directory : ', '', Dir, [sdShowEdit, sdValidateDir]) then
ShowMessage(Dir);
end;

من فکر کردم جز این کارهای دیگه هم میخوای انجام بدی که پنجره رو از اول طراحی کردی .

mbshareat
دوشنبه 27 شهریور 1391, 18:07 عصر
سلام بر دوستان
اگه از یه جا آدرس رو کپی گرفته بودم بتونم توش الصاق کنم
می خوام اگه یه پنجره بازه که آدرس مورد نظر رو بتونم از نوار آدرسش بگیرم بتونم به راحتی به جای بالا و پایین رفتن تو لیست شاخه ها و کلیک برای جمع کردن و باز کردن بعضی شاخه ها به راحتی آدرس رو توش بریزم.
در ضمن می دونم SelectDirectory رو میشه یه جور دیگه هم استفاده کرد که لیست درایو و شاخه و فایل داره؛ اما پنجره قشنگی نداره!