Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Заменить стандартные диалоги Windows

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

Заменить стандартные диалоги Windows

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

{ 
  Sometimes we need to replace some text or something other in standard Windows 
  Open/Save dialogs. 
  Unfortunately, Delphi's dialogs components don't provide 
  the access to all controls placed on Windows common dialogs. 
  But we can perform this using Windows API. 
  The Example below demonstrates the changing all embedded 
  text controls in Open dialog.}

 { 
  Das Beispiel zeigt, wie man den Text in einem TOpenDialog 
  durch eigenen ersetzen kann. 
}


 uses
   CommDlg;

 {...}

 procedure TForm1.OpenDialog1Show(Sender: TObject);
 {First, we need to determine identifiers of dialog's 
 controls, they are following:}
 const
   LB_FILETYPES_ID = 1089; // "File types:" label 
  LB_FILENAME_ID = 1090;  // "File name:" label 
  LB_DRIVES_ID = 1091;    // "Look in:" label 

  Str1 = 'Four';
   Str2 = 'Five';
   Str3 = 'One';
   Str4 = 'Two';
   Str5 = 'Three';
 var
   hOpenDialog: HWND;
 begin
   hOpenDialog := GetParent(OpenDialog1.Handle);
   SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, idOk, Longint(PChar(Str1)));
   SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, idCancel, Longint(PChar(Str2)));
   SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, LB_FILETYPES_ID, Longint(PChar(Str3)));
   SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, LB_FILENAME_ID, Longint(PChar(Str4)));
   SendMessage(hOpenDialog, CDM_SETCONTROLTEXT, LB_DRIVES_ID, Longint(PChar(Str5)));
 end;

 procedure TForm1.Button5Click(Sender: TObject);
 begin
   if OpenDialog1.Execute then
   begin
     // ... 
  end;
 end;


 // for the Print - Dialog: 

procedure TForm1.PrintDialog1Show(Sender: TObject);
 begin
   SetWindowText(GetDlgItem(PrintDialog1.Handle, idOk), '&&OK2');
   SetWindowText(GetDlgItem(PrintDialog1.Handle, idCancel), '&Cancel2');
   SetWindowText(GetDlgItem(PrintDialog1.Handle, 1025), '&Properties2');
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   if PrintDialog1.Execute then
   begin
     // ... 
  end;
 end;



 // to Enumerate Control - IDs: 

function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall;
 var
   buf, Caption: array [0..255] of char;
 begin
   Result := True;
   GetClassname(wnd, buf, 256);
   GetWindowText(wnd, Caption, 256);
   Lines.Add(Format('ID: %d, class: %s, caption: %s',
     [GetDlgCtrlID(wnd), buf, Caption]));
 end;

 procedure TForm1.PrintDialog1Show(Sender: TObject);
 begin
   memo1.Clear;
   EnumChildWindows(Printdialog1.Handle, @EnumProc, Integer(memo1.Lines));
 end;

Программа на Delphi, демонстрирующая замену стандартных диалогов открытия и печати на пользовательские текстовые контролы. Это может быть полезно в случаях, когда нужно перевести текст диалога или изменить его поведение.

Вот что каждый раздел кода делает:

  1. Первая секция определяет константы для ID-ков контролов меток диалога открытия.
  2. Процедура OpenDialog1Show вызывается при отображении диалога открытия. Она использует функции Windows API, чтобы заменить стандартные текстовые контролы в диалоге на пользовательские текстовые контролы.
  3. Процедура PrintDialog1Show делает то же самое для диалога печати.
  4. Для перечисления ID-ков контролов функция EnumProc определяется. Эта функция принимает handle окна, список строк и возвращает булевое значение, указывающее, продолжать ли перечисление контролов.
  5. В процедуре PrintDialog1Show эта функция используется для перечисления всех дочерних окон диалога печати и добавления их ID-ков, классов и заголовков в компонент мемо.

Вот некоторые предложения по улучшению кода:

  • Вместо использования констант для ID-ков контролов, рассмотрите использование функций Windows API, таких как GetDlgItem или GetDlgItemText, чтобы динамически получить ID-ки контролов.
  • Код использует SendMessage для установки текста для каждого контрола. Это не необходимо, если вы используете Delphi 2009 или позднее, которое поддерживает функцию SetWindowText.
  • Рассмотрите добавление обработки ошибок и валидации при замене стандартных текстовых контролов.
  • Вместо использования строковых замен как строк ('Four', 'Five' и т.д.), рассмотрите загрузку их из конфигурационного файла или базы данных для лучшей поддерживаемости.

Вот пример, как можно модифицировать код для использования SetWindowText вместо SendMessage:

procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  hOpenDialog := GetParent(OpenDialog1.Handle);
  SetWindowText(GetDlgItem(hOpenDialog, LB_FILETYPES_ID), Str3);
  SetWindowText(GetDlgItem(hOpenDialog, LB_FILENAME_ID), Str4);
  SetWindowText(GetDlgItem(hOpenDialog, LB_DRIVES_ID), Str5);
end;

Этот код достигает того же результата, что и оригинальные вызовы SendMessage, но более читаемый и эффективный.

Заменить стандартные диалоги Windows статья рассказывает о способах изменения текстовых контролов в стандартных диалогах Windows, таких как открытие и печать файлов, используя Windows API и Delphi.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 08:58:24/0.0081110000610352/1