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
вместо этого, который делает.