使用 FMX 在 TsaveDialog 中未触发的一些事件
Some events not fired in TsaveDialog with FMX
我正在将项目移植到 FMX(从 VCL)。我使用带有过滤器的 TSaveDialog 作为文件扩展名,但是当我更改扩展名时,'OnTypeChange' 事件不会触发,但 'OnShow' 事件会触发!
我试过 TOpenDialog 遇到同样的问题。
一些信息:
- Delphi Pro 10.3.1(我试过 Delphi 10.3.3)
- 事件 'OnFolderChange' 没有触发。
- 事件 'OnClose' 和 'OnShow' 正常。
有什么想法吗?有什么我错过的选择吗?还是一个已知的错误?
我的测试代码:只是一个带有 TButton 和 TSaveDialog 的表单,事件中有一些代码显示它们是否被触发。
unit Unit1;
interface
uses
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Controls.Presentation,
FMX.StdCtrls, System.Classes;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure SaveDialog1FolderChange(Sender: TObject);
procedure SaveDialog1TypeChange(Sender: TObject);
procedure SaveDialog1Close(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.SaveDialog1Close(Sender: TObject);
begin
Self.Caption := Self.Caption + ', Close';
end;
procedure TForm1.SaveDialog1FolderChange(Sender: TObject);
begin
Self.Caption := Self.Caption + ', Folder';
end;
procedure TForm1.SaveDialog1TypeChange(Sender: TObject);
begin
Self.Caption := Self.Caption + ', Change';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Self.Caption := 'Start';
SaveDialog1.Filter := 'Applications (*.exe)|*.EXE|Text files (*.txt)|*.TXT';
SaveDialog1.Execute;
end;
end.
感谢
尽管 OnFolderChange
和 OnTypeChange
事件已在 TSaveDialog
的对象检查器中发布和分配,但它们根本不执行任何操作。
通过将源文件 FMX.Dialogs.Win.pas
复制到您的项目文件夹并从 Vcl.Dialogs.pas
源文件中添加相关缺失位,可以使这些事件像在 VCL 中一样工作,其中包括但不限于:
- 在
TCustomFileDialog
class 中引用 FolderChange
和 TypeChange
。
- 程序
OnFolderChangeEvent
和 OnTypeChangeEvent
TFileDialogWrapper
class。
- 整个
TFileDialogEvents
class.
虽然这些更改是用 Delphi 10.3.3 测试的,但解决方案应该与 Delphi 10.3.1 甚至更新的版本相似,因为这个单元随着时间的推移没有太大变化。
我正在将项目移植到 FMX(从 VCL)。我使用带有过滤器的 TSaveDialog 作为文件扩展名,但是当我更改扩展名时,'OnTypeChange' 事件不会触发,但 'OnShow' 事件会触发!
我试过 TOpenDialog 遇到同样的问题。
一些信息:
- Delphi Pro 10.3.1(我试过 Delphi 10.3.3)
- 事件 'OnFolderChange' 没有触发。
- 事件 'OnClose' 和 'OnShow' 正常。
有什么想法吗?有什么我错过的选择吗?还是一个已知的错误? 我的测试代码:只是一个带有 TButton 和 TSaveDialog 的表单,事件中有一些代码显示它们是否被触发。
unit Unit1;
interface
uses
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Controls.Presentation,
FMX.StdCtrls, System.Classes;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure SaveDialog1FolderChange(Sender: TObject);
procedure SaveDialog1TypeChange(Sender: TObject);
procedure SaveDialog1Close(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.SaveDialog1Close(Sender: TObject);
begin
Self.Caption := Self.Caption + ', Close';
end;
procedure TForm1.SaveDialog1FolderChange(Sender: TObject);
begin
Self.Caption := Self.Caption + ', Folder';
end;
procedure TForm1.SaveDialog1TypeChange(Sender: TObject);
begin
Self.Caption := Self.Caption + ', Change';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Self.Caption := 'Start';
SaveDialog1.Filter := 'Applications (*.exe)|*.EXE|Text files (*.txt)|*.TXT';
SaveDialog1.Execute;
end;
end.
感谢
尽管 OnFolderChange
和 OnTypeChange
事件已在 TSaveDialog
的对象检查器中发布和分配,但它们根本不执行任何操作。
通过将源文件 FMX.Dialogs.Win.pas
复制到您的项目文件夹并从 Vcl.Dialogs.pas
源文件中添加相关缺失位,可以使这些事件像在 VCL 中一样工作,其中包括但不限于:
- 在
TCustomFileDialog
class 中引用FolderChange
和TypeChange
。 - 程序
OnFolderChangeEvent
和OnTypeChangeEvent
TFileDialogWrapper
class。 - 整个
TFileDialogEvents
class.
虽然这些更改是用 Delphi 10.3.3 测试的,但解决方案应该与 Delphi 10.3.1 甚至更新的版本相似,因为这个单元随着时间的推移没有太大变化。