(Save Dialog) Wie Dateierweiterung automatisch auf Dateifilterwechsel in Vista / Win7 ändern?
-
23-09-2019 - |
Frage
Während ein Speichern-Dialog zeigt, möchte ich automatisch Benutzer-Filtertyp ändern und ändern Dateierweiterung anschließen. (Z wie MSPaint des "Speichern unter" Betrieb).
Mit TSaveDialog und Einstellung UseLatestCommonDialogs: = false, Ich kann dies durch den folgenden Code behandeln. (Ohne letzte gemeinsame Dialog Unterstützung von 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;
Ich mag sowohl XP unterstützen, und Vista / 7 mit Delphi 2007.
Sollte ich TFileSaveDialog statt TSaveDialog mit internen Wrapper? (Und ich muss Kampf mit COM-Programmierung mit IFileDialogControlEvents ?)
Oder kann ich dies mit TFileSaveDialog erreichen und es ist Standardeigenschaften nur? (Meine Entwicklungsumgebung ist immer noch auf XP-Rechner, so habe ich noch nie ausprobiert. Sorry.)
Ich denke, es ist sehr häufige Aufgabe, aber ich konnte keinen Beispielcode unterstützt Vista / 7 ...
findenLösung
Soweit ich weiß, TFileSaveDialog wird eine Ausnahme auf XP erhöhen. Es braucht Vista oder nach oben.
Aktualisieren : einige D2010 Code für TFileSaveDialog angepasst von Ihrem Event-Handler ....
(Ich habe keine D2007 auf Vista, die Nutzung PWideChar statt 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;
Wenn die FileSaveDialog ist:
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
Andere Tipps
Sie schrieb, dass Sie nicht den Wrapper hacken könnte. Ich benutze diesen Code für meine XLSX / XLS / ODS-Bibliothek exportiert die Dateierweiterung sowohl auf XP und Vista + zu ändern.
Ein Nachteil: Klasse Helfer nicht private Felder in Delphi 2007 zugreifen können, sodass dieser Code nur in Delphi 2009+ arbeitet. Wenn Sie Delphi 2007 Kompatibilität mögen, die gleiche Kerbe für TOpenDialog verwenden, wie ich für TFileDialogWrapper in diesem Beispiel verwendet.
{ interface }
//some hacking needed to change the file extension at type change,
//empty class is just fine...
TFileDialogWrapper = class(TObject)
private
{$HINTS OFF}
procedure AssignFileTypes;
procedure AssignOptions;
function GetFileName: TFileName;
function GetHandle: HWND;
procedure HandleShareViolation(Sender: TObject;
var Response: TFileDialogShareViolationResponse);
procedure OnFileOkEvent(Sender: TObject; var CanClose: Boolean);
procedure OnFolderChangeEvent(Sender: TObject);
procedure OnSelectionChangeEvent(Sender: TObject);
procedure OnTypeChangeEvent(Sender: TObject);
protected
FFileDialog: TCustomFileDialog;
{$HINTS ON}
end;
TOpenDialogHelper = class helper for TOpenDialog
public
function GetInternalWrapper: TFileDialogWrapper;
end;
{ implementation }
{ TOpenDialogHelper }
function TOpenDialogHelper.GetInternalWrapper: TFileDialogWrapper;
begin
Result := TFileDialogWrapper(Self.FInternalWrapper);
end;
{ TFileDialogWrapper }
procedure TFileDialogWrapper.AssignFileTypes;
begin
end;
procedure TFileDialogWrapper.AssignOptions;
begin
end;
function TFileDialogWrapper.GetFileName: TFileName;
begin
end;
function TFileDialogWrapper.GetHandle: HWND;
begin
end;
procedure TFileDialogWrapper.HandleShareViolation(Sender: TObject;
var Response: TFileDialogShareViolationResponse);
begin
end;
procedure TFileDialogWrapper.OnFileOkEvent(Sender: TObject;
var CanClose: Boolean);
begin
end;
procedure TFileDialogWrapper.OnFolderChangeEvent(Sender: TObject);
begin
end;
procedure TFileDialogWrapper.OnSelectionChangeEvent(Sender: TObject);
begin
end;
procedure TFileDialogWrapper.OnTypeChangeEvent(Sender: TObject);
begin
end;
//use this for OnTypeChane event of a "normal" TOpenDialog / TSaveDialog
procedure TForm1.DialogTypeChange(Sender: TObject);
var
xFN: WideString;
xExporter: TOCustomExporter;
xFileName: PWideChar;
xFD: TFileDialogWrapper;
xFilterIndex: UINT;
begin
if Sender is TOpenDialog then
with TOpenDialog(Sender) do begin
xFD := GetInternalWrapper;
if (xFD <> nil) and (xFD.FFileDialog <> nil)
then begin
//Vista file dialog
xFD.FFileDialog.Dialog.GetFileName(xFileName);
if xFileName = '' then
exit;
xFN := xFileName;
xFD.FFileDialog.Dialog.GetFileTypeIndex(xFilterIndex);
// DO WHATEVER YOU WANT WITH THE FILENAME HERE //
xFD.FFileDialog.Dialog.SetFileName(PWideChar(xFN));
end else begin
//Old dialog
xFN := ExtractFileName(FileName);
if xFN = '' then
exit;
// DO WHATEVER YOU WANT WITH THE FILENAME HERE //
{$HINTS OFF}
SendMessage(Windows.GetParent(Handle), CDM_SETCONTROLTEXT, 1152, LongInt(PWideChar(xFN)));
{$HINTS ON}
end;
end;
end;
Bearbeiten : tatsächlich, wenn Sie setzen die DefaultExt
Eigenschaft, Delphi / Windows-Pflege über die Änderung Dateierweiterung für Sie. In diesem Fall müssen Sie nichts im OnTypeChange
Ereignisse tun.
Diese Funktion wird in Delphi implementiert, aber standardmäßig deaktiviert.
Um sich zu aktivieren, nur Eintrag der Standarderweiterung in DefaultExt
Eigenschaft.