10
votes

(Enregistrer la boîte de dialogue) Comment changer l'extension de fichier automatiquement sur le filtre de fichiers Changement de Vista / Win7?

Lorsque vous affichez une boîte de dialogue Enregistrer, je souhaite accroître le type de filtre de l'utilisateur Modifier et modifier l'extension de fichier automatiquement. (E.g. Comme MSPaint ''s «Sauvegardez-la».)

avec TSAVEDIALOG et paramètre UselatsCommondialogs: = Faux, Je peux gérer cela par le code suivant. (Sans le dernier support de dialogue commun, de cource.) xxx

Je veux supporter à la fois XP et Vista / 7 avec Delphi 2007.

devrais-je Utilisez TFileSaDedialog au lieu de Tsavedialog avec wrapper interne? (Et je dois lutter contre la programmation COM avec ifiledialogcontrolevents ?)

ou puis-je y parvenir avec TFileSaDedialog et ses propriétés standard uniquement? (Mon environnement de développement est toujours sur la machine XP, je n'ai donc jamais essayé. Désolé.)

Je pense que c'est une tâche très courante, mais je n'ai pas pu trouver de code d'échantillon en supportant Vista / 7 ...


0 commentaires

3 Réponses :


5
votes

Autant que je sache, TFileSaVedialog soulevera une exception sur XP. Il a besoin de Vista ou de haut.

Mise à jour : Quelques Code D2010 pour TFileVedialog Adapté de votre gestionnaire d'événements ....
(Je n'ai pas D2007 sur Vista; utilisez pwidechar au lieu de pchar (pwidechar) xxx

où se trouve le fichier Filesavedialog: xxx


2 commentaires

Merci! Mais je crée généralement ces boîtes de dialogue dans l'exécution, afin que je puisse basculer à la fois Tsavedialog et TFileSaDedialog avec vérification de la version du système d'exploitation.


Cela fonctionne avec D2007. Je viens de changer de pcharger / string-> pwidechar / widstring. (Peut-être que cela fonctionne sur D2009 ou plus tard avec une conversion de type auto.). Merci! p.s. J'ai essayé de passer à l'intérieur "* Savedialog1 * Typechange", en utilisant comme "si parent.classname =" TFileSaveDialogWrapper "". (Il est plus favorable que les classes de la boîte de dialogue de commutation.) Mais je ne pouvais pas pirater l'emballage, car il est défini dans la section de mise en œuvre ...



4
votes

Vous avez écrit que vous ne pouviez pas pirater l'emballage. J'utilise ce code pour ma bibliothèque d'exportation XLSX / XLS / ODS pour modifier l'extension de fichier sur XP et Vista +.

Un inconvénient: les aides de classe ne peuvent pas accéder à des champs privés dans Delphi 2007, ce code ne fonctionne que dans Delphi 2009+. Si vous souhaitez une compatibilité Delphi 2007, utilisez le même hack pour Topendialog comme je l'ai utilisé pour TfileDialogWrapper dans cet exemple. P>

{ 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;


2 commentaires

En fait, je l'ai vérifié maintenant - cela ne fonctionne que dans Delphi Xe + en raison de l'architecture de l'unité de dialogue.


Merci pour votre réponse. Je viens de remarquer. Je n'utilise plus D2007, je vais lire votre code. Merci.



2
votes

Cette fonctionnalité est implémentée dans Delphi, mais désactivée par défaut.

Pour l'activer, entrez simplement l'extension par défaut dans defaultext Propriété.


0 commentaires