Delphi Opendialog دون السماح للمستخدم بالتنقل بعيدًا عن dir inital
-
02-10-2019 - |
سؤال
أحاول إنشاء مربع حوار مفتوح (في Windows 7) حيث يقتصر المستخدم على الدليل الأولي. في مربع الحوار المفتوح ، قمت بتعيين OptionSex على [OfExnoplacesBar] وهذا يزيل الشريط الذي يتيح لهم تحديد المجلدات والأدلة للذهاب إلى السرعة ولكن يمكن للمستخدم استخدام أداة عنوان خبز Crumb لتصاعد مستوى واكتب A دليلًا مختلفًا في مربع نص اسم الملف لتغيير الدلائل.
شكرًا لك
المحلول
إذا كنت تستخدم Delphi 2009+ ، فهناك ملف TFileOpenDialog
. استخدم هذا ، وضبط
procedure TForm3.FileOpenDialog1FolderChange(Sender: TObject);
begin
FInitiated := true;
end;
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
end;
procedure TForm3.btnOpenClick(Sender: TObject);
begin
FInitiated := false;
FileOpenDialog1.DefaultFolder := 'C:\MyFolder\';
FileOpenDialog1.Execute;
end;
أين
var
FInitiated: boolean;
(لاحظ أنه يجب أن يكون هناك واحد بالضبط FInitiated
لكل TFileOpenDialog
. حتى إذا FileOpenDialog
هو عضو خاص في TForm3
, ، يترك FInitiated
كن عضوًا خاصًا في TForm3
كذلك.)
لتحسين تجربة المستخدم ، من المحتمل أن تستخدم
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then beep;
end;
أو
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then
MessageBox(Handle, PChar('Directory selection is not allowed.'), PChar(Caption), MB_ICONINFORMATION);
end;
نصائح أخرى
استخدم مربع حوار مفتوح مختلف (اجعل نموذجًا بنفسك بدون ملاحة للمجلد ، أو فقط مربع قائمة ملفات) ، أو ببساطة تدقيق لمسار بعدم مطابقة DIR الأولي ورفض فتح الملف فعليًا.
يحتوي "FileOpendialog" OnFolderChanging
حدث من النوع TFileDialogFolderChangingEvent
التي لها منطقية CanChange
معامل. كنت أتوقع تعيين هذه المعلمة إلى خطأ من شأنه أن يخدم الغرض.
تعديل:
مثال الاستخدام وفقًا لتعليقات ريمي (إذا فهمت بشكل صحيح) ؛
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
var
Dlg: TFileOpenDialog;
DefFolder: IShellItem;
iOrder: Integer;
begin
CanChange := False;
Dlg := Sender as TFileOpenDialog;
if Succeeded(SHCreateItemFromParsingName(PWideChar(WideString(Dlg.DefaultFolder)), nil, IShellItem, DefFolder)) then
try
CanChange := Dlg.ShellItem.Compare(DefFolder, SICHINT_ALLFIELDS, iOrder) = S_OK;
finally
DefFolder := nil;
end;
end;
يعمل أدناه أيضًا ولكنه أكثر عرضة لتغيرات المسار (انظر تعليقات أندرياس أدناه) ؛
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
TFileOpenDialog(Sender).DefaultFolder);
end;