Delphi Opendialog دون السماح للمستخدم بالتنقل بعيدًا عن dir inital

StackOverflow https://stackoverflow.com/questions/3701959

سؤال

أحاول إنشاء مربع حوار مفتوح (في 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top