Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

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

Delphi , Программа и Интерфейс , Диалоги и Фреймы

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

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

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

Привет! Я переведу текст на русский язык:

Код - обёртка функция для вызовов Windows API-вызовов GetOpenFileName и GetSaveFileName, предназначенная для предоставления альтернативы использованию встроенных компонентов Delphi TOpenDialog и TSaveDialog. Автор кода, DeeCo, реализовал функцию OpenSaveFileDialog, которая принимает несколько параметров, таких как handle родительского окна, дефолтное расширение, фильтр, начальная директория, заголовок, имя файла и булевое значение для указания, является ли это диалогом открытия или сохранения.

Основные моменты кода:

  • Функция использует вызовы Windows API GetOpenFileName и GetSaveFileName для отображения диалога выбора файла.
  • Она предлагает альтернативу использованию встроенных компонентов Delphi для отображения диалогов выбора файлов.
  • Функция позволяет указать дефолтное расширение, фильтр, начальную директорию, заголовок и тип диалога (открытие или сохранение).
  • Она также позволяет возвращать имя выбранного файла.

Следующие предложения по улучшению кода:

  1. Рассмотрите добавление обработки ошибок: текущие вызовы GetOpenFileName или GetSaveFileName могут привести к ошибкам, и функция будет возвращать False без предоставления информации о ошибке. Вы можете добавить блоки try-catch для обработки потенциальных исключений и предоставить более информативные сообщения об ошибках.
  2. Используйте константы для значений Windows API: вместо прямого использования значений Windows API, таких как OFN_..., рассмотрите определение набора констант внутри вашего кода. Это может сделать код более читаемым и поддерживаемым.
  3. Добавьте валидацию параметров входных данных: функция не проверяет свои входные параметры. Например, если ParentHandle не является валидным handle или если FileName - пустая строка, функция может поведать неожиданно. Вы можете добавить проверки для обеспечения того, что эти параметры являются валидными перед вызовом Windows API-функций.
  4. Рассмотрите добавление поддержки других опций диалога выбора файлов: текущая реализация только предоставляет основные функциональные возможности и не поддерживает advanced features, такие как выбор нескольких файлов или папки. Вы можете расширить функцию для предоставления более широких возможностей, сделав ее более универсальной.
  5. Добавьте документацию: комментарии в коде могут помочь объяснить его цель, использование и ограничения. Это может быть особенно важно для функций, предназначенных для повторного использования в различных проектах и командах.

Пример использования этой функции:

var
  s: string;
begin
  s := 'aaa.txt';
  if OpenSaveFileDialog(0, 'txt', 'Text Files|*.txt', 'c:\', 'Select text file', s, True) then
    ShowMessage(s + ' file was selected for open');
end.

Код отобразит диалог "Открыть" с указанным фильтром и начальными директориями. Если пользователь выберет файл и нажмет на "Открыть", функция вернет True, а имя файла будет храниться в s.

Альтернатива для TOpenDialog и TSaveDialog: функция OpenSaveFileDialog, позволяющая использовать простые функции альтернативы компонентам Borland.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Диалоги и Фреймы ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-06-02 10:20:12
2024-07-27 13:56:15/0.0040688514709473/0