type
TGWidget=class;
TGNotifyEvent=procedure (Sender:TGWidget) of object;
TGMouseClickEvent=procedure (Sender:TGWidget; x,y:integer) of object;
{ TGWidget }
TGWidget=class
private
Fheight: integer;
Fleft: integer;
fOnClick: TGMouseClickEvent;
Ftop: integer;
Fwidth: integer;
procedure Setheight(AValue: integer);
procedure Setleft(AValue: integer);
procedure Settop(AValue: integer);
procedure Setwidth(AValue: integer);
protected
canvas:tcanvas; // холст для прорисовки виджета
notifyredraw:tgnotifyevent;// callback для предупреждения родителя о
// необходимости перерисовки виджета
public
constructor create(_canvas:tcanvas=nil; _notifyredraw:tgnotifyevent=nil;
_top:integer=100; _left:integer=100;
_width:integer=100; _height:integer=50);
// перерисовка виджета
procedure redraw(); virtual; abstract;
// координаты виджета
property top:integer read Ftop write Settop;
property left:integer read Fleft write Setleft;
// размеры виджета
property width:integer read Fwidth write Setwidth;
property height:integer read Fheight write Setheight;
// реакция виджета на мышиный клик
procedure mouseClick(x,y:integer); virtual;
property onClick:TGMouseClickEvent read fOnClick write fOnClick;
// далее - методы и свойства для реакции на различные типы событий
end;
Экземпляры базового класса виджета не создаются, он является предком для виджетов других типов. В потомках базового класса виджета предусматривается перекрытие всех абстрактных методов предка с описанием соответствующей реакции на события (в реальных системах предлагается создавать множество промежуточных классов с обеспечением реакции по умолчанию на все события).
Рассматриваемый класс виджета поддерживает минимум из требуемого в GUI-системах функционала:
TGClickButton=class(TGWidget)
private
frised: boolean;
procedure setrised(AValue: boolean);
protected
procedure mouseClick(x,y:integer); override;
procedure redraw(); override;
public
property rised:boolean read frised write setrised;
end;
Конструктор для данного класса не предусматривается, т.к. все необходимые инициализации уже реализованы в классе-предке, кроме состояния кнопки (по умолчанию rised=false - кнопка отжата). Конструктор может быть создан, если потребуется реализовать дополнительный функционал, либо изменить состояние кнопки по умолчанию.
При изменении состояния кнопки следует обеспечивать нотификацию родителя о данном факте, который впоследствии перерисует кнопку методом redraw.
В исходных файлах примера (см.ниже) отсутствует реализация методов класса TGClickButton (файл gclickbutton.inc). Cтуденту предлагается реализовать ее самостоятельно.
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormPaint(Sender: TObject);
destructor Destroy;override;
private
WGS:array of TGWidget;
public
procedure RedrawWidget(Sender:TGWidget);
function addWidget(Widget:TGWidget):TGWidget;
procedure clickOnButton(Sender:TGWidget; x,y:integer);
end;
WGS - динамический массив для хранения всех виджетов.