4. Наслідування
Будь-який клас може бути породжений від іншого класу. Для цього при його оголошенні вказується ім’я класу-предка:
TChildClass = class (TParentClass)
Якщо необхідно змінити або доповнити поведінку вже існуючого класу, то немає ніякої потреби переписувати клас наново.Можна скористатися наслідуванням. Необхідно вказати, що новий клас є нащадком вже існуючого і додати в новий клас властивості і методи, які необхідно, або перекрити існуючі методи і властивості.
Всі класи Object Pascal породжені від єдиного предка — класу TObject. Цей клас не має ні полів, ні властивостей, але включає в себе методи загального призначення, які забезпечують весь життєвий цикл будь-яких об’єктів — від їх створення до знищення. Програміст не може створити клас, який би не був дочірним класом TObject. Наступні два вирази ідентичні:
Taclass = class (TObject)
Taclass = class
Є декілька правил області видимості об'єкту, які допоможуть розібратися із способами доступу до об'єктів і наслідування об'єктів:
1. Поля, властивості і методи секції public не мають обмежень на видимість.
2. Поля, властивості і методи секції private, доступні тільки в методах класу і у функціях, оголошених в тому ж модулі, де і клас.
3. Поля, властивості і методи секції protected теж доступні тільки з методів класу і функцій, оголошених в модулі, але вони доступні в класах, що є нащадками, у тому числі і оголошених в інших модулях.
При описі нащадків, можна змінювати область видимості методів і властивостей. Можна розширювати область видимості, але не звужувати. Тобто якщо є властивість в секції private, ви можете зробити його public, але не навпаки. Ось приклад розширення області видимості:
Type
TmyClass=class(TObject)
Private
AmyField: Integer;
protected
property MyField: Integer read AmyField;
…
End;
TmySunClass = class(TMyClass)
…
Public
Property MyField; // Тільки згадали його в іншій секції і він поміняв область видимості.
End;
Наслідувані поля і методи предка є і в нащадку. При збігу імен предка і нащадка говорять про перекриття нащадком полів або методів предка. За способом виклику методи класу можна розділити на статичні, віртуальні, динамічні, перевантажувані і абстрактні. Абстрактні методи не мають реалізації і повинні бути обов'язково перекриті в нащадках.
Статичні методи і поля в об'єктах-нащадках перекриваються однаково: Ви можете без обмежень перекривати старі імена і при цьому змінювати тип методів, оскільки при перекритті буде створене нове поле або метод з тим же ім'ям. Перекритий метод предка доступний в нащадку через зарезервоване слово inherited.
По замовчуванню всі методи - статичні, тому їх адреси відомі вже на стадії компіляції, вони викликатимуться при виконанні програми найшвидшим способом. Віртуальні і динамічні методи описуються за допомогою спеціальних директив virtual або dynamic. Ці методи можуть бути перекриті в нащадку однойменними методами, що мають той же тип.
Лекція3
5. Поліморфізм
Поліморфізм — це можливість використовувати однакові імена методів, які входять у різні класи. Концепція поліморфізму забезпечує у випадку застосування методу до об’єкту, використання саме того методу, який відповідає класу об’єкту. Нехай визначені три класи, один з яких є базовим для двох інших:
Type
TPerson = class(TObject)
Fname: string;
constructor Create (name : string);
function info: string; virual;
end;
TStud = class(TPerson)
Fgr: integer;
constructor Create (name : string, gr : integer);
function info: string; override;
end;
TProf = class(TPerson)
Fdep: string;
constructor Create (name : string, dep : string);
function info: string; override;
end;
В кожному з цих класів визначений метод info. В базовому класі за допомогою команди virtual цей метод оголошено віртуальним. Оголошення методу віртуальним дає можливість дочірному класу зробити заміну віртуального методу своїм власним. В кожному дочірному класі визначено свій метод info, який замінює відповідний метод батьківського класу (метод породженого класу, який замінює відповідний метод батьківського класу помічений командою override).
Опишемо метод info для кожного з класів:
function TPerson.info: string;
begin
result := ‘ ’;
end;
function TStud.info: string;
begin
result := fname + ‘гр ’+ IntToStr(fgr);
end;
function TProf.info: string;
begin
result := fname + ‘каф ’+ fdep;
end;
Так як обидва класи породжені від одного і того ж базового оголосити список студентів і викладачів можна так:
List : array[1..n] of TPerson;
Вивести список студентів та викладачів можна, застосувавши метод info до елементів масиву за допомогою такого коду:
st := ‘ ’;
for i := 1 to n do
if list[i] <> nil
then st := st + list[i].info;
ShowMessange (st);
Під час роботи програми кожен елемент масиву може містити як об’єкт типу Tstud, так і об’єкт типу TProf. Концепція поліморфізму забезпечує застосування до об’єкту того методу, який відповідає типу об’єкта.
Часто виникає ситуація, коли один чи декілька методів дочірного класу повинні працювати не так, як в класі предка. Наприклад, клас TGeomFigure, який являє собою абстрактну геометричну фігуру і має метод Draw для її креслення. Нащадками цього класу могли би бути класи TCircle для роботи з колами, TLine для робот из лініями. Очевидно, що всі дочірні класи в цій ситуації повинні змінити метод Draw, щоб коректно відображати фігури, які їм відповідають.
Зміна функціональності наслідуваних методів в класах-нащадках називається переозначенням методів.
Для переозначення методу, реалізованого в об’єкті-предкові потрібно:
вказати його назву в інтерфейсній частині дочірного классу без зміни імені, списку параметрів і значення, яке повертається, якщо метод є функцією;
вказати після назви методу ключове слово override. Якщо ключове слово override не вказується, то метод не пере означується;
реалізувати метод (створити програмний код) в описуючій частині об’єкту за звичайними правилами. При цьому в назві методу ключове слово override не вказується.
Щоб метод міг би бути переозначений в дочірних класах, його потрібно помітити ключовими словами virtual чи dynamic в інтерфейсній частині класу-предка. Ключове слово virtual вказує на те, що метод повинен бути занесений у таблицю віртуальних методів, а ключове слово dynamic на те, що ім’я методу повинно бути в дереві батьківських об’єктів.
Наведемо приклад опису класу TwoNumbs, з двома властивостями a, b, і методом GetResult, який повертає суму властивостей. Потім для цього класу опишемо нащадка ThreeNumbs, який має вже три властивості a, b, c, і переозначений метод GetResult, який повертає суму вже трьох чисел.
Unit Overriding1;
Interface
Type
TwoNumbs = class
public
a, b : integer;
function GetResult:integer; virtual;
end;
ThreeNumbs = class (TwoNumbs);
public
c : integer; {опис властивості c. Властивості a, b наслідуються від класу-предка TwoNumbs}
function GetResult:integer; override; {опис заголовку методу, ідентичного заголовку об’єкту-предка; після опису вказано ключове слово override, яке вказує на переозначення функціональності методу предка.}
end;
Implementation
function TwoNumbs.GetResult:integer;
begin
Result := a + b;
end;
function ThreeNumbs.GetResult:integer;
begin
Result := a + b + c;
end;
end.
В приведеному прикладі метод GetResult класу TwoNumbs повністю переозначений в класі ThreeNumbs, тобто його початкова функціональність втрачена, але включена у функціональність заміняючого методу за допомогою копіювння. Це практично завжди можливо, якщо є доступ до вихідного тексту класу предка, але не завжди зручно, так як програмний код, що цей метод реалізовує може мати немалі розміри.
Для збереження функціональності переозначеного методу в Delphi є можливість його викликання з методу, який переозначують за допомогою ключового слова inherited, яка записується так:
Inherited < Назва методу> (<список параметрів>);
Тоді попередній код буде виглядати так:
Unit Overriding1;
Interface
Type
TwoNumbs = class
public
a, b : integer;
function GetResult:integer; virtual;
end;
ThreeNumbs = class (TwoNumbs);
public
c : integer;
function GetResult:integer; override;
end;
Implementation
function TwoNumbs.GetResult:integer;
begin
Result := a + b;
end;
function ThreeNumbs.GetResult:integer;
begin
Result := Inherited GetResult + c;
end;
end.
Метод, визначений в класі, може викликатися різними способами — це залежить від виду методу. Вид методу визначається модифікатором, який вказується в описі класу після заголовку методу, і відокремлюється від заголовку крапкою з комою. Приклади модифікаторів:
virtual — віртуальний метод;
dynamic — динамічний метод;
override — пере означений метод;
message — обробка повідомлення;
abstract — абстрактний метод.
По замовчуванню всі методи, оголошені в класі є статичними. Статичні методи викликаються як звичайні підпрограми. Адреса такого методу відома вже на стадії компіляції, і компілятор в тексті програми оформляє всі виклики даного методу як статичні. Такі методи працюють швидше за інших, але не можуть бути перезавантажені.
Завдяки можливості перезавантаження виклик віртуальних методів складніший, ніж виклик статичних методів, так як під час компіляції адреса конкретного віртуального методу ще невідома. Для розв’язку цієї задачі компілятор будує таблицю віртуальних методів (VMT), яка забезпечує визначення адресу методу в процесі виконання програми. VMT містить всі віртуальні методи предка і віртуальні методи самого об’єкту, і тому віртуальні методи використовують трохи більше пам’яті, ніж методи динамічні, але при цьому їх виклик відбувається швидше, ніж виклик динамічних методів.
Кожному динамічному методу компілятор призначає унікальне число, і використовує його разом з адресою методу для побудови таблиці динамічних методів (DMT). На відміну від VMT DMT містить тільки методи данного об’єкту, завдяки чому забезпечується економія пам’яті, Але одночасно сповільнюється виклик методу, оскільки потрібно буде переглянути не одну DMT в ієрархії об’єктів.
Методами обробки повідомлень є IAmaMessage. Значення після ключового слова message викликає повідомлення, у відповідь на яке викликається даний метод. Такі методи створюються для реакції на ті чи інші події Windows. Вони ніколи не викликаються безпосередньо з програми.
В основі операційної системи Windows лежить використання механізму повідомлень, які „документовують” всі довільні дії, наприклад, натискування клавішу, пересування миші, і т. д. Прикладна програма отримує повідомлення у вигляді запису заданого типу, який можна означити так:
Type
PMsg = ^TMsg;
Msg = packed record
hwnd : HWND;
message : UINT;
wParam : WPARAM;
lParam : LPARAM;
time : DWORD;
pt : TPoint;
end;
Поля в цьому записі несуть наступну інформацію:
hwnd — дескриптор керуючого елементу, якому призначено повідомлення;
message — код повідомлення;
wParam, lParam — додаткова інформація про повідомлення;
time — час опрацювання повідомлення Windows;
pt — координати вказівника миші під час генерації повідомлення;
Система Delphi перетворює повідомлення в свій формат, для якого використовується запис наступного типу:
PMessage = ^TMessage;
TMessage = record
Msg : Cardinal;
Case Integer of
0:(
WParam : Longint;
LParam : Longint;
Result : Longint;)
1: (
WParamLo : Word;
WParamHi : Word;
LParamLo : Word;
LParamHi : Word;
ResultLo : Word;
ResultHi : Word;)
end;
Типи Msg, TMessage, а також константи, описані при посиланні повідомлень, описані в файлах windows.pas, message.pas.
Для опрацювання повідомлень, які посилаються ядром Windows, та іншими прикладними програмами використовуються спеціальні методи, які описуються за допомогою модифікатора message, після якого вказується модифікатор повідомлення.
Метод обробки повідомлення обов’язково повинен бути процедурою, яка має один параметр, який при викликанні методу містить інформацію про поступлене повідомлення. Ім’я методу програміст вибирає самостійно, для компілятора це немає значення, так як цей метод є динамічним, і його виклик виконується за таблицею динамічних методів.
Метод може повністю або частково перекривати метод-предок, який опрацьовує це повідомлення. Але метод тільки модифікує метод-предок, для виклику останнього використовується метод Inherited.При цьому не потрібно вказувати назву методу-предка і його параметри, виклик буде здійснюватися автоматично.
Переважно в Delphi немає необхідності опрацьовувати безпосередні повідомлення Windows, так як є ще події, працювати з яими набагато простіше. Подія — це властивість процедурного типу, призначена для забезпечення реакції на ті чи інші дії. Присвоєння значення події означає вказання методу, який викликається при настанні події. Відповідні методи називають оброблювачами подій. Наприклад:
Application.OnIdle := IdleWork;
Об’єкти містять інформацію про власний тип і наслідування, яка доступна під час виконання програми, і яку можна використовувати , наприклад, для перевірки належності об’єкту до того чи іншого типу. Така перевірка запобігає небезпечним ситуаціям, пов’язаним з виконанням небезпечних дій.
Події в Delphi мають різні типи, які залежать від виду тої чи іншої події. Найпростішим є тип TNoLifyEvent, який характерний для повідомляючи подій. Цей тип описується так:
type TNoLifyEvent = procedure (Sender: TObject) of Object;
і містить один параметр Sender, який вказує на об’єкт-джерело події. Багато подій іншого типу поряд з іншими параметрами також містять параметр Sender.
Так як події є властивостями, то їхнє значення можна змінювати в процесі виконання прикладної програми. Тобто можна динамічно змінювати реакцію об’єкта на одну і ту ж подію. При цьому допускається призначити оброблювача подій іншого об’єкту, якщо співпадають типи подій.
Крім явно заданих параметрів методу завжди передається вказівник на екземпляр класу, який його викликав. Цим вказівником є параметр Self. Для посилання повідомлень віконним елементам керування можна використовувати функцію SendMessage. Посилання повідомлення може знадобитися і у випадку, коли компонент через свої властивості, не показує всіх своїх можливостей. Наприклад, список ListBox немає можливості напряму керувати горизонтальною полоскою прокрутки. Тому для відображення горизонтальної полоси прокрутки можна послати списку відповідне повідомлення.
Більшості методів при викликанні передається параметр Sender, який має тип TObject. Для виконання з цим параметром операцій таких як виклик методу чи присвоєння значень властивості, його необхідно провести до типу того об’єкту, для якого виконуються ці операції. Розрізняють явнее і неявне перетворення типів. Для операцій з типами в мові Object Pascal є операції is та as. Оператор використовується в виразі
<Об’єкт> is <Клас>
і перевіряє чи належить об’єкт до заданого класу чи одному з його потомків. Якщо так, то вираз приймає значення True, і це вказує на сумісність типів; якщо ні, то вираз приймає значення false.
Оператор as призначений для приведення одного типу до іншого і використовується у виразах виду:
Об’єкт> as <Клас>.
Таке приведення називається неявним. Розглянемо приклад на неявне приведення типів:
Procedure TForm1.Button1Click (Sender : TObject);
begin
if (Sender is TButton) then (Sender as TButton).Caption := TimetoStr(Now);
end;
Тут при натискуванні на кнопку Button, в її назві буде відображатися поточний час. І попередньо перевіряється чи можна виконати приведення типів. Якщо оброблювач призначений лише для кнопки Button1, то зміну заголовка простіше виконати за допомогою оператора виду
Button1.Caption := TimetoStr(Now);
Загальні властивості компонентів
Всі компоненти породжені від класу TComponent, в якому інкапсульовані найзагальніші властивості і методи компонентів. Предком TComponent є клас TPersistent, який є безпосередньо нащадком TObject.
Клас TPersistent передає своїм нащадкам важливий віртуальний метод:
Procedure Assign(Source: TPersistent);
За допомогою цього методу поля і властивості об’єкту Source копіюються в об’єкт, який викликає метод Assign. Відмітимо, що обмінюватися даними можуть всі нащадки класу TPersistent незалежно від того чи є вони безпосередніми родичами чи просто мають одного спільного предка — клас TPersistent.
Клас TComponent є базою для створення як видимих, так і невидимих компонентів. Велика частина видимих компонентів є нащадками класу TControl. Він забезпечує функціональні атрибути, які забезпечують положення і розміри елементу, його заголовок, колір та інші параметри. Клас TControl включає в себе загальні для візуальних елементів властивості, події і методи. Два нащадки цього класу — TWinControl і TGraphControl — визначають дві групи компонентів: ті, що мають віконний ресурс (клас TWinControl і його нащадки) і ті, що не мають віконного ресурсу (клас TGraphControl і його нащадки). Віконний ресурс — це спеціальний ресурс Windows, призначений для створення і обслуговування вікон. Віконний елемент керування являє собою спеціалізоване вікно, призначене для розв’язку конкретної задачі. До таких елементів відносяться командні кнопки, поля редагування, полоси прокрутки. Віконні елементи керування містять дескриптор чи визначник вікна (window handle). Дескриптором вікна в операційній системі Windows називається 32-бітна величина, яка однозначно визначає задане вікно. Прикладна програма використовує цей визначник для звернення до вікна.
Невіконні елементи не можуть отримувати фокус введення і бути предками для інших інтерфейсних елементів. Перевагою невіконних елементів є менша затрата ресурсів. Невіконними елементами керування є компоненти Label і DBText.
Клас TComponent містить загальні властивостфі і методи для всіх компонентів.
Властивість Name визначає ім’я компоненту:
property Name: TComponentName:
type TComponentName = String;
Ім’я компоненту будується за тими ж правилами, що імена інших об’єктів програмування — констант, змінних, підпрограм... Воно являє собою правильний ідентифікатор. Так як середовище Delphi саме поміщає на форму компоненти, то кожна компонента автоматично отримує ім’я, яке співпадає з іменем класу (без початкової літери T) і доповнене числовим суфіксом: Form1, Label2, Edit3… Згодом програміст може перейменовувати компоненти, для того, щоб зробити текст програми більш читабельним.
Наступна властивість визначає довільний цілочисельний параметр, який не використовується Delphi, і який програміст може використовувати на свій розсуд:
Property Tag: integer;
Будь-який компонент Delphi (крім форм і модулів) є власністю іншого компоненту, а той в свою чергу є власником одного чи декількох компонентів. Така залежність компонентів один від одного дозволяє суттєво спростити процес керування ними. Наприклад, щоб видалити вікно з включеними у нього компонентами достатньо викликати деструктор вікна, а той в свою чергу викличе деструкторів всіх інших компонентів, власником яких є компонент вікно, і таким чином повністю звільнить виділені вікну ресурси. Вказує власника компоненту наступна властивість(лише для читання):
Property Owner: TComponent;
Положення компоненту в масиві Components свого власника визначає властивість ComponentIndex
Property ComponentIndex: Integer;
Сам масив містить список всіх компонентів, які містить даний компонент визначається наступною властивістю:
Property Components[Index: Integer]: TComponent;
Кількість зареєстрованих в списку компонентів повертає властивість ComponentCount:
Property ComponentCount: Integer;
Конструктор TComponent.Create має єдиний параметр звернення , в якому компоненту передається вказівка на його власника:
Constructor Create(AOwner: TComponent);
При виконанні конструктора компонент вставляє посилання на себе в список Components свого власника і змінює вміст властивості Owner.
Методи для роботи зі списком:
Procedure DestroyComponents; — викликає почерзі деструктори всіх компонентів зі списку Components і знищує всі компоненти зі списку;
Function FindComponent(const AName: String): TComponent; — шукає в списку компонент з іменем AName і повертає вказівник на нього.
Procedure InsertComponent(AComponent: TComponent); — вставляє AComponent в кінець списку Components.
Procedure RemoveComponent(AComponent: TComponent); — видаляє AComponent зі списку Components.
Нащадки класу TControl утворюють всю палітру видимих компонентів Delphi. В термінах Windows вони називаються елементами керування, так як на їх основі реалізуються елементи інтерфейсу Windows — кнопки, прапорці, перемикачі, списки. Як вже зазначалося деякі з нащадків TControl володіють дескрипторами вікон і здатні отримувати та опрацьовувати повідомлення, інші вікон не мають, але обов’язково включаються в склад віконних компонентів, які ними керують згідно з вимограми Windows. Віконні елементи керування мають спеціальну віконну процедуру. Такі елементи називаються предківськими, а пов’язані з ними невіконні елементи — нащадківськими. Віконний елемент може виступати як предківський не тільки по відношенню до невіконних елементів, але й до віконних. Елементи нащадків ніяк не можуть виходити за межі свого предка і з’являються та щезають разом з ним. Предок з елементами нащадків розглядається у Windows як єдине ціле. Клас TControl визначає властивість Parent, яка містить вказівку на компонент предка:
Property Parent: TWinControl;
Цю властивіть не потрібно плутати з властивістю власника Owner: власник створює компонент (не обов’язково видимий), а предок керує видимим компонентом. Оскільки конструктор TComponent.Create не змінює властивості Parent, то при створенні видимих компонентів на етапі прогонки програми, цю властивість необхідно змінювати програмно. Наступна прцедура обробки події OnCreate форми Form1 вставить надпис дочірний елемент в лівий верхній кут форми:
Procedure TForm1.FormCreate(Sender: Object);
Var
lbLabel: TLabel;
begin
lbLabel:= TLabel.Create(Self);
lbLabel.Parent := Self;
lbLabel.Caption := ‘Дочірний елемент’;
end.
Якщо забрати оператор lbLabel.Parent := Self, то мітка ніколи не з’явиться на екрані. Зміна властивості Parent підключає мітку до елементів нащадків форми, а віконна процедура форми звернеться до потрібного методу мітки, щоб заставити її з’явитися в момент появи на екрані форми.
Крім властивості Components кожен віконний коипонент отримує від свого предка TWinControl властивість Controls , яка містить список дочірних елементів:
Property Controls [Index: Integer]: TControl;
Кількість елементів-нащадків повертає властивість ControlCount:
Property ControlCount: Integer;
Властивості дозволяють керувати зовнішним виглядом та поведінкою компонентів при проектуванні та виконанні додатку. Властивості компонентів доступні при проектуванні додатку, доступні і при його виконанні. Але є і властивості доступні під час виконання додатку. Властивості можна поділити на наступні групи:
дії (Action);
переміщення та зміщення компонентів (Drag, Drop, Docking);
контексної допомоги (Help, Hints);
вхідні (Input);
середовище (Layout);
наслідування (Legacy);
зв’язку (Linkage);
місцеві (Locale);
локалізації (Localizable);
різні (Miscellaneous);
візуальні (Visual).
Властивість DragMode типу TDragMode використовується при програмуванні операцій, пов’язаних з переміщенням об’єктів способом drag-and-drop (перемістити і залишити), і визначає поведінку елемента керування при переміщенні його мишею. Властивість DragMode може приймати одне з двох значень dmAutomatic та dmManual. По замовчуванню воно має значення dmManual і елемент керування переміщувати не можна, поки не буде викликано метод BeginDrag. Якщо цій властивості надати значення dmManual, то елемент керування можна переміщувати мишкою в будь-який момент.
Властивість Hint типу String задає текст підказки, який з’являється тоді , коли курсор знаходиться в області компоненту і протягом деякого часу нерухомий. Для того, щоб підказка відображалася, потрібно встановити значення True властивості ShowHint. По замовчуванню ShowHint має значення False і підказки не відображаються.
Властивість PopupMenu типу TPopupMenu вказує локальне вспливаюче меню, яке з’являється при натиснені правої кнопки мишки та розміщенні вказівника в області компонента. Щоб асоційоване з компонентом меню з’являлося при натиснені правої кнопки мишки, потрібно встановити значення True властивості AutoPopup. По замовчуванню воно має значення False.
Властивість ReadOnly визначає, чи дозволено керуючому елементу, пов’язаному з введенням і редагуванням інформації, змінювати текст, який він містить. Якщо властивість ReadOnly має значення True, то текст в елементі редагування доступний тільки для читання. Якщо властивість має значення False, то текст можна редагувати.
Положення і розміри компоненту визначаються чотирма його властивостями (в пікселах):
Property Height: Integer;
Property Left: Integer;
Property Top: Integer;
Property Width: Integer;
Для всіх компонентів, крім форм, ці властивості задаються в координатах клієнтської частини компоненту предка, для форми — в координатах екрану. Клієнтська частина компоненту — це його внутрішня область, за винятком заголовку, рамки і меню. Всі чотири числові величини містяться в єдиній властивості:
type
TPoint = record
X: Longint;
Y: Longint;
end;
property BoundsRect: TRect;
TRect = record
case Integer of
0: (Left, Top, Right, Bottom: Integer);
1: (TopLeft, BottomRight: TPoint);
end;
Важливу роль відіграє властивість Align, яка визначає положення компоненти відносно меж свого предка:
Type TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient);
Property Align: TAlign;
Тимчасове відключення, а потім включення ефекту від властивості Align забезпечується методами:
Procedure DisableAlign;
Procedure EnableAlign;
Будь-який видимий компонент можна смховати або показати за допомогою властивості Visible чи методами Show, Hide:
Property Visible: Boolean;
Procedure Hide;
Procedure Show;
Схований компонент не реагує на подіїї миші чи клавіатури.
Якщо компонент частково чи повністю перекривається іншими компонентами його можна розташувати поверх всіх компонентів:
Property BringToFront;
Property SendToBack;
Властивість Enable визначає можливість активізації компоненту:
Property Enabled: Boolean;
Якщо ця властивість має значення False, то компонент є недоступний. З кожним керуючим компонентом пов’язаний текстовий рядок, який стає доступний лише через властивість Caption чи Text. Незалежно від того, яка властивість зберігає цей рядок, його можна отримати чи встановити методами SetTextBuf, GetTextBuf. Метод GetTextLen повертає довжину рядка:
Procedure SetTextBuf (Buffer: PChar);
Function GetTextBuf (Buffer: PChar; BufSise: Integer) : Integer;
Function GetTextLen: Integer;
Якщо цей рядок є помітно на компоненті, використовується шрифт, який задається властивістю Font:
Procedure Font: TFont;
В цьому випадку властивість TAlignment регулює розташування тексту відносно меж компоненту:
Type TAlignment = (taLeftJustify, taRightJustify, taCenter);
Property Alignment: TAlignment;
Видима частина елементу заливається кольором Color:
Property Color: TColor;
Властивість DragMode типу TDragMode використовується при програмуванні операцій, пов’язаних з переміщенням об’єктів способом drag-and-drop (перемістити і залишити), і визначає поведінку елемента керування при переміщенні його мишею. Властивість DragMode може приймати одне з двох значень dmAutomatic та dmManual. По замовчуванню воно має значення dmManual і елемент керування переміщувати не можна, поки не буде викликано метод BeginDrag. Якщо цій властивості надати значення dmManual, то елемент керування можна переміщувати мишкою в будь-який момент.
Властивість Hint типу String задає текст підказки, який з’являється тоді , коли курсор знаходиться в області компоненту і протягом деякого часу нерухомий. Для того, щоб підказка відображалася, потрібно встановити значення True властивості ShowHint. По замовчуванню ShowHint має значення False і підказки не відображаються.
Візуальні компоненти для таких властивостей, як Color, Font, ShowHint можуть приймати значення відповідних властивостей предківського елементу керування, наприклад форми. Джерела значення для вказаних властивостей визначають властивості-ознаки типу Boolean:
ParentColor — колір фону;
ParentFont — шрифт тексту;
ParentShowHint — ознака відображення підказки.
Візуальні компоненти здатні генерувати і обробляти достатньо велику кількість подій різних видів. Існують такі загальні групи подій:
вибір керуючого елементу;
переміщення вказівника миші;
обертання кульки на мишці;
отримання і втрата керуючим елементом фокусу введення;
переміщення об’єктів методом drag-and-drop.
При виборі керуючого елементу виникає подія OnClick типу TNotifyEvent, яку називають подією натискування. Вона виникає при клацанні мишкою на компоненті.
При клацанні будь-якою кнопкою мишки генеруються ще дві події: OnMouseDown типу TMouseEvent, яке виникає при натискуванні кнопки мишки та OnMouseUp типу TMouseEvent, яке виникає при відпусканні кнопки мишки.
При подвійному клацанні лівою кнопкою мишки в області компоненту генерується подія OnDblClick типу TNotifyEvent.
При переміщенні вказівника мишки над візуальним компонентом відбувається подія OnMouseMove типу TMouseMoveEvent. Вона описується наступним чином:
type TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; x, y: Integer) of Object;
Параметр Sender вказує над яким елементом керування знаходиться вказівник мишки, параметри x, y типу Integer визначають координати вказівника. Координати задаються відносно елементу керування, який визначається параметром Sender. Параметр Shift вказує на стан клавішів <Alt>, <Ctrl>, <Shift> та кнопок мишки і може приймати комбінації наступних значень:
ssShift — натиснена клавіша <Shift>;
ssAlt — натиснена клавіша <Alt>;
ssCtrl — натиснена клавіша <Ctrl>;
ssLeft — натиснена ліва кнопка мишки;
ssMiddle — натиснена середня кнопка мишки;
ssDouble — відбувається подвійне клацання мишкою.
При роботі з клавіатурою генеруються події OnKeyPress, OnKeyDown, які виникають при натисненні клавішів, і подія OnKeyUp при відпусканні клавішів.
З візуальними компонентами, як і з іншими об’єктами, пов’язана велика кількість методів, які дозволяють створювати та знищувати об’єкти, відображати і ховати, виконувати інші операції. Розглянемо методи, які є загальними для всіх візуальних компонентів.
Процедура SetFocus встановлює фокус введення на віконний елемент. Перевірити можливість активізації компоненту дозволяє функція CanFocus: Boolean, яка приймає значення True, якщо елемент може отримати фокус введення, False — в протилежному випадку.
Метод Clear служить для очищення вмісту компонентів, які можуть містити текстову інформацію. Наприклад,
ListBox1.Clear;
Memo1.Clear;
Графічні компоненти
У стандартну бібліотеку візуальних компонент Delphi входить декілька об'єктів, за допомогою яких можна надати своїй програмі досить оригінальний вигляд. Це - TImage (TDBImage), TShape, TBevel.
TImage дозволяє помістити графічне зображення в будь-яке місце на формі. Цей об'єкт дуже простий у використовуванні — виберіть його на сторінці Additional і помістіть в потрібне місце форми. Власне картинку можна завантажити під час дизайну в редакторі властивості Picture (Інспектор Об'єктів). Картинка повинна зберігатися у файлі у форматі BMP (bitmap), WMF (Windows Meta File) або ICO (icon). (TDBImage відображає картинку, що зберігається в таблиці в полі типа BLOB. При цьому доступний тільки формат BMP.)
Як відомо, форматів зберігання зображень набагато більше трьох вищеназваних (наприклад, найбільш відомі PCX, GIF, TIFF, JPEG). Для включення в програму зображень в цих форматах потрібно або перевести їх у формат BMP, або знайти бібліотеки третіх фірм, в яких є аналог TImage, що "розуміє" дані формати (є як VBX об'єкти, так і "рідні" об'єкти для Delphi).
При проектуванні слід пям'ятати, що зображення, поміщене на форму під час дизайну, включається у файл .DPR і потім прикомпільовується до EXE файлу. Тому такий EXE файл може вийти достатньо великий. Як альтернативу можна розглянути завантаження картинки під час виконання програми, для цього у властивості Picture (яке є об'єктом з своїм набором властивостей і методів) є спеціальний метод LoadFromFile. Це робиться, наприклад, так:
if OpenDialog1.Execute then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
Важливими є властивості об'єкту Center і Stretch - обидва мають булевий тип. Якщо Center встановлена True, то центр зображення поєднуватиметься з центром об'єкту TImage. Якщо Stretch встановлене в True, то зображення стискатиметься або розтягуватиметься так, щоб заповнити весь об'єкт TImage.
TShape — прості графічні об'єкти на формі типу круг, квадрат і т.п. Вид об'єкту вказується у властивості Shape. Властивість Pen визначає колір і вид межі об'єкту. Brush задає колір і вид заповнення об'єкту. Ці властивості можна міняти як під час дизайну, так і під час виконання програми.
TBevel —об'єкт для прикраси програми, може приймати вид рамки або лінії. Об'єкт надає менше можливостей в порівнянні з TPanel, але не займає ресурсів. Зовнішній вигляд вказується за допомогою властивостей Shape і Style.
Властивість об'єктів Canvas
У ряду об'єктів з бібліотеки візуальних компонент є властивість Canvas (канва), яка надає простий шлях для малювання на них. Ці об'єкти — TBitmap, TComboBox, TDBComboBox, TDBGrid, TDBListBox, TDirectoryListBox, TDrawGrid, TFileListBox, TForm, TImage, TListBox, TOutline, TPaintBox, TPrinter, TStringGrid.
Canvas є в свою чергу об'єктом, об'єднуючим в собі поле для малювання, олівець (Pen), кисть (Brush) і шрифт (Font). Canvas володіє також рядом графічних методів : Draw, TextOut, Arc, Rectangle і ін. Використовуючи Canvas, Ви можете відтворювати на формі будь-які графічні об'єкти —картинки, багатокутники, текст і т.п. без використовування компонент TImage,TShape і TLabel (тобто без використовування додаткових ресурсів), проте при цьому Ви повинні обробляти подію OnPaint того об'єкту, на канві якого Ви малюєте. Розглянемо докладніше за властивість і методи об'єкту Canvas.
Властивості Canvas:
Художник в своїй роботі використовує олівці та пензлі. Методи, які забезпечують креслення на поверхності канви графічних примітивів, також використовують олівець і кисть. Олівець застосовують для креслення ліній та контурів, а кисть для замальовування областей, обмежених контурами.
Brush — кисть, є об'єктом з своїм набором властивостей:
Bitmap — картинка розміром строго 8x8, використовується для заповнення (заливки) області на екрані. Color — колір заливки. Style — визначає стиль заливки; ця властивість конкурує з властивістю Bitmap, яку властивість Ви визначили останньою, та і визначатиме вид заливки. CopyMode — властивість визначає, яким чином відбуватиметься копіювання (метод CopyRect) на дану канву зображення з іншого місця: один до одного, з інверсією зображення і ін.
Font — шрифт, яким виводиться текст (метод TextOut).
Pen — олівець, використовується для креслення точок, ліній, контурів геометричних фігур: прямокутників, кіл, еліпсів, дуг та ін. Вид ліній; визначають такі властивості:
Color — колір лінії Style — стиль виведення: лінія, пунктир і ін. Width — ширина лінії (в пікселах).
PenPos — поточна позиція олівця, олівець рекомендується переміщати за допомогою методу MoveTo, а не прямим встановленням даної властивості.
Pixels — двовимірний масив елементів зображення (pixel), з його допомогою Ви дістаєте доступ до кожної окремої точки зображення.
Методи Canvas:
Будь-яка картинка, рисунок, схема можуть розглядатися як сукупність графічних примітивів: точок, ліній, кіл, дуг... Для того, щоб на екрані з’явилася потрібна картинка, програма повинна забезпечити креслення найпростіших графічних фігур, які є на цій картинці.
Креслення прямої лінії здійснюється за допомогою методу LineTo:
Компонент.Canvas.LineTo(x, y);
Метод LineTo креслить пряму лінію від поточної позиції олівця до точки вказаної при викликанні методу.
Початкову точку можна задати, перемістивши олівець в потрібну точку графічної поверхні. Це можна зробити за допомогою методу MoveTo(x, y), перемістивши олівець в точку з координатами (x, y). Вид лінії визначається значеннями властивостей об’єкту Pen графічної поверхні.
Метод PolyLine креслить ломану лінію. Як параметр метод отримує масив TPoint. Кожен елемент масиву є запис, поля якого містять координати точок перегину ламаної. Цей метод можна використовувати для креслення замкнених контурів. Для цього координати першої та останньої точки повинні співпадати.
Метод Ellipse креслить еліпс чи коло в залежності від значень параметрів. Його формат виведення такий:
Об’єкт.Canvas. Ellipse (x1, y1, x2, y2);
де Об’єкт — ім’я об’єкту на поверхні якого креслиться фігура;
x1, y1, x2, y2— координати прямокутника, всередині якого креслиться еліпс. Якщо прямокутник є квадратом, то креслиться коло. Колір, товщина і вид лінії еліпса визначаються значеннями властивості Pen. Колір і стиль заповнення еліпса визначаються значеннями властивості Brush поверхні Canvas.
Креслення дуги виконує метод Arc, формат виведення якого такий:
Об’єкт.Canvas. Arc (x1, y1, x2, y2, x3, y3, x4, y4);
x1, y1, x2, y2 — параметри, які визначають еліпс, частиною якого є дуга;
x3, y3 — параметри, які визначають початкову точку дуги;
x4, y4 — параметри, які визначають кінцеву точку дуги.
Дуга креслиться проти годинникової стрілки (від початкової точки до кінцевої). Колір, товщина і вид лінії дугиа визначаються значеннями властивості Pen поверхні Canvas.
Прямокутник креслиться методом Rectangle, формат виведення його такий:
Об’єкт.Canvas. Rectangle (x1, y1, x2, y2);
де Об’єкт — ім’я об’єкту на поверхні якого креслиться фігура;
x1, y1, x2, y2— координати лівого верхнього і правого нижнього кута прямокутника.
Метод RoundRect також креслить прямокутник, але з округленими кутами. Формат виведення його такий:
Об’єкт.Canvas. RoundRect (x1, y1, x2, y2, x3, y3);
x1, y1, x2, y2— координати кутів прямокутника, в який вписується прямокутник з заокругленими кутами.
x3, y3 — розмір еліпса, одна чверть якого використовується для креслення заокругленого кута.
Метод FillRect креслить замальований прямокутник, а метод FrameRect — лише контур. У кожного з цих методів лише один параметр — структура типу TRect.
Наведемо приклад процедури, яка на поверхні форми креслить прямокутник з зеленим контуром і червоним заповненням:
Procedure TForm1.Button1.Click (Sender: TObject);
Var
r1, r2: TRect;
Begin
r1:= Rect(20, 20, 60, 40);
r2 := Rect(10, 10, 40, 50);
with Form1. Canvas do
begin
Brush.Color := clRed;
FillRect(r1);
Brush.Color := clGreen;
FrameRect(r2);
end;
end.
Метод Polygon креслить многокутник. Як параметр метод отримує масив TPoint. Кожен елемент масиву є запис, поля якого містять координати вершин многокутника. Метод Polygon креслить многокутник, послідовно з’єднуючи прямими лініями точки, координати яких знаходяться в масиві: першу з другою, другу з третьою, ..., останню та першу.
Наведемо процедуру для креслення трикутника:
Procedure TForm1.Button2.Click (Sender: TObject);
Var
pol: array[1..3] of TPoint;
Begin
Pol[1].x:= 10;
Pol[1].y:= 50;s
Pol[2].x:= 40;
Pol[2].y:= 10;
Pol[3].x:= 70;
Pol[3].y:= 50;
Form1.Canvas.Polygon(Pol);
end;
Метод Pie креслить сектор еліпсу чи круга. Його формат виведення такий:
Об’єкт.Canvas.Pie (x1, y1, x2, y2, x3, y3, x4, y4);
x1, y1, x2, y2 — параметри, які визначають еліпс, частиною якого є сектор;
x3, y3, x4, y4 — параметри, які визначають кінцеві точки прямих, які є межами сенктора.
Властивість Pixels являє собою двовимірний масив типу TColor містить інформацію про колір кожної точки графічної поверхні.
Form1.Canvas.Pixels [10, 5]:= clRed; — замальовує точку поверхні в червоний колір.
Розмір масиву Pixels визначається розміром графічної поверхні. Розмір графічної поверхні форми (клієнтської області) задається значеннями властивостей ClientWidth, ClientHeight, а розмір графічної поверхні компонента Image — значеннями властивостей Width, Height. Лівій верхній точці робочої області відповідає точка Pixels[0, 0], а правій нижній точка з координатами Pixels[ClientWidth -1, ClientHeight - 1].
Для виведення тексту на поверхню графічного об’єкту використовується TextOut.Його формат виведення такий:
Об’єкт.Canvas.TextOut(x, y, Текст);
де Об’єкт — ім’я об’єкту на поверхню якого виводиться текст;
x, y — координати точки графічної поверхні, з якої починається виведення тексту.
Текст — змінна чи константа символьного типу.
Шрифт, який використовується для виведення тексту визначається значенням властивості Font для відповідного об’єкту Canvas.
При використовуванні TextRect текст виводиться тільки усередині вказаного прямокутника. Довжину і висоту тексту можна взнати за допомогою функцій TextWidth і TextHeight.
Продемонструємо фрагмент програми для виведення тексту на поверхню форми:
with Form1.Canvas do
begin
Font.Name := ‘Tahoma’;
Font.Size := 20;
Font.Style := [fsItalic, fsBold];
BrushStyle := bsClear; );//область виведення тексту не замальовується
TextOut (10, 10,’Borland Delphi’
end;
Найпростіше вивести ілюстрацію, яка знаходиться у файлі з розширенням .bmp, .jpg, ico.за допомогою компонента Image, який знаходиться на закладці Additional. Під час розробки форми ілюстрація задається встановленням значення властивості Picture шляхом вибору файлу ілюстрації в діалоговому вікні в результаті клацання по кнопці Load вікна Picture Editor .
Для того, щоб вивести ілюстрацію в поле компонента під час роботи програми, потрібно застосувати метод LoadFromFile до властивості Picture, вказавши як параметр ім’я файлу ілюстрації. Інструкція
Form1.Image1.Picture.LoadFromFile(‘e:\temp\bart.bmp’);
Завантажує ілюстрацію з файлу bart.bmp і виводить її в поле виведення Image1.
Методи для виведення картинок на канву - Draw і StretchDraw, Як параметри указуються прямокутник і графічний об'єкт для виведення (це може бути TBitmap, TIcon або TMetafile). StretchDraw відрізняється тим, що розтягує або стискає картинку так, щоб вона заповнила весь вказаний прямокутник (див. приклад до даного уроку).
Об'єкт TPaintBox
На сторінці System Палітри Компонент є об'єкт TPaintBox, який можна використовувати для побудови додатків типу графічного редактора або, наприклад, як місце побудови графіків (якщо, звичайно, у Вас немає для цього спеціальних компонент третіх фірм). Ніяких ключових властивостей, окрім Canvas, TPaintBox не має, власне, цей об'єкт є просто канвою для малювання. Важливо, що координати покажчика миші, передавані в обробники відповідних подій (OnMouseMove і ін.), є відносними, тобто це зсув миші щодо лівого верхнього кута об'єкту TPaintBox, а не щодо лівого верхнього кута форми.
Класи загального призначення
Клас TStrings є базовим класом для операцій зі стрічковими даними. Цей клас являє собою масив стрічок. Для операцій зі стрічками клас TStrings має відповідні властивості і методи.
Візуальні компоненти, які можуть працювати зі списком стрічок, мають властивості, які є масивами стрічок, які містяться в цих компонентах. Наприклад для списків ListBox і DBListBox та для груп залежних перемикачів RadioGroup, DBRadioGroup такою властивістю є Items, а для багатострічкових редакторів Memo, DBMemo — Lines. Вказані властивості для візуальних компонентів ListBox і Memo доступні при розробці і при виконанні додатку, а для візуальних компонентів DBListBox, DBMemo — тільки при виконанні додатку.
Розглянемо особливості і використання класу TStrings на прикладі властивості Items списків. Кожний елемент списку є рядок, до якого можна отримати доступ за його номером в масиві стрічок Items. Відлік елементів списку починається з нуля. Для звертання до першого елементу потрібно вказати Items[0], до другого — Items[1], до третього — Items[2]. При операціях з окремими рядками, програміст повинен контролювати номери рядків в списку і не допускати звернення до неіснуючого елементу.
Властивість Count типу Integer задає число елементів в списку. Оскільки перший елемент списку має нульовий номер, то номер останнього елементу Count-1.
Наприклад, присвоювання елементам списку ListBox1 нових значень може бути реалізовано так:
Var i: integer;
For i := 0 to ListBox1.Items.Count – 1 do
ListBox1.Items[i] := ‘Рядок номер’ + IntToStr(i);
Методи Add і Insert призначені для додавання і вставлення рядків в список.
Функція Add (const S: String): Integer додає заданий параметром S рядок в кінець списку, а як результат повертає положення нового елементу в списку.
Процедура Insert (Index: Integer; const S : String)вставляє рядок S на позицію з номером, який визначається параметром Index. При цьому елементи списку, які знаходилися до операціцї вставки на вказаній позиції і нижче зміщуються вниз.
Процедура AddStrings (Strings: TStrings)додає в кінець списку групу рядків, яка визначається параметром Strings. Клас TStrings дозволяє з-берігати рядки і посилання на об’єкти довільного типу.
Функція AddObject (const S: String; AObject: TObject): Integer додоє в кінець списку рядок S і посилання на об’єкт, який вказується параметром Aobject.
Процедура Assign (Source: TPersistent) присвоює один об’єкт іншому, при цьому об’єкти повинні мати сумісні типи. В результаті виконанн процедури відбувається копіювання інформації з одного списку в інший. Якщо кількість елементів в списках не співпадає, то після заміни кількість елементів списку, який замінюється, стає рівною кількості елементів списку, який копіюється.
Функція Equals (Strings: TStrings): Boolean використовується для визначення чи містять два списки рядків однакову текстову інформацію. Якщо зміст списків співпадає, то функція повертає значення True, в противному випадку — False. Списки є рівними, якщо вони рівні за довжиною, і співпадать всі їх відповідні елементи.
Наприклад,
If not ListBox2.Items.Equals(ListBox1.Items) then
begin
ListBox2.Clear;
ListBox2.Items.AddStrings(ListBox1.Items);
end;
або
If not ListBox2.Items.Equals(ListBox1.Items) then
ListBox2.Items.Assign(ListBox1.Items);
Для видалення елементів списку використовуються методи Delete і Clear.
Метод Delete (Index: Integer) знищує елемент з номером, заданий параметром Index. Наприклад,
Procedure TForm1.Button2Click(Sender: TObject);
begin
ComboBox1.Items.Delete(4);
end;
Метод Clear очищує список, видаляючи всі його елементи. Так, в процедурі
Procedure TForm1.btnClearList(Sender: TObject);
begin
ListBox1.Items.Clear;
end;
при натиснені кнопки btnClearList відбувається очищення списку ListBox1.
Процедура Move (CurIndex, NewIndex: Integer) переміщує елемент з позиції з номером CurIndex в нову позицію з номером NewIndex.
Пошук елементу в списку можна виконати за допомогою методу IndexOf.
Процедура IndexOf (const S: string): Integer визначає, чи є рядок s в списку. Якщо рядок знайдений, то процедура повертає номер позиції, в протилежному випадку — -1.
Клас TStrings має методи SaveToFile і LoadFromFile, які дозволяють безпосередньо працювати з текстовими файлами. Ці методи дають можливість зберігання рядків списку в тестовому файлі на диску та можливість читання стрічок з цього файлу.
Процедура SaveToFile (const FileName: string)зберігає рядкові елементи списку в файлі FileName. Якщо заданого файлу немає, то він створюється. Наприклад,
ListBox3.SaveToFile(‘C:\Lab\name.txt’);
Зміст списку ListBox3 записується у файл name.txt каталогу C:\Lab.
Процедура LoadFromFile (const FileName: string)заповнює список вмістом вказаного текстового файлу, при цьому попередній вміст списку стирається.
Приклад заповнення списку:
Procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox2.Items.LoadFromFile(‘C:\Text\spysok.txt’);
end;
Файл spysok.txt містить прізвища студентів. При завантаженні програми вміст цього файлу завантажується в комбінований список ComboBox2.
Введення і редагування інформації виконується в спеціальних полях чи областях форми.
Однорядковий редактор чи рядок редагування являє собою поле введення інформації, в якому можливе відображення і зміна тексту.
В Delphi є декілька однорядкових редактори, але найширше використовується компонент Edit.
Компонент Edit дозволяє вводити і редагувати з клавіатури різні символи, при цьому підтримуються операції переміщення в рядку за допомогою клавіш керування курсором, знищення символів за допомогою клавіш <BackSpace>, <Delete>, виділення частини тексту. В однорядкового редактора відсутня реакція га клавіші <Enter>, <Esc>.
Для роботи з багаторядковим текстом Delphi містить компонент Memo. Memo може містити декілька рядків. Для доступу до всього вмісту багаторядкового редактора використовується властивість Text. В цьому випадку вміст компоненту Memo подається як один рядок.
Для роботи з окремими рядками використовується властивість Lines типу TStrings.
Наведемо приклади операцій з багаторядковим редактором:
Memo1.Lines[3] := ‘asa’;
Memo2.Lines.Clear;
Memo3.Lines.Add(‘asa’);
Вміст компоненту Memo можна завантажувати з текстового файлу і зберігати в текстовому файлі. Для цього зручно використовувати методи SaveToFile і LoadFromFile.
Приклад читання інформації з текстового файлу в компонент Memo:
Memo1.Lines.LoadFromFile(‘C:\Text\spysok.txt’);
і запису з компонента Memo2 в текстовий файл:
Memo2.Lines.SaveToFile(‘C:\Text\spysok2.txt’);
Для зручного перегляду інформації можливе задання в полі редагування смуги прокручування за допомогою властивості ScrollBars, яка може мати наступні значення:
ssNone — відсутні смуги прокручування;
ssHorizontal — знизу є горизонтальна смуга прокручування;
ssVertical — справа є вертикальна смуга прокручування;
ssBoth — обидві смуги прокручування.
Текст в полі компонента може бути вирівняний різними способами. Спосіб вирівнювання визначає властивість Alignment, яке може набувати значень taLeftJustify, taCenter, taRightJustify.
На відміну від однорядкового редактора, компонент Memo має можливість реакції на натиснення клавішу <Enter>. Для того щоб відбувалося введення нового рядка, властивості WantReturns типу Boolean повинне бути встановлене значення True. В противному випадку редактор не реагує на натиснення клавішу <Enter>.
Компоненти, які використовуються для редагування інформації мають багато спільних властивостей і методів.
Властивості AutoSelect, SelStart, SelLength, SelText дозволяють працювати з виділеним фрагментом тексту.
Властивість SelText визначає виділений фрагмент.
Властивості SelStart і SelLength задають початкову позицію в рядку (відлік символів починається з нуля) і довжину виділеного фрагменту.
Наведемо декілька операцій з виділеним текстом:
Memo1.SelStart := 19;
Memo1.SelLength := 6;
Memo1.SelText := ‘adf’;
If pos(‘qwerty’, Edit1.Text)<> 0 then
begin
Edit1.SelStart := pos(‘qwerty’, Edit1.Text) – 1;
Edit1.SelLength := length(‘qwerty’);
end;
Крім властивостей для операцій з виділеним фрагментом тексту використовуються методи SelectAll, CopyToClipBoard, CutToClipBoard, PasteFromClipBoard.
Список являє собою впорядковану сукупність взаємопов’язаних
