(Diálogo Salvar) Como alterar a extensão do arquivo automaticamente na alteração do filtro de arquivo no Vista/Win7?

StackOverflow https://stackoverflow.com/questions/2145299

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...

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top