четверг, 26 мая 2011 г.

Урок 10 . Компонент - сообщение (TMyMessenger)


Привет.
С Вами Веселов Александр.
В предыдущем уроке мы познакомились подробно с процессами создания, компиляции, установки и удаления компонента собственного производства.
Прежде, чем мы продолжим изучение процесса  создания собственных компонентов, я хочу на простом наглядном примере показать работу стандартных компонентов, указав на тот недостаток, наличие которого побудило меня к написанию собственного инструмента.
Создайте проект VCL  приложения, разместите на форме пару кнопок и под обработчики событий каждой положите процедуры, описанные ниже:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

// Объявление константы перевода каретки
const CR=#13#10;

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

var
Form1: TForm1;

implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage('В заголовке Showmessage - имя приложения');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MessageDlg('Файл ini не определён. Обратитесь к разработчику.'+CR+'Иллюстрация сообщения об ошибке',mtError, [mbOk], 0);
If MessageDlg('Файл ini не определён.'+CR+'Желаете обратиться к разработчику?'+CR+'Иллюстрация сообщения с подтверждением выбора',mtConfirmation, [mbYes]+[mbNo], 0, mbNo)=6
then
Showmessage('Была нажата кнопка Yes')
else
Showmessage('Была нажата кнопка No')
;
end;

end.
Попутно я объявил очень полезную константу CR, чтобы применить ее при оформлении выводимого на экран сообщения.
Первая кнопка вызывает на экран процедуру Showmessage, вторая - подряд два вызова функции MessageDlg. Установите курсор на заголовок процедуры и нажмите F1, чтобы вызвать справочную систему Delphi For Win 32, которая выведет на экран окно с текстом следующего содержания:







Переведу:
в первой строке - заголовок: ShowMessage
Краткое описание: Показывает сообщение с кнопкой “ОК”.
Данная процедура расположена в модуле: Dialogs.
Синтаксис:
[Delphi] - для среды (справка единая на все продукты производителя) описание заголовка процедуры со всеми параметрами и т.п.
Description - подробное описание работы процедуры, где сказано буквально следующее: вызов ShowMessage отображает простое сообщение с кнопкой “ОК”. Имя файла исполняемого приложения отображается как подпись (я бы сказал - заголовок) сообщения.
Параметр Msg - строка, которая выводится в сообщении.
Ниже по тексту справки написано о том, что данную строку можно форматировать и т.п. и далее приведены ссылки “смотреть также”, из которых становится ясно, что вариантов у нас не так много.

Щелкнув по одной из ссылок - по MessageDlg - давайте познакомимся с возможностями еще одного инструмента, использованного в нашем примере. Это - функция, которая позволяет вывести на экран сообщение, указать тип сообщения, определить набор отображаемых в сообщении кнопок, в другом варианте - задать координаты, чтобы сообщение выводилось не по центру экрана, определить контекстную справку и даже задать кнопку из набора, которая будет иметь фокус по умолчанию. Кроме того, в постобработке всегда можно вычислить, какая же кнопка была нажата (см пример), поскольку функция возвращает целое значение соответствующей константы. Вот, казалось бы, какие богатые возможности, но... В заголовке сообщения эта функция выводит английские слова, сопоставленные разработчиками выбранному типу сообщения. Опять получается не совсем хорошо... Я уже просил моего читателя, если он пишет программы не для собственных нужд, постараться не пугать своего будущего пользователя латиницей.
Напрашивается вывод: хочешь иметь в заголовке сообщения любую фразу, написанную на родном языке - применяй изобретательность.
Мне ничего не остается делать, как привести ниже текст модуля нового компонента с подробными комментариями. А в наглядном видео уроке, который Вы можете посмотреть или скачать, проиллюстрировать не только процесс создания компонента TMyMessenger, но и особенности его использования.
Содержимое файла MyMsgDlgWithTitleLes.pas:
unit MyMsgDlgWithTitleLes;
interface
uses Classes
, Dialogs
, Forms
;

type
TMyMessengerLes = class(TComponent)                 // Объявление нового класса
private                                             // В этой секции заданы поля, в которых будут храниться значения свойств
FMessageString: String;                           // Собственно строка сообщения
FTitleString: String;                             // Заголовок сообщения
FMessageType: TMsgDlgType;                        // Тип сообщения
FButtons: TMsgDlgButtons;                         // Набор кнопок
protected                                           // Здесь объявлена знакомая по справочной системе функция
function MessageDlg(Title : string; const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
public
Function ShowMessage: Integer;                    // Определение метода компонента:
// это функция показа на экране сообщения (NB: название просто совпало с названием стандртной процедуры)
constructor Create( AOwner : TComponent );  override; // Объявление конструктора компонента
published                                           // В этой секции объявлены свойства будущего компонента, которые будут отображаться в Инспекторе объектов
Property MessageString:String read FMessageString write FMessageString; //
Property TitleString:String read FTitleString write FTitleString;
Property MessageType:TMsgDlgType read FMessageType write  FMessageType;
Property Buttons: TMsgDlgButtons read FButtons write FButtons;
end;

procedure Register;
implementation
procedure Register;                                    // Процедура регистрации компонента
begin
RegisterComponents('Lessons', [TMyMessengerLes]);    // Компонент TMyMessengerLes будет зарегистрирован на вкладке Lessons
end;

constructor TMyMessengerLes.Create( AOwner : TComponent );    // В параметрах, передаваемых в конструктор компонента объявляется,
// что создаваемый визуальный компонент наследуется от TComponent
begin
inherited Create( AOwner );                                 // Оператор, выполняющий процесс присвоения всех свойств родителя новому компоненту
Buttons:=[mbOK];                                            // Пусть для примера в свойстве, определяющем набор кнопок, будет что-то вписано
MessageType:=mtInformation;                                 // Тип нового, располагаемого на форме компонента изначально будет Information
end;

Function   TMyMessengerLes.ShowMessage: Integer;                 // Описание функции, отрабатывающей метод компонента ShowMessage
begin
Result:=MessageDlg(FTitleString, FMessageString, MessageType, Buttons, 0); // Функция возвращает результат вызова стандартной функции
// с параметрами, извлеченными из полей (мест хранения),
// хранящих свойства компонента

end;
// Переопределение стандартной функции
function TMyMessengerLes.MessageDlg(Title: string; const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Integer): Integer;
begin
with CreateMessageDialog(Msg, DlgType, Buttons) do         // В момент создания диалога
try
Caption     := Title;                                  // Изменяется заголовок (подпись) окна
HelpContext := HelpCtx;
HelpFile    := '';
Position := poScreenCenter;
Result := ShowModal;
finally
Free;
end;
end;

end.
Что же дальше?
создадим еще один несложный, но полезный компонент - гиперссылку, и уже совсем скоро - более сложный компонент с использованием формы "О программе".


Комментариев нет:

Отправить комментарий