Vista Compatible Open/Save Dialogs in Lazarus

{
  VistaOpenSaveDialog:
  A new Open/Save dialog that uses Windows API to display Vista
  compatiable Open or Save Dialog.
 
  Tested in Windows 2000/XP/Vista/Vista x64.
  Compiled with Lazarus 0.9.29 beta (21448) / FreePascal 2.2.4
  It should compile successfully with all newer and maybe some the versions.
 
  Created by Iskren Slavov (http://www.dotfusion.net/).
  No right reserved. Feel free to use for any of your applications
  regardless of the license.
 
  ##########################################
 
  Example usage:
  VistaOpenSaveDialg(Handle, '', '', '', 'Open file...', fileName,
    OFN_FILEMUSTEXIST, VDT_OPENDIALOG);
 
  Some usable flags under Windows Vista:
  OFN_READONLY, OFN_HIDEREADONLY, 
  OFN_OVERWRITEPROMPT, OFN_FILEMUSTEXIST,
  OFN_PATHMUSTEXIST, OFN_FORCESHOWHIDDEN, 
  OFN_DONTADDTORECENT
}
 
unit VistaOpenSaveDlg;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Windows, Messages, CommDlg, SysUtils;
 
type
  TVistaDlgType = (VDT_OPENDIALOG, VDT_SAVEDIALOG);
 
  function ReplaceStr(const S, Srch, Replace: string): string;
  function VistaOpenSaveDialog(Parent: HWND; const Filters, 
    DefaultExtension, InitialDir, Title: string; var FileName: string; 
    DlgFlags: DWORD; DlgType: TVistaDlgType): Boolean;
 
implementation
 
function ReplaceStr(const S, Srch, Replace: string): string;
var
  i: Integer;
  Source: string;
begin
  Source := S;
  Result := '';
  repeat
    i := Pos(UpperCase(Srch), UpperCase(Source));
    if i > 0 then
    begin
      Result := Result + Copy(Source, 1, i - 1) + Replace;
      Source := Copy(Source, i + Length(Srch), MaxInt);
    end
    else
      Result := Result + Source;
  until i <= 0;
end;
 
function VistaOpenSaveDialog(Parent: HWND; const Filters, DefaultExtension, InitialDir, Title: String;
  var FileName: String; DlgFlags: DWORD; DlgType: TVistaDlgType): Boolean;
var
  fnStruct: TOpenFileName;
  szFile: array[0..MAX_PATH] of Char;
begin
  Result := False;
  FillChar(fnStruct, SizeOf(TOpenFileName), 0);
  with fnStruct do
  begin
    hwndOwner := Parent;
    lStructSize := SizeOf(TOpenFileName);
    lpstrFile := szFile;
    StrPCopy(lpstrFile, FileName);
    nMaxFile := SizeOf(szFile);
    lpstrFilter := PChar(ReplaceStr(Filters, '|', #0) + #0#0);
    if (Title <> '') then
      lpstrTitle := PChar(Title);
    if (InitialDir <> '') then
      lpstrInitialDir := PChar(InitialDir);
    if DefaultExtension <> '' then
      lpstrDefExt := PChar(DefaultExtension);
 
    Flags := Flags or DlgFlags;
  end;
 
  case DlgType of
    VDT_OPENDIALOG:
      if GetOpenFileName(@fnStruct) then
      begin
        Result := True;
        FileName := StrPas(szFile);
      end;
    VDT_SAVEDIALOG:
      if GetSaveFileName(@fnStruct) then
      begin
        Result := True;
        FileName := StrPas(szFile);
      end;
  end;
end;
end.
同步内容