скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Альтернатива для TOpenDialog и TSaveDialog



Оформил: DeeCo

{ 
  Today I want to display how you may use the simple functions as 
  alternative for TOpenDialog/TSaveDialog components. 

  Problem is that Borland incorrectly wrote those components and when 
  Microsoft add some new extended features in own dialogs, 
  standard TOpenDialog and TSaveDialog still use old style. 
  For example, when Microsoft added placebar in own dialogs, 
  VCL's dialog still use old style without placebars. 

  Personally I prefer to use applications that support all 
  features of installed OS. 

  This is a reason why I wrote the function as wrapper for Windows 
  API call for dialogs and now I use this function instead components. 
  It allow not only to use all new features from Windows, 
  but also reduce a size for exe-file and allow to use same function for 
  both TOpenDialog and TSaveDialog functionality. 

  For example: 
  1. to display the "OpenDialog" for text files 
    s := 'aaa.txt'; 
    if OpenSaveFileDialog(Application.Handle, 'txt', 'Text Files|*.txt', 'c:\', 
    'Select text file', s, True) then 
      ShowMessage(s + ' file was selected for open') 

  2. to display the "Save dialog": 
    s := 'data.dbf'; 
    if OpenSaveFileDialog(Application.Handle, 'dbf', 'dBase tables|*.dbf|All files|*.*', 
    'c:\', 'Select table', s, False) then 
      ShowMessage(s + ' table was selected for save') 

  See full code below. Hope you'll find this code useful. 
}

 uses Windows;

 function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir,
   Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean;

 implementation
 uses ShlObj, SysUtils;

 type
   POpenFilenameA = ^TOpenFilenameA;
   POpenFilename = POpenFilenameA;
   tagOFNA = packed record
     lStructSize: DWORD;
     hWndOwner: HWND;
     hInstance: HINST;
     lpstrFilter: PAnsiChar;
     lpstrCustomFilter: PAnsiChar;
     nMaxCustFilter: DWORD;
     nFilterIndex: DWORD;
     lpstrFile: PAnsiChar;
     nMaxFile: DWORD;
     lpstrFileTitle: PAnsiChar;
     nMaxFileTitle: DWORD;
     lpstrInitialDir: PAnsiChar;
     lpstrTitle: PAnsiChar;
     Flags: DWORD;
     nFileOffset: Word;
     nFileExtension: Word;
     lpstrDefExt: PAnsiChar;
     lCustData: LPARAM;
     lpfnHook: function(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT stdcall;
     lpTemplateName: PAnsiChar;
   end;
   TOpenFilenameA = tagOFNA;
   TOpenFilename = TOpenFilenameA;

 function GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll'  name 'GetOpenFileNameA';
 function GetSaveFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll'  name 'GetSaveFileNameA';

 const
   OFN_DONTADDTORECENT = $02000000;
   OFN_FILEMUSTEXIST = $00001000;
   OFN_HIDEREADONLY = $00000004;
   OFN_PATHMUSTEXIST = $00000800;

 function CharReplace(const Source: string; oldChar, newChar: Char): string;
 var
   i: Integer;
 begin
   Result := Source;
   for i := 1 to Length(Result) do
     if Result[i] = oldChar then
       Result[i] := newChar
 end;

 function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean;
 var
   ofn: TOpenFileName;
   szFile: array[0..MAX_PATH] of Char;
 begin
   Result := False;
   FillChar(ofn, SizeOf(TOpenFileName), 0);
   with ofn do
   begin
     lStructSize := SizeOf(TOpenFileName);
     hwndOwner := ParentHandle;
     lpstrFile := szFile;
     nMaxFile := SizeOf(szFile);
     if (Title <> '') then
       lpstrTitle := PChar(Title);
     if (InitialDir <> '') then
       lpstrInitialDir := PChar(InitialDir);
     StrPCopy(lpstrFile, FileName);
     lpstrFilter := PChar(CharReplace(Filter, '|', #0)+#0#0);
   if DefExt <> '' then
       lpstrDefExt := PChar(DefExt);
   end;
   if IsOpenDialog then
   begin
     if GetOpenFileName(ofn) then
     begin
       Result := True;
       FileName := StrPas(szFile);
     end;
   end
   else
   begin
     if GetSaveFileName(ofn) then
     begin
       Result := True;
       FileName := StrPas(szFile);
     end;
   end
 end;





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook