Delphi 2007 - Разрешение выбора файла только для чтения в 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 ответ

Решение

Вопрос не с TSaveDialog сам, но с базовым Win32 GetSaveFileName()/IFileSaveDialog API, которые TSaveDialog использует внутренне. Они просто не позволяют файлу "только для чтения" быть результатом диалога "сохранить".

Что, как говорится, IFileSaveDialog действительно обеспечивает возможный (хотя и некрасивый) обходной путь. Если вы включите диалог FOS_OVERWRITEPROMPT выберите существующий файл, и пользователю будет предложено перезаписать файл перед закрытием диалогового окна. IFileDialogEvents интерфейс имеет OnOverwrite событие, которое вызывается до появления этого приглашения (и может вернуться FDESVR_ACCEPT пропустить подсказку полностью). Таким образом, в этом случае вы можете удалить файл FILE_ATTRIBUTE_READONLY атрибут до закрытия диалога. Тем не менее, диалоговое окно по-прежнему будет отображать то же сообщение об ошибке "Этот файл установлен только для чтения" и не будет закрываться (предположительно, потому что он проверил атрибут перед запуском OnOverwrite событие), но если вы затем снова выберите тот же файл, атрибут будет очищен, и диалоговое окно примет файл (это ужасная часть - вам придется обучить своих менеджеров игнорировать эту ошибку и повторить попытку).

GetSaveFileName() имеет ofOverwritePrompt флаг, но нет события для запроса перезаписи.

Что, как говорится, TSaveDialog не предоставляет доступ к IFileSaveDialog.OnOverwrite событие, когда он использует IFileSaveDialog внутренне, но вы можете использовать TFileSaveDialog вместо этого, который делает.

Другие вопросы по тегам