我在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';
出现第二个对话框,无论是保存还是取消第一个对话框。发生了什么事?
答案 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中,您也需要应用上述一种或另一种技术来正确修改对话框的路径/文件名属性