Привет.
С Вами Веселов Александр.
В предыдущем уроке мы познакомились подробно с процессами создания, компиляции, установки и удаления компонента собственного производства.
Прежде, чем мы продолжим изучение процесса создания собственных компонентов, я хочу на простом наглядном примере показать работу стандартных компонентов, указав на тот недостаток, наличие которого побудило меня к написанию собственного инструмента.
Создайте проект 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.
Что же дальше?
создадим еще один несложный, но полезный компонент - гиперссылку, и уже совсем скоро - более сложный компонент с использованием формы "О программе".
С Вами Веселов Александр.
В предыдущем уроке мы познакомились подробно с процессами создания, компиляции, установки и удаления компонента собственного производства.
Прежде, чем мы продолжим изучение процесса создания собственных компонентов, я хочу на простом наглядном примере показать работу стандартных компонентов, указав на тот недостаток, наличие которого побудило меня к написанию собственного инструмента.
Создайте проект 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.
Что же дальше?
создадим еще один несложный, но полезный компонент - гиперссылку, и уже совсем скоро - более сложный компонент с использованием формы "О программе".
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.