在显示保存对话框时,我想挂钩用户的过滤器类型更改并自动更改文件扩展名. (例如像MSPaint的“另存为”操作.)
使用TSaveDialog并设置UseLatestCommonDialogs:= False,
我可以通过以下代码处理此问题. (没有最新的公共对话支持,cource.)
- procedure TForm1.SaveDialog1TypeChange(Sender: TObject);
- var
- FName,Ext: string;
- begin
- with TSaveDialog(Sender) do
- begin
- if DirectoryExists(FileName) then // FileName is Empty
- exit;
- case FilterIndex of
- 1: Ext := '.png';
- 2: Ext := '.bmp';
- 3: Ext := '.jpg';
- end;
- FName := ChangeFileExt(ExtractFileName(FileName),Ext);
- SendMessage(Windows.GetParent(Handle),CDM_SETCONTROLTEXT,1152,LongInt(PChar(FName)));
- end;
- end;
我想用Delphi 2007支持XP和vista / 7.
我应该使用TFileSaveDialog而不是TSaveDialog与内部包装?
(而且我必须使用IFileDialogControlEvents来解决COM编程问题?)
或者我可以用TFileSaveDialog实现这一点,它只是标准属性吗?
(我的开发环境仍然在XP机器上,所以我从未尝试过.抱歉.)
解决方法
据我所知,TFileSaveDialog将在XP上引发异常.它需要Vista或更高版本.
更新:TFileSaveDialog的一些D2010代码改编自您的事件处理程序….
(我在Vista上没有D2007;使用PWideChar而不是PChar)
- procedure TForm1.FileSaveDialog1TypeChange(Sender: TObject);
- var
- FName,Ext: string;
- pName: PChar;
- begin
- with TFileSaveDialog(Sender) do
- begin
- if DirectoryExists(FileName) then // FileName is Empty
- exit;
- case FileTypeIndex of
- 1: Ext := '.png';
- 2: Ext := '.bmp';
- 3: Ext := '.jpg';
- end;
- Dialog.GetFileName(pName);
- FName := ChangeFileExt(ExtractFileName(pName),Ext);
- Dialog.SetFileName(PChar(FName));
- end;
- end;
FileSaveDialog的位置是:
- object FileSaveDialog1: TFileSaveDialog
- FavoriteLinks = <>
- FileTypes = <
- item
- DisplayName = 'png files'
- FileMask = '*.png'
- end
- item
- DisplayName = 'bmp files'
- FileMask = '*.bmp'
- end
- item
- DisplayName = 'jpg files'
- FileMask = '*.jpg'
- end>
- Options = []
- OnTypeChange = FileSaveDialog1TypeChange
- end