delphi TFileSaveDialog - fdoCreatePrompt未显示提示?

bjp0bcyl  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(142)

我在C++ Builder中将一个TFileSaveDialog放在表单上,并设置选项fdoOverWritePromptfdoStrictFileTypesfdoPathMustExistfdoCreatePrompt
当对话框打开并选择现有文件时,它会提示我是否要像它应该的那样覆盖。但是,如果我输入一些不存在的随机名称并单击“* 保存 *”,对话框就会关闭-如果可以创建一个,则没有确认提示。
知道为什么会这样吗

6fe3ivhb

6fe3ivhb1#

OFN_CREATEPROMPT,对应于

仅适用于打开对话框,不适用于保存对话框。在TFileOpenDialog上尝试同样的操作,您会得到该提示。
其他对话框类型的证明:

var
  sd: TSaveDialog;
  od: TOpenDialog;
begin
  sd:= TSaveDialog.Create( self );
  sd.Options:= [ofCreatePrompt];  // Has no effect: no typed-in filename triggers this
  sd.Execute();
  sd.Free;

  od:= TOpenDialog.Create( self );
  od.Options:= [ofCreatePrompt];  // When trying to OPEN a not yet existing file
  od.Execute();
  od.Free;

为什么?从逻辑上讲,在大多数情况下保存文件时,您都希望创建一个新文件(选择一个不存在的文件名)-为什么在您已经有“* 保存 *”按钮时还需要再次确认?保存文件意味着创建了文件。确认覆盖/更改现有文件的情况不太常见。
如果你还想要这样的行为,你必须自己去做:使用OnCanClose事件,然后检查到目前为止选择/输入的文件名:

procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
begin
  if not FileExists( SaveDialog1.FileName ) then begin
    // Reject closing the window for every choice but "Yes"
    CanClose:= MessageBox( SaveDialog1.Handle, 'Create it?', 'Does not exist yet', MB_YESNO )= IDYES;
  end;
end;

相关问题