TSaveDialog 文件扩展和 [ofOverwritePromt] 问题
TSaveDialog file extension and [ofOverwritePromt] issue
关于 TSaveDialog 和 [ofOverwritePromt] 的想法已经有一个简单的问题 Delphi overwrite existing file on save dialog。
所以我的issue/scenario如下:
- 我有一个
TSaveDialog
- 我在
Options
中设置了[ofOverwritePromt]
- 我将过滤器设置为 "PDF (*.pdf)|*.pdf"
- 过滤器索引设置为 1
所以现在我执行程序并调用对话框。如果文件 I select WITH MOUSE or KEYBOARD (without typing) 存在然后保存对话框要求我用消息覆盖:
但是如果我执行相同的操作但键入文件名 'Test' 而不指定扩展名,则保存对话框不会确认覆盖。
我知道实际上它 returns 另一个文件名 "C:\Users\xxx\Desktop\Test" 而不是 "C:\Users\xxx\Desktop\Test.pdf"。如果对话框要求您保存文件,这有点不太好,但您需要输入扩展名..
所以通常我是这样处理的:
repeat
{ Ask for the file if not silent }
if not dlgSave.Execute then
Exit;
{ Read the filename from the save dialog }
LTempFile := dlgSave.FileName;
if not SameText(ExtractFileExt(LTempFile), '.pdf') then
begin
{ Add the extension }
LTempFile := LTempFile + '.pdf';
{ As we bypassed the overwrite check in dialog do it now }
if FileExists(LTempFile) then
if MsgWarn(Format('%s already exists. Replace?', [ExtractFileName(LTempFile)]), mbOKCancel) <> mrOk then
Continue;
end;
Break;
until False;
有没有一种方法可以更优雅地做到这一点而无需自定义标准对话框?
我猜你没有设置 DefaultExt
,这就是你返回空白扩展名的原因。使用此 属性,您将不会遇到问题。如果您使用多个过滤器,请使用 OnFilterChange
事件。这是一种方法:
procedure TFormMain.SigSaveDialogMainTypeChange(Sender: TObject);
begin
case (Sender as TSaveDialog).FilterIndex of
0: (Sender as TSaveDialog).DefaultExt := 'pdf';
1: (Sender as TSaveDialog).DefaultExt := 'txt';
end;
end;
这也意味着您不必检查扩展名并更改它!
关于 TSaveDialog 和 [ofOverwritePromt] 的想法已经有一个简单的问题 Delphi overwrite existing file on save dialog。
所以我的issue/scenario如下:
- 我有一个
TSaveDialog
- 我在
Options
中设置了 - 我将过滤器设置为 "PDF (*.pdf)|*.pdf"
- 过滤器索引设置为 1
[ofOverwritePromt]
所以现在我执行程序并调用对话框。如果文件 I select WITH MOUSE or KEYBOARD (without typing) 存在然后保存对话框要求我用消息覆盖:
但是如果我执行相同的操作但键入文件名 'Test' 而不指定扩展名,则保存对话框不会确认覆盖。 我知道实际上它 returns 另一个文件名 "C:\Users\xxx\Desktop\Test" 而不是 "C:\Users\xxx\Desktop\Test.pdf"。如果对话框要求您保存文件,这有点不太好,但您需要输入扩展名.. 所以通常我是这样处理的:
repeat
{ Ask for the file if not silent }
if not dlgSave.Execute then
Exit;
{ Read the filename from the save dialog }
LTempFile := dlgSave.FileName;
if not SameText(ExtractFileExt(LTempFile), '.pdf') then
begin
{ Add the extension }
LTempFile := LTempFile + '.pdf';
{ As we bypassed the overwrite check in dialog do it now }
if FileExists(LTempFile) then
if MsgWarn(Format('%s already exists. Replace?', [ExtractFileName(LTempFile)]), mbOKCancel) <> mrOk then
Continue;
end;
Break;
until False;
有没有一种方法可以更优雅地做到这一点而无需自定义标准对话框?
我猜你没有设置 DefaultExt
,这就是你返回空白扩展名的原因。使用此 属性,您将不会遇到问题。如果您使用多个过滤器,请使用 OnFilterChange
事件。这是一种方法:
procedure TFormMain.SigSaveDialogMainTypeChange(Sender: TObject);
begin
case (Sender as TSaveDialog).FilterIndex of
0: (Sender as TSaveDialog).DefaultExt := 'pdf';
1: (Sender as TSaveDialog).DefaultExt := 'txt';
end;
end;
这也意味着您不必检查扩展名并更改它!