gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:35:03 25 4
gpt4 key购买 nike

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

最佳答案

问题不在于TSaveDialog本身,而在于GetSaveFileName()在内部使用的基础Win32 IFileSaveDialog / TSaveDialog API。它们只是不允许将只读/只读文件作为“保存”对话框的结果。

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

GetSaveFileName()具有ofOverwritePrompt标志,但是没有用于覆盖提示的事件。

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

关于delphi - Delphi 2007-允许在TSaveDialog中选择只读文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com