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

时间:2018-01-17 23:05:47

标签: delphi delphi-2007 readonly-attribute tsavedialog

我需要用户能够从保存对话框中选择现有的只读文件。我认为你可以通过明智地选择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

1 个答案:

答案 0 :(得分:2)

问题不在于TSaveDialog本身,而在于GetSaveFileName()内部使用的基础Win32 IFileSaveDialog / TSaveDialog API。他们根本不允许只读文件是" save"对话框。

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

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

话虽如此,TSaveDialog在内部使用IFileSaveDialog.OnOverwrite时不会公开对IFileSaveDialog事件的访问权限,但您可以使用TFileSaveDialog代替real*8