+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 93.29 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Создание собственной кнопки в Delphi

10.01.2011 14:46

Здравствуйте уважаемый программист! Ранее, при создании программного обеспечения на языке Delphi, Вы использовали лишь стандартный интерфейс MS Windows. Но, по всей видимости, Вам этого недостаточно и Вы хотите добавить оригинальности и уникальности в оформление своего приложения. Об том, как это сделать, я Вам и расскажу в данной статье. Статья будет посвящена созданию собственных элементов управления, а собственно кнопок, используя язык программирования Delphi.

   Приступим к делу. Допустим проект, для которого мы создаем кнопку, уже открыт. Для начала создадим новый модуль (File \ New \ Unit). Давайте сразу сохраним модуль (нажав Ctrl + Shift + S) под именем MyButtonUnit. В модуле мы видим два раздела: interface и implementation. В первом разделе мы будем описывать подключаемые модули, типы данных, процедуры, константы и переменные, а во втором будет находиться сам код.

   После interface опишем модули, которые нам понадобятся. Это выглядит так:

interface
   uses Classes, Controls, Windows, Graphics, Messages;

   После этого необходимо описать создаваемый нами новый класс (TMyButton), в основу которого будет положен класс TCustomControl.
 

type TMyButton = class(TCustomControl)
   private
   protected
   public
end;

   Вы видите три раздела нашего класса: private, protected и public. В первом описываются переменные и процедуры, которые будут доступны для использования только в пределах данного класса. В разделе protected описываются методы, реализованные в родительском классе. И наконец, третий раздел содержит описание свойств и процедур, которые будут доступны за пределами данного класса.

   Начнем с раздела public.
   Опишем конструктор: constructor Create(AOwner: TComponent);
   Перейдем в раздел implementation и напишем код, который будет выполняться при создании кнопки.

constructor TMyButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent := AOwner as TWinControl;
 Width := 100;
 Height := 25;
end;

 

   Я привел обязательную часть кода. Вы же можете дополнить его при необходимости.

   Сейчас самое время подумать о том, как будет работать кнопка. Наша кнопка должна изменять изображение при наведении на нее. Она обязательно должна содержать надпись. Это минимум! Раз кнопка будет изменять внешний вид при наведении на нее, то в разделе private опишем переменную FSelected : Boolean; для хранения состояния кнопки. Отрисовкой кнопки займемся позже. В том же разделе опишем переменную FCaption : String;, которая хранит надпись на кнопке. Для того, чтобы надпись можно было изменять опишем property Caption: String read FCaption write SetCaption; в разделе public. Как Вы заметили, процедуру SetCaption мы еще не создали. Опишем ее в разделе private:

procedure SetCaption(Val: String);
 

и конечно же создадим сам код:

procedure TMyButton.SetCaption(Val: string);
begin
 FCaption := Val;
 paint;
end;

   Процедура paint это и есть отрисовка кнопки, которой мы сейчас и займемся. Ее мы опишем в разделе protected - procedure Paint; override;.
   Сразу же напишем код:

procedure TMyButton.Paint;
begin
 If not FSelected
 then
  begin
   Canvas.Pen.Color := $FFFFFF;
   Canvas.Brush.Color := $FFFFFF;
  end
 else
  begin
   Canvas.Pen.Color := $EEEEEE;
   Canvas.Brush.Color := $EEEEEE;
  end;

 Canvas.Rectangle(0,0,Width,Height);
 Canvas.TextOut((Width - Canvas.TextWidth(FCaption))div 2,(Height - Canvas.TextHeight(FCaption)) div 2,FCaption);
end;


   Обратите внимание на условие. Мы предусматриваем различные варианты оформления при выделенной и невыделенной кнопке. Как работать с графикой Вы, я думаю, знаете, поэтому сможете очень легко настроить внешний вид по-своему.

   А теперь самое интересное: как сделать так, чтобы кнопка меняла внешний вид при наведении?

   Опишем две процедуры в разделе private:

procedure MEnter(var Mes: TMessage); message CM_MOUSEENTER;
procedure MLeave(var Mes: TMessage); message CM_MOUSELEAVE;

   Процедуры реагируют на сообщения ввода и вывода мыши в область кнопки. Первая - на сообщение ввода, а вторая - на сообщение вывода. А вот собственно и код, который они вызывают.

procedure TMyButton.MEnter(var Mes: TMessage);
begin
 FSelected := True;
 Paint;
end;

procedure TMyButton.MLeave(var Mes: TMessage);
begin
 FSelected := False;
 Paint;
end;

   Как видите, мы просто указываем, выделена или не выделена кнопка и перерисовываем ее.

   Прекрасно, мы выполнили задачу, но как внедрить кнопку в приложение? Очень просто! Вам необходимо описать созданный нами модуль в нужном вам месте, а чтобы создать кнопку опишите ее как переменную (var B : TMyButton;), создайте (B := TMyButton.Create(self);) и откорректируйте поля (B.Caption := 'Button';).
   В целом:
 

procedure TForm3.FormCreate(Sender: TObject);
var
 B : TMyButton;
begin
 B := TMyButton.Create(self);
 B.Caption := 'Button';
end;

   Теперь Вы умеете создавать свои элементы управления и можете поработать над дизайном своей программы. Удачи!
 

Исходный код модуля:

unit MyButtonUnit;

interface
  uses Classes, Controls, Windows, Graphics, Messages;

type TMyButton = class(TCustomControl)
  private
   FSelected: Boolean;
   FCaption: String;
   procedure SetCaption(Val: String);
   procedure MEnter(var Mes: TMessage); message CM_MOUSEENTER;
   procedure MLeave(var Mes: TMessage); message CM_MOUSELEAVE;
  protected
   procedure Paint; override;
  public
   constructor Create(AOwner: TComponent);
   property Caption: String read FCaption write SetCaption;
 end;

implementation

constructor TMyButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent := AOwner as TWinControl;
 Width := 100;
 Height := 25;
end;

procedure TMyButton.SetCaption(Val: string);
begin
 FCaption := Val;
 paint;
end;

procedure TMyButton.Paint;
begin
 If not FSelected
 then
  begin
   Canvas.Pen.Color := $FFFFFF;
   Canvas.Brush.Color := $FFFFFF;
  end
 else
  begin
   Canvas.Pen.Color := $EEEEEE;
   Canvas.Brush.Color := $EEEEEE;
  end;

 Canvas.Rectangle(0,0,Width,Height);
 Canvas.Font.Color := 0;
 Canvas.TextOut((Width - Canvas.TextWidth(FCaption))div 2,(Height - Canvas.TextHeight(FCaption)) div 2,FCaption);
end;

procedure TMyButton.MEnter(var Mes: TMessage);
begin
 FSelected := True;
 Paint;
end;

procedure TMyButton.MLeave(var Mes: TMessage);
begin
 FSelected := False;
 Paint;
end;

end.

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

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



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года