Delphi 2007 - 允许在 TSaveDialog 中选择只读文件

标签 delphi delphi-2007 readonly-attribute tsavedialog

我需要用户能够从保存对话框中选择现有的只读文件。我认为您可以通过明智地选择 TSaveDialog 选项来做到这一点,但我无法实现它。如果我选择一个 R/O 文件,只要点击保存按钮,我就会收到消息:

    Read-only.txt
    This file is set to read-only.
    Try again with a different file name.

我想象选项位ofNoReadOnlyReturn会控制这个,但它似乎没有效果。

我错过了什么?

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

-

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    SaveDialog1: TSaveDialog;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
    begin
    Windows.Beep (1000, 300) ;
    end ;
end ;

end.

-

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 69
  ClientWidth = 195
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 56
    Top = 18
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object SaveDialog1: TSaveDialog
    FileName = 'Read-only.txt'
    InitialDir = 'C:\Users\Ross\Documents\RAD Studio\Projects'
    Options = [ofHideReadOnly, ofNoReadOnlyReturn, ofEnableSizing]
    Left = 16
    Top = 16
  end
end

最佳答案

问题不在于 TSaveDialog 本身,而在于 TSaveDialog 的底层 Win32 GetSaveFileName()/IFileSaveDialog API code> 内部使用。他们根本不允许“保存”对话框产生只读/只读文件。

话虽这么说,IFileSaveDialog 确实提供了一个可能(尽管很难看)的解决方法。如果启用对话框的 FOS_OVERWRITEPROMPT 标志,则选择现有文件将在关闭对话框之前提示用户是否可以覆盖该文件。 IFileDialogEvents 接口(interface)有一个 OnOverwrite 事件,该事件在提示出现之前触发(并且可以返回 FDESVR_ACCEPT 以完全跳过提示)。因此,在这种情况下,您可以在关闭对话框之前删除文件的 FILE_ATTRIBUTE_READONLY 属性。但是,该对话框仍将显示相同的“此文件设置为只读”错误消息并拒绝关闭(大概是因为它在触发 OnOverwrite 事件之前检查了该属性),但如果您然后再次选择相同的文件,该属性将被清除,并且对话框将接受该文件(这是丑陋的部分 - 您必须培训您的经理忽略该错误并重试)。

GetSaveFileName() 有一个 ofOverwritePrompt 标志,但没有覆盖提示事件。

话虽这么说,TSaveDialog 在内部使用 IFileSaveDialog 时不会公开对 IFileSaveDialog.OnOverwrite 事件的访问,但您可以使用TFileSaveDialog 相反,确实如此。

关于Delphi 2007 - 允许在 TSaveDialog 中选择只读文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311422/

相关文章:

javascript - 使用 jquery val() 清除只读输入日期在 Firefox 上失败,在 Chrome 上成功。为什么?

linux - 使用 linux bash 解析字符串 - Delphi 代码到 Bash 代码

delphi - 检测到系统中的 BIOS 数据 (Delphi)

delphi - 重载三个扩展记录的添加运算符

delphi - Delphi中 "unwanted"异常对话框的问题

jquery - 隐藏特定 Jquery UI 微调器的微调器按钮

delphi - 以字符串格式存储日期值的最佳方法是什么?

delphi - 实现核心音频 API 事件

delphi - 在 TGridPanel 中单击单元格