The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Увеличение возможностей функции  MessageDlg

by Michael Bruus - bruus@io.dk

Перевод Руденко Е.В.   janerev@hotmale.ru    апрель 2001 года

 

 Необходимость в двух неочевидных (не по умолчанию) возможностях  функции MessageDlg заставили меня исследовать исходный код модуля Dialogs.

Во-первых, мне нужна была форма диалога, которая  закрывалась бы при нажатии клавиши и возвращала при этом код нажатой клавиши . Что-то наподобие команды TurboPascal  IF KEYPRESSED THEN TheKey:=READKEY.

Во-вторых, мне нужно было контролировать, какая кнопка диалога активна по умолчанию. Если , например, у вас появилась форма  MessageDlg с вопросом :  "Вы действительно хотите удалить файл?" и по умолчанию фокус находится на кнопке  Yes (что верно в стандартном окне  MessageDlg) , то для нетерпеливого пользователя могут возникнуть проблемы.

В модуле Dialogs имеется функция, называемая CreateMessageDialog , которая используется в  MessageDlg для собственно формирования диалога.  Используя функцию  CreateMessageDialog прямо вы получаете наилучшую форму  MessageDlg и плюс  больший контроль за поведением данной формы.

Ниже показано решение этих моих двух проблем.

Создайте новое приложение. Разместите две кнопки ( buttons) и Метку ( label) на форме. Назовите событие  onClick кнопки button1  TForm1.Button1Click и событие onClick кнопки button2  TForm1.Button2Click.

Щелкните кнопкой Button1 , чтобы появилась диалоговая форма,  которая закроется , когда пользователь нажмет одну из видимых диалоговых кнопок или нажмет  ESC или щелкнет на иконке закрытия формы диалога. Нажатая кнопка будет показана в метке  Label1.

Щелкните кнопкой Button2 , будет показана стандартная диалоговая форма, но с одним отличием : по умолчанию выбрана кнопка No, а не кнопка  Yes. Для выбора кнопки  No я использую код :  IF TButton(Controls[n]).Name='No'. Вместо  'No' можно использовать 'YesToAll', 'Abort' или любые другие заголовки кнопки , используемой по умолчанию.

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure HelpBoxKeyPress(Sender: TObject; var Key:
Char);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

VAR
  LegalKeys: String;

procedure TForm1.Button1Click(Sender: TObject);
VAR
  s:String;
begin
LegalKeys:='ABC123';
s:='What do you want to do now?'#13#13'A. Go home'#13'B.
Eat lunch'#13+
   'C. Sleep'#13'1. Program in Delphi'#13'2. Order a
Pizza'#13'3. Nothing';
WITH CreateMessageDialog(s, mtConfirmation, []) DO
  BEGIN
    try
      onKeyPress:=HelpBoxKeyPress;
      IF ShowModal=mrOK
      THEN Label1.Caption:='You pressed: '+LegalKeys[Tag]
      ELSE Label1.Caption:='You pressed: '+'Cancel';
    finally
      Free;
    end;  //try..finally
  END;  //with
end;

procedure TForm1.HelpBoxKeyPress(Sender: TObject; var Key:
Char);
BEGIN
  IF Pos(UpCase(Key),LegalKeys)>0 THEN
    BEGIN
      TForm(Sender).Tag:=Pos(UpCase(Key),LegalKeys);
      TForm(Sender).ModalResult:=mrOK;
    END
  ELSE IF Key=#27 THEN TForm(Sender).ModalResult:=mrCancel;
END;

procedure TForm1.Button2Click(Sender: TObject);
VAR
  n:Integer;
begin
  WITH CreateMessageDialog('Do you really want to delete
the file?',mtWarning,[mbYes,mbNo]) DO
    BEGIN
      FOR n:=0 TO ControlCount-1 DO
        IF (Controls[n] is TButton)
        THEN IF TButton(Controls[n]).Name='No' THEN TButton
(Controls[n]).TabOrder:=0;
      ShowModal;
    END;
end;

end.
 

Возврат в Tips&Tricks