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

finden
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top