(Diálogo Salvar) Como alterar a extensão do arquivo automaticamente na alteração do filtro de arquivo no Vista/Win7?
-
23-09-2019 - |
Pergunta
Ao mostrar uma caixa de diálogo para salvar, quero conectar a alteração do tipo de filtro do usuário e alterar a extensão do arquivo automaticamente.(por exemplo.como a operação "Salvar como" do MSPaint.)
Com o TSAVedialog e a configuração do USELATESTCommondialogs: = false, posso lidar com isso pelo código a seguir.(sem o suporte de diálogo comum mais recente, é claro.)
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;
Quero oferecer suporte ao XP e ao Vista/7 com Delphi 2007.
Devo usar TFileSaveDialog em vez de TSaveDialog com wrapper interno?(E eu tenho que lutar com a programação COM usando IFileDialogControlEvents ?)
Ou posso conseguir isso com TFileSaveDialog e apenas suas propriedades padrão?(Meu ambiente de desenvolvimento ainda está em uma máquina XP, então nunca tentei.desculpe.)
Acho que é uma tarefa muito comum, mas não consegui encontrar nenhum código de exemplo compatível com o Vista/7...
Solução
Pelo que eu sei, TFileSaveDialog gerará uma exceção no XP.Precisa do Vista ou superior.
Atualizar:alguns Código D2010 para TFileSaveDialog adaptado do seu manipulador de eventos ....
(Não tenho o D2007 no Vista;use PWideChar em vez de 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;
Onde está o 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
Outras dicas
Você escreveu que não poderia invadir o invólucro. Eu uso este código para minha biblioteca XLSX/XLS/ODS para alterar a extensão do arquivo em XP e Vista+.
Uma desvantagem: os ajudantes de classe não podem acessar campos privados em Delphi 2007; portanto, esse código funciona apenas em Delphi 2009+. Se você deseja compatibilidade com Delphi 2007, use o mesmo hack para o TopEndialog como eu usei para tfiledialogwrapper neste exemplo.
{ 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;
EDITAR: na verdade, se você definir o DefaultExt
Propriedade, Delphi/Windows se preocupa com a alteração da extensão de arquivo para você. Nesse caso, você não precisa fazer nada no OnTypeChange
evento.
Você está falando sobre permissões estritas ou aparar?Se é realmente importante que apenas os usuários especificados possam ver os itens do calendário, então você precisará de um fluxo de trabalho ou similar para definir permissões exclusivas no item com base na coluna - eu sei que você pode fazer isso com o fluxo de trabalho Nintex, mas eu não tenteiFluxo de trabalho do SPD.
aparar é onde você filtra a exibição para mostrar apenas itens para os usuários selecionados.Aplique um filtro à exibição em que sua nova coluna de pessoas contém [eu] - [eu] é um filtro especial que usará o usuário atual.No entanto, se um usuário for diretamente para a lista ou uma exibição não filtrada diferente da lista, eles ainda virão o item.