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