0

ユーザーが初期ディレクトリに限定されている(Windows 7で)開いているダイアログを作成しようとしています。開いたダイアログで、optionsEXを[ofExNoPlacesBar]に設定しました。これにより、すばやく移動するフォルダーとディレクトリを選択できるバーが削除されますが、ユーザーはブレッドクラムアドレスツールを使用してレベルを上げ、別のディレクトリを入力できます。ディレクトリを変更するには、[ファイル名]テキストボックスに入力します。

ありがとうございました

4

3 に答える 3

4

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;
于 2010-09-13T15:58:25.953 に答える
2

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

于 2010-09-13T15:48:25.680 に答える
-1

「FileOpenDialog」には、ブール型パラメーターを持つOnFolderChangingタイプのイベントがあります。このパラメーターを false に設定すると、目的が果たされると思います。TFileDialogFolderChangingEventCanChange

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

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;

以下も機能しますが、パスのバリエーションに対してより脆弱です (以下の Andreas のコメントを参照してください)。

procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
                            TFileOpenDialog(Sender).DefaultFolder);
end;
于 2010-09-13T15:58:16.220 に答える