Delphi opendialogユーザーにイタリタル監督からナビゲートすることなく

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

質問

ユーザーが初期ディレクトリに限定されている[Windows 7で)オープンダイアログ(Windows 7)を作成しようとしています。オープンダイアログでは、OptionSexを[ExnoplacesBar]に設定しました。これにより、フォルダとディレクトリを選択できるようにするバーを削除します。ディレクトリを変更するためのファイル名テキストボックスに。

ありがとうございました

役に立ちましたか?

解決

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;

(正確に1つあるはずであることに注意してください 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;

他のヒント

別のオープンダイアログ(フォルダーナビゲーションなし、ファイルリストボックスのみを持つフォームを作成します)を使用するか、単に初期監督と一致しないパスの監査を行い、実際にファイルを開くことを拒否します。

「filependialog」には OnFolderChanging タイプのイベント TFileDialogFolderChangingEvent ブール値があります CanChange パラメーター。このパラメーターをfalseに設定すると、目的が役立つと思います。

編集:
レミーのコメントによる使用の例(私が正しく理解した場合)。

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