(Finestra di Dialogo salva Come modificare l'estensione del file automaticamente sul file e il cambio del filtro in Vista/Win7?
-
23-09-2019 - |
Domanda
Pur mostrando una finestra di dialogo salva, voglio gancio dell'utente tipo di filtro, cambiare e modificare l'estensione del file automaticamente.(ad es.come MSPaint "Salva Come" il funzionamento).
Con TSaveDialog e impostazione UseLatestCommonDialogs := False Posso gestire questo per il codice riportato di seguito.(senza l'ultima finestra di dialogo comune di sostegno, di 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;
Voglio sostenere sia XP e vista/7 con Delphi 2007.
Devo usare TFileSaveDialog invece di TSaveDialog con interno wrapper ?(E devo lottare con la programmazione COM utilizzando IFileDialogControlEvents ?)
O posso farlo con TFileSaveDialog e standard di proprietà solo ?(Il mio ambiente di sviluppo è ancora sulla macchina XP, quindi non ho mai provato.mi dispiace.)
Penso sia molto comune, ma non riuscivo a trovare un esempio di codice di supporto Vista/7...
Soluzione
Per quanto ne so, TFileSaveDialog solleverà un'eccezione su XP. Ha bisogno di Vista o su.
Aggiorna : un po 'di codice D2010 per TFileSaveDialog adattato dal vostro gestore di eventi ....
(Non ho D2007 su Vista, l'uso PWideChar invece di 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;
Se il 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
Altri suggerimenti
Hai scritto che non si poteva incidere il wrapper.Io uso questo codice per il mio XLSX/XLS/ODS esportazione biblioteca di cambiare l'estensione del file sia su XP e Vista+.
Uno svantaggio:Classe helper non può accedere a campi privati in Delphi 2007, in modo che questo codice funziona solo in Delphi 2009+.Se si desidera Delphi 2007 compatibilità, utilizzare lo stesso trucco per TOpenDialog come ho usato per TFileDialogWrapper in questo esempio.
{ 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;
MODIFICA:in realtà, se si imposta il DefaultExt
la struttura, Delphi/Windows per la cura circa l'estensione del file modificare per voi.In questo caso non devi fare nulla in OnTypeChange
evento.
Questa funzione è implementata in Delphi, ma disabilitato per impostazione predefinita.
Per attivarlo, basta ingresso l'estensione predefinita in proprietà DefaultExt
.