【问题标题】:Why doesn't savedialog execute twice in a row?为什么 savedialog 不连续执行两次?
【发布时间】:2015-10-08 23:49:09
【问题描述】:

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

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';

无论我是保存还是取消第一个对话框,都会出现第二个对话框。怎么回事?

【问题讨论】:

  • hold + SaveDialog1.FileName 可能类似于holdC:\test.txt,这是一个无效的文件名,这可能会导致对话框不显示(只是猜测,无法重现)。可能,你想要的是hold + ExtractFileName(SaveDialog1.FileName),它将产生holdtest.txt。
  • 匆忙中,我忘记了 FileName 是那些无法回读您刚刚写的内容的奇怪属性之一。 (组件设计者注意:像“FileName”这样的东西应该保持原样,而另一个名为“FullPath”的属性将是发送修改后字符串的更好位置。)不过,如果文件名不好,SaveDialog 会好很多没有阻止对话框出现。

标签: delphi


【解决方案1】:

正如 Andreas 在他的评论中所建议的,问题是在第二次显示对话框之前设置了 Filename 属性(我已经在 Delphi 7 中复制并确认了这一点)。

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

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

导致 Filename 属性的值类似于:

holdC:\foo.txt

这不是一个有效的文件名,因此当 SaveDialog 组件尝试使用此设置调用公共对话框时,会失败。不幸的是,SaveDialog 组件不会捕获此问题并报告错误,它只会导致 Execute 方法立即返回 FALSE 而不会向用户显示任何对话框。

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

可能的解决方案

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

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

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

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

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

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

哪一个最适合您的情况,只有您可以决定。

注意:似乎在某些较新版本的 Delphi 中实现的一些更改已部分解决了此问题,因为 Delphi XE4 中的相同代码确实显示了两次保存对话框。然而,无效的文件名被保留为默认值,尽管它是无效的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2020-11-08
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多