2

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

    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
4

1 回答 1

2

问题不在于TSaveDialog它本身,而在于内部使用的底层 Win32 GetSaveFileName()/ IFileSaveDialogAPI TSaveDialog。他们根本不允许只读/只读文件成为“保存”对话框的结果。

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

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

话虽这么说,当它在内部使用时TSaveDialog不会公开对事件的访问,但您可以使用它来代替。IFileSaveDialog.OnOverwriteIFileSaveDialogTFileSaveDialog

于 2018-01-18T01:58:56.743 回答