Написать компонент для DelphiDelphi , Компоненты и Классы , Создание компонентНаписать компонент для Delphi
Оформил: DeeCo Delphi среда в основе которой лежат компоненты. Идея заключается в том, что бы не писать часто-используемый код самому, а воспользоваться компонентом, который инкапсулирует этот код. Т.е. он отделяет интерфейсную часть от части реализации. Большенство пользователей Delphi пользуются (иногда весьма успешно) компонентами, но еденици могут их создавать. Это вообщем правильно - на то Дельфи... Здесь мы рассмотрим написание двух компонентов: очень простого кнопки-счетчика и чуть посложнее невидемый компонент который соберает информацию о компьютере (основную конечно). Здесь исходные тексты с подробными коментариями. Кнопка-счетчикЭтот простой компонент, только пример, но используя эти приемы можно конструировать простые компоненты. Компонент представляет собой кнопку при нажатии на которую счетчик увеличивается на 1. unit MyUnit; //Сохраним наш файл под именем myunit.pas interface uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls, Forms, Graphics, Stdctrls; type {TMyButton - класс компонента который мы создаем, его предком является TButton. Наш компонет наследует все его методы, свойства и события.} TMyButton = class(TButton) private {Переменная контейнер для свойства Counter она изменяется каждый раз как изменяется свойство counter} FCounter : Integer; protected {Метод Click ,будет переопределен. именно он вызывается каждый раз как пользователь щелкает мышкой по кнопке. Но заметте, что он располагается в секции protect. Т.е. этот метод будет доступен только внутри реализации TMyButton.} procedure Click; override; public published {Именно это свойство будет доступно через инспектор объектов. Там вы его можете изменить.} property Counter: Integer read FCounter write FCounter; end; {Это служебная процедура для IDE Delphi. Она регистрирует компонент в палитре компонентов.} procedure Register; implementation procedure Register; begin {Это служебная процедура для IDE Delphi. Она регистрирует компонент в палитре компонентов.Standart-вкладка палитры компонетовTMyButton-какой именно компонент мы регистрируем (в одном модуле их может быть несколько.)} RegisterComponents('Standard', [TMyButton]); end; procedure TMyButton.Click; begin {Выполним метод Click класса предка.} inherited Click; {Увеличим свойство Counter на еденицу, это эквивалентно FCounter:=FCounter+1;} inc(FCounter); {Отобразим это изменение.} Caption := IntToStr(FCounter); end; end. Следующий компонент невидимый. он инкапсулирует часть кода WinApi. Предком компонента является TComponent. Добавлено три published свойства: property MachineName: string; // Имя машины (оно вводится, как правило, при установке windows)property UserName: string; // Имя пользователя который в данный момент работаетproperty WinSysDir: string; // Имя папки windows где она хранит свои DLLки (обычно это "c: \windows\system") Хотя этот компонент и демонстрационный он вполне работоспособен и может применяться в проектах. Преимущества использования здесь очевидны. Кроме того, что все эти свойства предоставляют необходимую информацию о машине их можно посмотреть в инспекторе объектов на стадии выполнения. Моменты которые были риссмотреныв предыдущем примере здесь рассматриваться не будут. Все места на которые следует обратить внимание будут выделены цветом. unit SystemInfo; interface usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, registry; typeTSystemInfo = class(TComponent)private {Объявлены переменные-контейнеры} FMachine, FUser, FWinSysDir: string; protected {Функции которые и "выясняют" все интересующие нас параметры. Они нужны для удобства и наглядности, хотя без них можно было обойтись.} function GetMachine : string; function GetUser: string; function GetWinSysDir: string; public {Переопределим конструктор Create. Нам нужно, чтобы при создании компонента все параметры уже были выяснены и занесены в переменные-контейнеры. служебное слово override означает, что этот конструктор (а по существу это тот же метод) будет не переписан, только переопределен ну если по русски, то переделан} constructor Create(AOwner: TComponent); override; published {Определяем published свойства.property это просто ключевое слово после которого следует имя свойства. Оно естественно должно быть уникальным. После имени идет тип свойства. Тип свойства и тип контейнера-переменной должен совпадать.read ключевое слово после которого следуе переменная или функция (объявлять ее следует в private разделе) откуда свойство будет читать значение.write свойство после которого следует переменная-контейнер или процедура с единственным параметром. Она будет вызываться всякий раз, когда кто-нибудь будет писать значение в это свойство. read и write не обязательны, но хотябы один должен присутствовать.} property MachineName: string read FMachine write FMachine; property UserName: string read FUser write FUser; property WinSysDir: string read FWinSysDir write FWinSysDir; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TSystemInfo]); end; constructor TSystemInfo.Create(AOwner: TComponent); begin inherited; {Сначала выполним Create предка} {Занесем в переменные контейнеры значения имя машины, пользователя и системную папку windows} FMachine := GetMachine; FUser := GetUser; FWinSysDir := GetWinSysDir; end; function TSystemInfo.GetUser: string; var n: dword; buf: pchar; begin n := 255; buf := stralloc(n); GetUserName(buf, n); result := strpas(buf); strdispose(buf); end; function TSystemInfo.GetMachine: string; var n: dword; buf: pchar; const rkMachine = 'SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName'; rvMachine = 'ComputerName'; begin n := 255; buf := stralloc(n); GetComputerName(buf, n); result := strpas(buf); strdispose(buf); with TRegistry.Create do begin rootkey := HKEY_LOCAL_MACHINE; if OpenKey(rkMachine, false) then beginif ValueExists(rvMachine) thenresult := ReadString(rvMachine); closekey; end; free; end; end; function TSystemInfo.GetWinSysDir: string; var n: integer; p: PChar; begin n := MAX_PATH; p := stralloc(n); getsystemdirectory(p, n); Result := strpas(p); end; end. Компонент Delphi! Я предоставлю подробный комментарий к предоставленному коду. Компонент MyButton
Это простой компонент кнопки, который инкрементирует свой свойство счетчика каждый раз, когда он кликается. Компонент наследуется от Компонент SystemInfo
Этот компонент отвечает за получение информации о системе,such as machine name, user name, and Windows system directory. Он наследуется от Вот некоторые заметные точки:
Обзор кода
В целом, это хороший старт для создания компонентов Delphi. С некоторыми минорными улучшениями он может стать еще более robust и пользовательски friendly! Написание компонентов для Delphi - это способ инкапсулировать код и отделить интерфейс от реализации, что позволяет уменьшить количество повторяющегося кода и улучшить удобство использования. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Создание компонент ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |