为什么saveialog连续执行两次?

时间:2015-10-08 23:49:09

标签: delphi

我在XP上用Delphi 6创建了一个新的应用程序。我将saveialog组件与按钮组件一起放在主窗体上。我将按钮处理程序编辑为:

procedure TForm1.Button1Click(Sender: TObject);
begin
savedialog1.FileName := 'test';
if savedialog1.Execute then showmessage('hit 1');
savedialog1.FileName := 'hold' + savedialog1.FileName;
if savedialog1.Execute then showmessage('hit 2');
end;

如果我在第一个保存对话框中运行并单击“保存”,则不会出现第二个保存对话框。如果在第一个保存对话框中单击“取消”,则会出现第二个保存对话框。如果我将concat更改为

savedialog1.FileName := 'holdtest';

出现第二个对话框,无论是保存还是取消第一个对话框。发生了什么事?

1 个答案:

答案 0 :(得分:3)

正如安德烈亚斯在评论中所说,问题是在第二次出现对话之前设置文件名属性(我已在Delphi 7中复制和确认)。

FileName 属性返回完全限定的文件名,因此此赋值:

SaveDialog1.Filename := 'hold' + SaveDialog1.Filename;

会生成文件名属性,其值类似于:

holdC:\foo.txt

这不是有效的文件名,因此当 SaveDialog 组件尝试使用此设置调用公共对话框时,会失败。遗憾的是, SaveDialog 组件不会捕获此错误并报告错误,只会导致执行方法立即返回FALSE而不向用户显示任何对话框。< / p>

由于函数返回FALSE,因此不会调用第二个 ShowMessage()

可能的解决方案

目前还不完全清楚你要在这里实现什么,但Andreas建议使用 ExtractFilename()是避免这个问题的一种方法:

SaveDialog1.Filename := 'hold' + ExtractFilename(SaveDialog1.Filename);

但是,如果打算保留路径信息并修改文件名部分,则可以将 InitialDir 文件名分开设置(如上所述):

SaveDialog1.Filename := 'hold' + ExtractFilename(SaveDialog1.Filename);
SaveDialog1.InitialDir := ExtractFilePath(SaveDialog1.Filename);

或者您也可以使用更详细的操作设置完全限定的文件名

SaveDialog1.Filename := ExtractFilePath(SaveDialog1.Filename) + 'hold' + ExtractFilename(SaveDialog1.Filename);

在您的案例中哪一个最合适,只有您可以决定。

注意:由于Delphi XE4中相同的代码确实提供了两次保存对话框,因此某些更高版本的Delphi中的实现中的某些更改已部分解决了此问题。但是,无效文件名保留为默认值,尽管无效。

因此,如果您打算以某种方式操作文件名和/或路径,那么即使在任何更高版本的Delphi中,您也需要应用上述一种或另一种技术来正确修改对话框的路径/文件名属性