Технологія візуального проектування програм
Завантажити презентаціюПрезентація по слайдам:
Технологія візуального проектування програм (на прикладі використання Delphi-середовища) 1. Головні складові частини середовища програмування Delphi. 2. Технологія Two-Way Tools . 3. Обробка стандартних повідомлень Windows. 4. Нова об’єктна модель Object Pascal. Особливості використання примірників. Властивості. Механізм подій. Вказівники на методи. Область видимості published. RTTI та методи класів. Технологія візуального проектування програм
Головні складові частини середовища програмування Delphi Дизайнер форм (Form Designer) Вікно текстового редактора (Editor Window) Палітра компонент (Component Palette) Інспектор об'єктів (Object Inspector) Технологія візуального проектування програм
Технологія Two-Way Tools Two-Way Tools характеризується синхронізацією візуального проектування програм (на основі дизайнера форм Form Designer та інспектора об'єктів Object Inspector) із класичним ("кодовим") програмуванням (на основі текстового редактора Editor Window). Технологія візуального проектування програм
Обробка стандартних повідомлень Windows Як і в OW для Windows-повідомлення в Object Pascal обробник визначається як деякий динамічний метод. Специфічною ознакою метода-обробника є наявність директиви message, за якою слідує індекс методу – ідентифікатор Windows-повідомлення Приклад (заголовок обробника): procedure WMSize(var Mes: TWMSize); message WM_Size; Приклад (реалізація обробника): procedure TForm1.WMSize(var Mes: TWMSize); begin inherited; if Mes.Width
Особливості обробників стандартних Windows-повідомлень Для більшості Windows-повідомлень в Object Pascal (модуль Messages) описані спеціальні типи, як, наприклад, типи: TWMKey, TWMLButtonDown тощо. На відміну від інших віртуальних та динамічних методів, при перекритті обробників повідомлень директиву override не потрібно вказувати; належить тільки зберегти в директиві message той самий індекс. В обробниках (і тільки в них) можна викликати метод-предок, просто вказавши ключове слово inherited (предок буде знайдений за індексом методу). Усе ж при проектуванні програм значно частіше використовується розроблений у Object Pascal так званий механізм подій. TWMSize, TWMMouse, Технологія візуального проектування програм
Дві об’єктні моделі в Object Pascal класична модель (відповідні об’єкти синтаксично визначаються традиційним чином – на основі використання службового слова object ); нова модель (“нові об’єкти” – “класи” – синтаксично визначаються з використанням службового слова class). TControl = class(TComponent) . . . end; Технологія візуального проектування програм
Особливості використання примірників Примірники класів у новій моделі можливі тільки динамічного походження. ( (Button1)=4). Створення примірників – конструктором Create (Create = New+Init). Символ розіменування в новій моделі "^" не використовується. SizeOf Технологія візуального проектування програм
Властивості Наявність властивостей можна розглядати як поглиблення концепції інкапсуляції: для всіх стандартних класів всі поля (без жодного винятку!) є безпосередньо недоступними (описуються як private). Властивості ж саме забезпечують відповідний доступ (використовуючи приписані властивостям методи читання/запису значень таких полів). (Настійливо рекомендується дотримуватись цих правил і при розробці своїх власних класів). У загальному випадку при визначенні властивості використовуються: поле (до якого ця властивість забезпечує доступ); два методи: read і write (якими забезпечують читання/запис значення зазначеного поля). Технологія візуального проектування програм
Приклад (фрагменти з опису TControl) TControl = class(TComponent) { unit Controls } private FLeft: Integer; FVisible: Boolean; procedure SetLeft(Value: Integer); procedure SetVisible(Value: Boolean); public property Visible : Boolean read FVisible write SetVisible default True; published property Left: Integer read FLeft write SetLeft; end; Властивість (property) Left пов'язана з полем FLeft: write-методом властивості є SetLeft, яким встановлюється “нове” значення; замість read-метода вказано безпосередньо поле Fleft. Технологія візуального проектування програм
Приклад write-метода (реальний фрагмент з Object Pascal ) property Visible : Boolean read FVisible write SetVisible default True; procedure TControl.SetVisible(Value: Boolean); begin if FVisible Value then begin VisibleChanging; FVisible := Value; Perform(CM_VISIBLECHANGED, 0, 0); RequestAlign; end; end; Технологія візуального проектування програм
Використання властивостей Властивості можуть використовуватись подібно до полів в операторах присвоювання: AControl.Visible:= AValue; AVariable := AControl.Visible; Проте компілятор буде транслювати такі оператори присвоювання у виклики методів write та read (з опису відповідної властивості). (Хоча зовні використання властивостей виглядає подібно до звичайних полів, за “лаштунками” присвоювань можуть використовуватись різноманітні “побічні” дії. І це дуже важлива обставина для забезпечення візуального проектування: “побічною” дією найчастіше є “перемальовування” змінюваної візуальної компоненти). Технологія візуального проектування програм
Механізм подій Події — це властивості процедурного типу, призначені для забезпечення реакції на дії користувача. (Більш того із типом властивостей пов’язуються не просто процедури, а процедури-методи, тобто методи деяких класів). Приклад: property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent Процедури-значення таких властивостей прийнято називати обробниками подій. Усі події у Delphi прийнято іменувати з "On": OnClick, OnDblClick, OnCreate тощо. Технологія візуального проектування програм
Автоматична генерація заготівок обробників подій Двічі клацнувши лівою кнопкою миші в Інспекторі об'єктів на сторінці Events у полі події, можна одержати в програмі заготівку обробника (як метода поточної форми). Ім'я метода буде складатися з імені компонента та імені події (без "On"). Якщо, наприклад, вказані дії застосувати до кнопки Button1 із форми Form1, то події OnClick (для цієї кнопки) буде зіставлятись обробник Button1Click (з порожнім процедурним блоком) як метод форми Form1: procedure TForm1.Button1Click(Sender: TObject); begin end; (Того ж результату можна досягти двічі клацнувши на Button1). Технологія візуального проектування програм
Приклад подій та обробників (фрагменти з опису TControl, що пов'язуються з подіями Click та DblClick) TControl = class(TComponent) { unit Controls } private FOnClick: TNotifyEvent; FOnDblClick: TNotifyEvent; procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; protected procedure Click;dynamic; (*спричиняє появу події OnClick*) procedure DblClick;dynamic;(*спричиняє появу події OnDblClick*) property OnClick: TNotifyEvent read FOnClick write FOnClick; property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick; end; Технологія візуального проектування програм
Приклад подій та обробників (продовження) procedure TControl.Click; begin if Assigned(FOnClick) then FOnClick(Self); end; procedure TControl.DblClick; begin if Assigned(FOnDblClick) then FOnDblClick(Self); end; procedure TControl.WMLButtonDblClk(var Message: TWMLButtonDblClk); begin SendCancelMode(Self); inherited; if csCaptureMouse in ControlStyle then MouseCapture:=True; if csClickEvents in ControlStyle then DblClick; DoMouseDown(Message, mbLeft, [ssDouble]); end; (У тілі WMLButtonUp міститься виклик Click). Технологія візуального проектування програм
Делегування подій Спосіб реакції на подію одного об'єкта може присвоюватись (делегуватись) іншому: MyObject1.OnClick := MyObject2.OnClick Щоб описати такий тип процедури, який по присвоюванню був би суміснім з методом (тобто фактично додатково забезпечував би передачу неявного параметра Self), слід додавати до опису процедурного типу зарезервовані слова of object. Вказівники на зазначені процедури отримали назву вказівників на методи. Вказівник на метод – це, грубо кажучи, те ж саме, що і вказівник на процедуру, але процедура має бути процедурою об'єкта (procedure … of object), тобто методом. Приклад (опис типу TNotifyEvent): TNotifyEvent = procedure (Sender: TObject) of object Технологія візуального проектування програм
Визначення власних подій Delphi дозволяє визначати власні події, до того ж власних типів: type TMyEvent = procedure(Sender: TObject; var AValue: Char) of object; (* Новий тип події з передачею літерного значення *) TOb1 = class; (* Об'єкт із новою подією OnMyEvent типу TMyEvent *) private FOnMyEvent: TMyEvent; . . . property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent; . . . procedure MyEvent(var AValue: Char); dynamic; (* Метод MyEvent – “постачальник”, ініціатор події OnMyEvent *) end ; Технологія візуального проектування програм
Визначення власних подій (продовження) procedure TOb1.MyEvent(var AValue: Char); begin if Assigned(FOnMyEvent) then FOnMyEvent(Self,AValue); end; Делегування подій (типу TMyEvent): type T0b2 = class; procedure SetVal_1(Sender: TObject; var AVal: Char); procedure SetVal_2(Sender: TObject; var AVal: Char); . . . end; var Ob1: TOb1; Ob2: T0b2; . . . Ob1 := TOb1.Create; Ob2 := TOb2.Create; if (* умова *) then Obj1.OnMyEvent := Obj2.SetVal_1 else Obj1.OnMyEvent := Obj2.SetVal_2 Технологія візуального проектування програм
Типи обробників подій Спільним для усіх типів є параметр Sender, що вказує на об'єкт – джерело події. TNotifyEvent – це найпростіший тип події, він окрім Sender не має більше параметрів: TNotifyEvent= procedure(Sender:TObject) of object. Тип, призначений для подій про натискання клавіш, передбачає передачу програмісту кодів клавіш; тип, призначений для подій про пересування миші – передачу координат миші і т.п. Приклади деяких типів обробників: TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object; Технологія візуального проектування програм
Типи обробників подій (продовження) TKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState) of object; TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object; TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object; TDragDropEvent = procedure(Sender, Source: TObject; X, Y: Integer) of object; TStartDragEvent = procedure(Sender: TObject; var DragObject: TDragObject) of object; TEndDragEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object; Технологія візуального проектування програм
Області видимості. Область видимості published Традиційні області видимості: public; private; protected. У Delphi використовується додатково ще одна область – published. Вона безпосередньо пов’язана з візуальним проектуванням програм: представлені у відповідній секції властивості об'єкта (їх ще називають опублікованими) видимими будуть не тільки під час виконання додатка (у run time), але й в інспекторі об'єктів під час розробки програм (у design time). У дочірніх класах можна переносити методи й властивості з однієї області видимості в іншу. Технологія візуального проектування програм
Зміна у властивостей областей видимості. Приклад Фрагменти описів TControl, TForm та TButton з описами властивостей Left, Visible, OnClick, OnDblClick та змінами їх областей видимості: TControl = class(TComponent) protected property OnClick: TNotifyEvent read FOnClick write FOnClick; property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick; property Visible: Boolean read FVisible write SetVisible default True; published property Left: Integer read FLeft write SetLeft; end; Технологія візуального проектування програм
Зміна у властивостей областей видимості. Приклад (продовження) TForm = class(TCustomForm) (* модуль Forms.pas *) published property Visible; property OnClick; property OnDblClick; end; TButton = class(TButtonControl) (* модуль Stdctrls.pas *) published property Visible; property OnClick; end; Властивість OnDblClick у класі TButton "продовжує" лишатись не опублікованою. Технологія візуального проектування програм
Таблиці віртуальних методів. RTTI У новій об'єктній моделі перше поле кожного примірника містить вказівник на таблицю віртуальних методів (ТВМ). Безпосередньо перед ТВМ розташована спеціальна структура фіксованого розміру, що отримала назву Інформація про тип часу виконання – RunTime Type Information (RTTI). У RTTI містяться дані, що характеризують клас в цілому: вказівник на ім'я класу, розмір примірників, вказівник на клас-предок, адреса таблиці динамічних методів класу тощо. RTTI-структура "живе самостійним життям", тобто може використовуватися навіть без створення примірників класів. Крім того, вона може використовуватися програмістом не тільки явно, а й неявно. Зокрема, на основі доступу до RTTI реалізуються оператори is та as, а також так звані класові методи. Доступ до RTTI можна здійснити за допомогою вказівника на клас (class reference). (Його можна уявляти собі як вказівник, що встановлений на тип, з яким пов’язана структура RTTI). Технологія візуального проектування програм
Вказівники на класи Типи вказівників на класи (або класові типи) описуються із зарезервованими словами class of. Наприклад, тип вказівників на клас TObject описується як TClass: type TObject = class; TClass = class of TObject. Аналогічні типи вказівників описані і для інших важливих класів, наприклад, TComponentClass, TControlClass тощо. Вказівники на класи підпорядковуються тим же обмежуючим правилам, що традиційно діють для об'єктних типів: вказівник на клас-предок може посилатися на будь-який дочірній клас, але не навпаки. Запуск Project5 Технологія візуального проектування програм
Вказівники на класи (приклад) type TFirst = class . . . end; TSecond = class(TFirst) . . . end; TFirstClass = class of TFirst; TSecondClass = class of TSecond; var AFirst: TFirstClass; ASecond: TSecondClass; AFirst := TSecond; { присвоювання – коректне } ASecond := TFirst; { помилка – несумісність типів} Технологія візуального проектування програм
Класові методи З вказівниками на клас тісно пов'язане поняття класових методів (методів класу). Такі методи можна викликати без створення примірників: треба лише вказати ім'я того класу, метод якого ви хочете використати. (Відповідні методи дозволяють оперувати загальною інформацією про клас, яка міститься в RTTI). Найважливіші методи класів визначено вже в TObject. Такі методи дозволяють, не заглиблюючись у внутрішню структуру RTTI, використовувати наявну там інформацію. (Визначені в TObject методи класів по суті є процедурною надбудовою над RTTI). В описах методи класів від інших методів відрізняються наявністю слова class перед заголовком метода: type TMyObject = class(TObject) class function F1Class: real; (* метод класу *) function F2: real; (* не "класовий"метод *) end; Технологія візуального проектування програм
Вказівники на класи. Класові методи (приклад 1) type TMyObject = class; { = class(TObject) } . . . end; TMyObjClass=class of TMyObject; {тип вказівників на клас} var AClassRef: TClass; {змінна – вказівник на клас} s: string; . . . AClassRef:= TObject; s := AClassRef.ClassName; { s отримує значення ‘TObject’} AClassRef:= TMyObject; s:= AClassRef.ClassName; {s отримує значення ‘TMyObject’} ClassName – функція класу, яка "витягує" ім'я відповідного класу з його RTTI. Запуск Project1 Технологія візуального проектування програм
Вказівники на класи. Класові методи (приклад 2) Пошук усіх класів, що є пращурами заданого класу, наприклад, класу TButton. var AClassRef : TClass; begin AClassRef := TButton; edit1.Text := ’’; repeat AClassRef := AClassRef.ClassParent; edit1.Text:= edit1.Text+' '+AClassRef.ClassName; until (AClassRef.ClassName = 'TObject') ; end; Запуск Project2 Технологія візуального проектування програм
Приклад: динамічне створення управляючих елементів procedure TForm1.FormCreate(Sender: TObject); begin with ClassList.Items do begin (* ClassList: TComboBox; *) AddObject('TEdit', TObject(TEdit)); AddObject('TCheckBox', TObject(TCheckBox)); AddObject('TRadioButton',TObject(TRadioButton)); AddObject('TButton', TObject(TButton)); AddObject('TListBox', TObject(TListBox)); end; ClassList.ItemIndex := 0; end; Запуск Project3 Технологія візуального проектування програм
Приклад: динамічне створення управляючих елементів (продовження) procedure TForm1.Button1Click(Sender: TObject); var Reference: TControlClass; Instance: TControl; begin Reference := TControlClass( ClassList.Items.Objects[ClassList.ItemIndex]); Instance := Reference.Create(Self); Instance.Parent := CreationArea; Instance.Left := StrToInt(XPos.Text); Instance.Top := StrToInt(YPos.Text); Instance.Name := Edit1.Text; end; Технологія візуального проектування програм
Формальний опис класу TObject TObject = class { unit System;} TObject = class constructor Create; procedure Free; class function InitInstance(Instance: Pointer): TObject; procedure CleanupInstance; function ClassType: TClass; class function ClassName: ShortString; class function ClassNameIs(const Name: string): Boolean; class function ClassParent: TClass; class function ClassInfo: Pointer; class function InstanceSize: Longint; class function InheritsFrom(AClass: TClass): Boolean; class function MethodAddress(const Name: ShortString): Pointer; class function MethodName(Address: Pointer): ShortString; Технологія візуального проектування програм
Формальний опис класу TObject (продовження) function FieldAddress(const Name: ShortString): Pointer; function GetInterface(const IID: TGUID; out Obj): Boolean; class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry; class function GetInterfaceTable: PInterfaceTable; function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; virtual; procedure AfterConstruction; virtual; procedure BeforeDestruction; virtual; procedure Dispatch(var Message); virtual; procedure DefaultHandler(var Message); virtual; class function NewInstance: TObject; virtual; procedure FreeInstance; virtual; destructor Destroy; virtual; end; Технологія візуального проектування програм
Дизайнер форм (Form Designer) Форми відіграють роль управляючих панелей подібно до діалогових вікон (діалогових блоків) із TV чи OW. Модальний та не модальний режими: Form. Show; Form. ShowModal. Технологія візуального проектування програм
Палітра компонент (Component Palette) Компоненти – це об'єкти в традиційному для ООП розумінні. Вони не обов'язково мають бути візуальними, тим більш віконними, але всі вони мають властивості (properties), деякі з яких (із статусом published) можуть задаватись в Інспекторі об'єктів. Технологія візуального проектування програм
TComponent TComponent є прабатьком всіх компонент Delphi. Забезпечує можливість внесення в палітру компонентів (для останньго важлива наявність published властивостей і, перш за все, властивості Name). Інкапсулює відношення власності (відповідальності). (Власник Owner визначається параметром конструктора Create). Базовим об'єктом візуальних компонент є TControl. Користувач може їх бачити, маніпулювати, змінюючи положення, розміри, визначати події. TWinControl – базовий об'єкт віконних компонент. Він характеризується наявністю вікна з дескриптором (властивістю ) Handle, можливістю опинятись у фокусі тощо. Технологія візуального проектування програм
Фрагмент ієрархії класів TObject (System.pas) TList TPersystence (Classes.pas) TGraphic TBitmap TClipboard TComponent (Classes.pas) TDataSource, TDataSet, TMenu, … TControl (Controls.pas) TGraphicControl TImage TWinControl (Controls.pas) TButtonControl TButton Технологія візуального проектування програм
Інспектор об'єктів (Object Inspector) Сторінки Object Inspector: properties; events. Технологія візуального проектування програм
Тип TWMSize TWMSize = packed record Msg: Cardinal; SizeType: Longint; { SIZE_MAXIMIZED, SIZE_MINIMIZED, SIZE_RESTORED, SIZE_MAXHIDE, SIZE_MAXSHOW } Width: Word; Height: Word; Result: Longint; end; Технологія візуального проектування програм
Тип TWMMouse TWMMouse = packed record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end; Технологія візуального проектування програм
Примірники у новій моделі type TCl=class (TObject) f:char; . . . end; var a1,a2: TCl; {procedure TForm1.Button1Click(Sender: TObject);} a1:=TCl.Create; a2:=TCl.Create; a1.f:='1'; a2:=a1; {procedure TForm1.Button2Click(Sender: TObject);} a1.f:='2'; Запуск Project4 Технологія візуального проектування програм
Схожі презентації
Категорії