Програмування Delphi

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Об'єктно-орієнтоване програмування

Історично склалося так, що програмування виникло і розвивалося як процедурне програмування, яке передбачає, що основою програми є алгоритм, процедура обробки даних.

Об'єктно-орієнтоване програмування (ООП) - це методика розробки програм, в основі якої лежить поняття об'єкту, як деякої структури, яка описує об'єкт реального світу, його поведінку. Завдання, яке вирішується з використанням методики ООП, описується в термінах об'єктів і операцій над ними, а програма при такому підході являє собою набір об'єктів та зв'язків між ними.

Зауваження

Строго кажучи, для того, щоб розробляти додатки в Delphi на базі надаються середовищем розробки компонентів, знання концепції ООП не є необхідним. Однак для більш глибокого розуміння того, як програма взаємодіє з компонентами, що і чому Delphi додає в текст програми, матеріал даної глави досить корисний.

Клас

Класичний мова Pascal дозволяє програмісту визначати свої власні складні типи даних - записи (records). Object Pascal, підтримуючи концепцію об'єктно-орієнтованого програмування, дає можливість визначати класи. Клас - це складна структура, що включає в себе крім опису даних опис процедур і функцій, які можуть бути виконані над представником класу - об'єктом.

Ось приклад опису простого класу:

TTPerson = class

Private

fname: string [15];

f address: string [35];

public

procedure show;

end;

Дані класу називаються полями, процедури і функції - методами. У наведеному прикладі TTPerson - це ім'я класу, fname і faddress - імена полів, show - ім'я методу.

Зауваження

Відповідно до прийнятого в Delphi угодою імена полів повинні починатися з літери f (від слова field - поле).

У програмі опис класу поміщають в розділ опису типів (type).

Об'єкт

У програмі представники класу - об'єкти, оголошуються в розділі var. Наприклад, так:

var

student: TTPerson;

professor: TTPerson;

Слід звернути особливу увагу на те, що в Object Pascal об'єкт - це динамічна структура. Змінна-об'єкт містить не дані, а посилання на дані об'єкта. Тому програміст повинен подбати про виділення пам'яті для цих даних.

Виділення пам'яті здійснюється за допомогою спеціального методу класу - конструктора, якого зазвичай присвоюють ім'я create (створити). Щоб підкреслити особливу роль і поведінка конструктора, в описі класу замість слова procedure використовується слово constructor. Нижче наведено опис класу TTPerson, до складу якого введено конструктор.

TTPerson = class

private

fname: string [15];

f address: string [35];

constructor create; / / конструктор

public

procedure show; / / метод

end;

Виділення пам'яті для даних об'єкта відбувається присвоюванням значення результату застосування методу-конструктора до типу (класу) об'єкта. Наприклад, після виконання інструкції

professor: = TTPerson.create;

виділяється необхідна пам'ять для даних об'єкта professor.

Окрім виділення пам'яті, конструктор, як правило, вирішує завдання присвоювання полів об'єкта початкових значень, тобто здійснює ініціалізацію об'єкта. Нижче наведено приклад реалізації конструктора для об'єкта TTPerson.

constructor TTPerson.create;

begin

fname: = '';

faddress :=''';

end;

Реалізація конструктора дещо незвична. По-перше, в тілі конструктора немає звичних інструкцій New, що забезпечують виділення динамічної пам'яті (всю необхідну роботу з виділення пам'яті виконує компілятор). По-друге, формально, конструктор не повертає значення, хоча в програмі звернення до конструктора здійснюється як до методу-функції.

Після оголошення та ініціалізації об'єкт можна використовувати, наприклад, встановити значення поля об'єкта. Доступ до поля об'єкта здійснюється вказівкою імені об'єкта та імені поля, які відокремлюються один від одного крапкою. Хоча об'єкт є посиланням, проте правило доступу до даних за допомогою посилання, згідно з яким після імені змінної, що є посиланням, треба ставити значок ^ на об'єкти не поширюється. Наприклад, для доступу до поля fname об'єкта professor замість

professor ^. Fname

треба писати

professor.fname

Очевидно, що такий спосіб доступу до полів об'єкта більш природний.

Якщо в програмі деякий об'єкт більше не використовується, то можна звільнити пам'ять, займану полями цього об'єкта. Для виконання цієї дії використовують метод-деструктор free. Наприклад, щоб звільнити пам'ять займану полями об'єкту professor, достатньо записати

professor.free;

Метод

Методи класу (процедури і функції, оголошення яких включено в опис класу) виконують дії над об'єктами класу. Щоб метод був виконаний, треба вказати ім'я об'єкта і ім'я методу, відокремивши одне ім'я від іншого крапкою. Наприклад, інструкція

professor. Show;

викликає застосування методу show до об'єкта professor. Фактично керівництво застосування методу до об'єкта - це специфічний спосіб запису інструкції виклику процедури.

У програмі методи класу визначаються точно так само, як звичайні процедури і функції, за винятком того, що ім'я процедури або функції, що є методом, складається з двох частин: імені класу, до якого належить метод, і імені методу. Ім'я класу від імені методу відокремлюється крапкою.

Нижче наведено приклад визначення методу show наведеного вище класу TTPerson.

/ / Метод show класу TTPerson

procedure TTPerson. show;

begin

ShowMessage ('Ім'я:' + fname + # 13 + 'Адреса:' + faddress);

end;

Слід звернути увагу на те, що в інструкціях методу доступ до полів об'єкта здійснюється без вказівки імені об'єкта.

Інкапсуляція і властивості об'єкта

Під інкапсуляцією розуміється приховування полів об'єкта з метою забезпечення доступу до них тільки за допомогою методів класу.

У Object Pascal обмеження доступу до полів об'єкта реалізується за допомогою властивостей об'єкта. Властивість об'єкта характеризується полем, що зберігає значення властивості, і двома методами, що забезпечують доступ до поля властивості. Метод встановлення значення властивості називається методом запису властивості (write), метод отримання значення властивості називається методом читання властивості (read).

В описі класу перед ім'ям властивості записують слово property (властивість). Після імені властивості вказується його тип, потім імена методів, що забезпечують доступ до значення властивості. Після слова read вказується ім'я методу, що забезпечує читання властивості, після слова write - записи властивості ім'я методу. Нижче наведено приклад опису класу TTPerson, що містить дві властивості: Name і Address.

type

TName = string [15];

TAddress = string [35];

TTPerson = class

Private

FName: Tname; / / значення св-ва Name

Faddress: TAdress; / / значення св-ва Address

Constructor Create (Name: Tname);

Procedure Show;

Function GetName: TName;

Function GetAddress: TAddress;

Procedure SetAddress (NewAddress: TAddress);

Public

Property Name: Tname

read GetName;

Property Address: Taddress

read GetAddress

write SetAddress;

end;

У програмі для встановлення значення властивості не обов'язково записувати інструкцію застосування до об'єкта методу установки значення властивості, можна записати звичайну інструкцію присвоювання значення властивості. Наприклад, щоб привласнити значення властивості Adress об'єкта student, достатньо записати

Student.Address: = 'С. Петербург, вул.Садова 21, кв. 3 ';

Компілятор перетранслірует наведену інструкцію присвоювання значення властивості в інструкцію виклику методу

Student.SetAddress ('С. Петербург, вул. Садова 21, кв .3'), •

Зовні використання властивостей у програмі нічим не відрізняється від використання полів об'єкта. Разом з тим між властивістю і полем об'єкта існує принципова відмінність: при присвоєнні та читанні значення властивості автоматично викликається процедура, яка виконує певну роботу.

У програмі на методи властивості можна покласти деякі додаткові завдання. Наприклад, за допомогою методу можна перевірити коректність привласнюються властивості значень, встановити значення інших, логічно пов'язаних з властивістю, полів, викликати допоміжну процедуру.

Оформлення даних об'єкта як властивості дозволяє обмежити доступ до полів, що зберігають значення властивостей об'єкта, наприклад можна дозволити тільки читання. Щоб інструкції програми не могли змінити значення властивості, в описі властивості треба вказати тільки ім'я методу читання. Спроба привласнити значення властивості, призначеному тільки для читання, викликає помилку часу компіляції. У наведеному вище описі класу TTperson властивість Name доступно тільки для читання, а властивість Address - для читання і запису.

Встановити значення властивості, захищеного від запису, можна під час ініціалізації об'єкту. Нижче наведено методи класу ттрегзоп, щоб забезпечити створення об'єкту класу ттрегзоп і доступ до його властивостей.

/ / Конструктор об'єкта TTPerson

Constructor TTPerson.Create (Name: TName);

begin

FName: Name; end;

/ / Метод отримання значення властивості Name

Function TTPerson.GetName;

begin

Result: = FName;

end;

/ / Метод отримання значення властивості Address

Function TTPerson.GetAddress;

begin

Result: = FAddress;

end;

/ / Метод зміни значення властивості Address

Procedure TTPerson.SetAddress (NewAddress: TAddress);

Begin

if FAddress = ''

then FAddress: = NewAddress;

end;

Наведений конструктор об'єкта TTPerson створює об'єкт і встановлює значення поля FName, визначального значення властивості Name.

Інструкції програми, що забезпечують створення об'єкту класу TTPerson і установку його властивості, можуть бути, наприклад, такими:

student: = TTPerson. create ('Іванов');

student.address: = 'вyл. Садова, Д.З, кв.25 ';

Успадкування

Концепція об'єктно-орієнтованого програмування припускає можливість визначати нові класи за допомогою додавання полів, властивостей і методів до вже існуючих класів. Такий механізм отримання нових класів називається породженням. При цьому новий, породжений, клас (нащадок) успадковує властивості і методи свого базового, батьківського класу.

В оголошенні класу-нащадка вказується клас батька. Наприклад, клас TEmployee (співробітник) може бути породжений від розглянутого вище класу ттрегзоп шляхом додавання поля Department (відділ). Оголошення класу TEmployee в цьому випадку може виглядати так:

TEmployee = class (TTPerson)

FDepartment: integer; / / номер відділу

constructor Create (Name: TName; Dep: integer);

end;

Укладена в дужки ім'я класу TTPerson показує, що клас TEmployee є похідним від класу TTPerson. У свою чергу, клас ттрегзоп є базовим для класу TEmployee.

Клас TEmployee має свій власний конструктор, який забезпечує ініціалізацію класу батька і своїх полів. Ось приклад реалізації конструктора класу TEmployee:

constructor TEmployee.Create (Name: Tname; Dep: integer);

begin

inherited Create (Name);

FDepartment: = Dep;

end;

У наведеному прикладі директивою inherited викликається конструктор батьківського класу, потім привласнюється значення полю класу нащадка.

Після створення об'єкту похідного класу в програмі можна використовувати поля і методи батьківського класу. Нижче наведено фрагмент програми, що демонструє цю можливість.

engineer: = TEmployee.create ('Сидоров', 413);

engineer.address: = 'yл.Блохіна, буд.8, кв.10';

Перша інструкція створює об'єкт типу TEmployee. Друга встановлює значення властивості, яке відноситься до батьківського класу.

Директиви Protected і Private

Крім оголошень елементів класу (полів, методів, властивостей) опис класу, як правило, містить директиви protected (захищений) і private (закритий), які встановлюють ступінь видимості елементів класу в програмі.

Елементи класу, оголошені в секції protected, доступні тільки в породжених від нього класах. Область видимості елементів класу цієї секції не обмежується модулем, в якому знаходиться опис класу. Зазвичай в секцію protected поміщають опис методів класу.

Елементи класу, оголошені в секції private, видимі всередині модуля. Ці елементи не доступні за межами модуля, навіть у похідних класах. Зазвичай в секцію Private поміщають опис полів класу, а методи, що забезпечують доступ до цих полів, поміщають в секцію protected.

Нижче наведено опис класу TTPerson, в яке включено директиви управління доступом.

TTPerson = class

private

Fname: TName; {значення св-ва Name}

Faddress: TAddress; (значення св-ва Address)

protected

Constructor Create (Name: TName);

Function GetName: TName;

Function GetAddress: TAddress;

Procedure SetAddress (NewAddress: TAddress);

Property Name: Tname

read GetName;

Property Address: Taddress

read GetAddress

write SetAddress;

end;

Зауваження

Якщо треба щоб елементи класу були повністю сховані, то визначення класу слід помістити в окремий модуль.

Поліморфізм і віртуальні методи

Поліморфізм - це можливість використовувати однакові імена для методів, які входять у різні класи. Концепція поліморфізму забезпечує при застосуванні методу до об'єкта використання саме того методу, який відповідає класу об'єкта.

Нехай визначені три класи, один з них є базовим для двох інших.

type / / базовий клас

TPerson = class

fname: string; {ім'я}

constructor Create (name: string);

function info: string;

virtual;

end;

/ / Похідний від базового Tperson

TStud = class (TPerson)

fgr: integer; {номер групи}

constructor Create (name: string; gr: integer);

function info: string; override;

end;

/ / Похідний від базового Tperson

Tprof = class (TPerson)

fdep: string; {назва кафедри}

constructor Create (name: string; dep: string);

function info: string; override;

end;

У кожному з цих класів визначено метод info. У базовому класі за допомогою директиви virtual метод info оголошений віртуальним. Оголошення методу віртуальним дає можливість дочірньому класу зробити заміну віртуального методу своїм власним. У кожному дочірньому класі визначено свій метод 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;

У програмі список людей можна уявити масивом об'єктів класу TPerson.

list: array [1 .. SZL] of TPerson;

Зауваження

Тут слід згадати, що об'єкт - це покажчик.

Оголосити подібним чином список можна тому, що Object Pascal дозволяє вказівником на батьківський клас присвоїти значення вказівника на дочірній клас. Тому елементами масиву list можуть бути як об'єкти класу TStud, так і об'єкти класу Tprof.

Виведення списку можна здійснити застосуванням методу info до елементів масиву, наприклад, так:

st :='';

for i: = l to SZL do / / SZL - розмір масиву-списку

if list [i] NIL

then st: = st + info.list [i] + # 13; ShowMessage (st);

Під час роботи програми кожен елемент масиву може містити як об'єкт типу TStud, так і об'єкт типу Tprof. Концепція поліморфізму забезпечує застосування об'єкту саме того методу, який відповідає типу об'єкта.

Процедура TForml.Button1click, яка запускається в результаті клацання на кнопці Додати (Button1), створює об'єкт list [n] класу TStud або TProf. Клас створюваного об'єкта визначається станом радіокнопки студент (RadioButton1),

Процедура TForml.Button2Click, яка виконується в результаті клацання на кнопці Список (Button2), застосовуючи метод info до кожного об'єкта списку (елементу масиву), формує рядок, що представляє собою весь список.

Класи і об'єкти Delphi

Для реалізації інтерфейсу Delphi використовує бібліотеку класів, яка-містить велику кількість різноманітних класів, що підтримують форму і різні компоненти (командні кнопки, поля редагування і т. д.).

Під час проектування форми додатку Delphi автоматично додає в текст програми необхідні об'єкти. Якщо відразу після запуску Delphi переглянути вміст вікна редактора коду, то там можна побачити такі рядки:

type

Tform1 = class (TForm)

private

{Private declarations}

public

{Public declarations}

end;

var

Form1: Tform1

Цей опис класу початкової, порожній, форми додатку і оголошення об'єкту - форми програми.

Коли програміст, додаючи необхідні компоненти, створює потрібну форму, Delphi формує опис класу форми. Коли програміст створює функцію обробки події форми або її компоненти, Delphi додає оголошення методу в опис класу форми програми.

Крім класів візуальних компонентів у бібліотеку класів входить клас обробки виняткових ситуацій (помилок), клас загального управління додатком та інші. Розгляд цих класів у завдання цієї книги не входить.

Створення простого текстового редактора

1. Помістіть компонент Bevel (на сторінці Additional) на нову форму і надайте його властивості Align значення alTop.

2. На компонент Bevel помістіть чотири кнопки. Озаглавьте їх & 0реn ..., & Save, Save & As ... і E & xit.

Три крапки в кінці імені представляє собою секретний код Windows, що означає, що клацання на кнопці викличе ще один діалог, а не приведе до негайного виконання певної дії.

3. Помістіть на форму компонент Memo і встановіть наступним чином його властивості:

Властивість Значення

Align alClient

ScrollBars ssBoth

Lines (пусто)

4. Змініть заголовок форми на My Editor. Потім помістіть на форму компонент OpenDialog і надайте його властивостям такі значення:

Властивість Значення

Default Ext ТХТ

Options.ofHideReadOnly True

Options.ofFileMustExist True

Options.ofNoReadOnlyReturn True

Title Open Text File

5. Для того щоб відкрити вікно Filter Editor (Редактор фільтра), двічі клацніть на властивості Filter.

6. Заповніть два перші рядки в колонці Filter Name (Ім'я фільтра) назвами фільтрів Text files і All files, а в колонці Filter (Фільтр) введіть відповідні фільтри: *. ТХТ і *.*.

7. Помістіть на форму компонент SaveDialog та встановити його властивостей такі значення:

Властивість Значення

Default Ext ТХТ

Options.ofHideReadOnly True

Options.ofOverwritePrompt True

Options.ofNoReadOnlyReturn True

Title Save Text File

8. Введіть той самий набір фільтрів, що і для діалогу відкриття файлу.

9. Створіть обробник події OnClick для кнопки Exit, що містить одну команду Close;

10. Для обробника події OnClick кнопки Open використовуйте наступні рядки:

WITH OpenDialog1 DO

IF Execute THEN

BEGIN

Memo1.Lines.LoadFromFile (Filename);

HistoryList.Add (Filename);

Caption: = 'My Editor-' +

ExtractFilename (Filename);

SaveDialog1.Filename: = Filename;

Filename :='';

End;

11. Двічі клацніть на кнопці Save і введіть наступну рядок в якості її обробника події OnClick:.

Memo1.Lines.SaveToFile (SaveDialog1.Filename);

12. Нарешті, для кнопки Save As зазначте наступне:

WITH SaveDialog1 DO

IF Execute THEN

BEGIN

Memo1.Lines.SaveToFile (Filename);

Caption: = 'My Editor -' +

ExtractFilename (Filename);

End;

Ми створили простий текстовий редактор. Він дозволяє завантажувати, редагувати і зберігати невеликі і середні файли. Можливості цього редактора приблизно такі ж, як і у програми Notepad (Блокнот) Windows. Можна вирізати, копіювати і вставляти текст, використовуючи стандартні комбінації клавіш Windows. Ім'я кожного відкритого файлу додається до списку діалогу відкриття файлу на випадок, якщо вам буде потрібно відкрити його знову. Цей проект нам ще знадобиться, тому збережемо його. Назвемо модуль MYEDITU.PAS, а головний проект - MYEDIT.PRJ.

Діалог вибору шрифту.

Завантажте знову проект MyEdit і помістіть на форму компонент FontDialog. Перемістіть кнопку Exit вправо і вставте кнопку з заголовком & Font між кнопками Save As і Exit. У обробник події OnClick нової кнопки помістіть наступний код:

WITH FontDialog1 DO

IF Execute THEN

BEGIN

Memo1.Font: = Font;

Наступну рядок помістіть в обробник події OnApply компонента FontDialog:

Memo1.Font: = FontDialog1. Font;

Запустіть програму і завантажте файл. За допомогою кнопки Font виберіть який-небудь шрифт. Використовуючи всі можливості, створіть самий незвичайний варіант. Вміст файлу буде відображатися обраним вами шрифтом із застосуванням зазначеного розміру, стилю та кольору. Знову відкрийте діалог вибору шрифту і перемістіть його так, щоб він не закривав самого вікна редактора. Внесіть кілька змін у вікні діалогу і клацніть на кнопці Apply (Застосувати). Зміни стануть дійсними негайно, а діалог Font (Шрифт) не закриється. Це спрощує випробування різних можливостей. Зверніть увагу, що в цьому прикладі програми, після того як була використана кнопка Apply (Застосувати), ви ніяк не зможете скасувати внесені зміни. З іншого боку, це не така вже й велика біда - якщо не влаштовує тільки що обраний шрифт, можна повернути шрифт, що використовувався раніше.

Збережіть оновлений проект MyEdit, що володіє тепер можливістю змінювати шрифти.

Компонент Memo не має здатність відображати більше одного шрифту відразу. Для цього існують інші компоненти.

Додамо до своєї програми діалог вибору кольору.

1. Помістіть на нову форму діалог вибору кольору (компонент ColorDialog) і надайте його властивості Color значення clWhite.

2. Встановіть властивість Ctl3D форми в False, а в якості константи кольору також виберіть clWhite.

3. Помістіть на форму нову кнопку, назвіть її Color.

У обробник події OnClick форми помістіть наступні рядки:

IF ColorDialog1.Execute THEN

Form1.Color: = ColorDialog1.Color;

4. Запустіть програму.

Діалог вибору принтера.

Завантажте знову проект MyEdit і помістіть на нього діалог налаштування принтера компонент PrinterSetupDialog). Компонент Bevel розташуйте таким чином, щоб залишилося місце для другого ряду кнопок, де розмістіть дві нові кнопки, оза-аавленние & Print ... і P & rint Setup .... Створіть обробник події OnClick кнопки Print Setup з єдиною рядком коду:

PrinterSetupDialog1.Execute;

Запустіть програму і клацніть на кнопці Print Setup (кнопка Print поки ще робити нічого не може). З'явиться діалог.

Підготовка до друку.

Діалог Print Setup (Настройка принтера) використовується для вибору і конфігурації принтера. Коли справа дійде до друку, в дію вступить діалог Print (Друк).

У проект MyEdit додайте компонент PrintDialog, залишивши всі його властивості зі значеннями, встановленими за умовчанням. Двічі клацніть на кнопці Print, і замініть пару begin-end наступним кодом:

VAR

POutput: TextFile;

N: LongInt;

BEGIN

IF PrintDialog1.Execute THEN

BEGIN

AssingPrn (POutput);

Rewrite (POutput);

Printer.Canvas.Font: = Memo1.Font;

FOR N: = 0 to Memo1.Lines.Count - 1 DO

Writeln (POutput, Memo1.Lines [N]);

CloseFile (POutput);

END;

END;

Перейдіть у верхню частину модуля і додайте Printers в оператор uses. (Знайдіть рядок на початку файлу, що починається зі слова uses. Після цього слова додайте ім'я модуля і кому.) Виберіть на формі компонент FontDialog і надайте його властивості Device значення fdBoth, щоб обмежити вибір шрифтами, які годяться і для екрану, і для принтера.

Ми тільки що додали в ваш редактор можливість друку. Цей редактор не дозволяє друкувати кілька копій чи направляти їх в підбір, але ви зможете роздрукувати вміст редактора будь-яким шрифтом. А за допомогою діалогу Print Setup (Вибір принтера) ви зможете вибрати принтер, орієнтацію паперу та параметри конфігурації, що відповідають вашому принтера.

Діалог пошуку і заміни тексту.

Завантажте проект MyEdit і встановіть властивість HideSelection компонента Memo в False. На формі розмістіть компоненти FindDialog і ReplaceDialog і виберіть їх обидва. Двічі клацніть на властивості Options і встановіть frHideMatchCase, frHideWholeWord і frHideUpDown в True. Додайте в другий ряд кнопки з заголовками Fi & nd ... і & Replace ... Для події OnClick кнопки Find використовуйте наступний рядок:

FindDialogl.Execute;

а для кнопки Replace наступний рядок:

ReplaceDialogl.Execute;

Виберіть компонент FindDialog, перейдіть на сторінку Events і двічі клацніть на події OnFind. Вставлену Delphi пару begin-end замініть наступним блоком коду:

VAR

Buff, P, FT: Pchar;

BuffLen: Word;

begin

WITH Sender AS TFindDialog DO

BEGIN

GetMem (FT, Length (FindText) + 1);

StrPCopy (FT, FindText);

BuffLen: = Memo1.GetTextLen + 1;

GetMem (Buff, BuffLen);

Memo1.GetTextBuff (Buff, BuffLen);

P: = Buff + Memo1.SelStart + Memo1.SelLength;

P: = StrPos (P, FT);

IF P = NIL THEN MessageBeep (0)

ELSE

BEGIN

Memo1.SelStart: = P-Buff;

Memo1.SelLength: = Length (FindText);

END;

FreeMem (FT, Length (FindText) + 1;

FreeMem (Buff, BuffLen);

END;

end;

Коли закінчите, клацніть на компоненті ReplaceDialog, перейдіть на сторінку Events у вікні Object Inspector і клацніть на кнопці розкриття списку обробника події OnFind. З списку, що з'явився виберіть щойно створений обробник події для FindDialog. Тепер створіть обробник події OnReplace з наступними рядками:

WITH Sender AS TReplaceDialog DO

WHILE True DO

BEGIN

IF Memo1.SelText FindText THEN

FindDialodFind (Sender);

IF Memo1.SelLength = 0 THEN Break;

Memo1.SelText: = ReplaceText;

IF NOT (frReplaceAll IN Options) THEN Break;

END;

Збережіть програму, запустіть її і завантажте текстовий файл. Замініть у ньому всі крапки на знаки оклику і збережіть його.

Завдання. Створіть форму для відкриття графічних файлів.

Лабораторна по Delphi. Робота з базами даних.

Робота з Database Form Expert.

Delphi має потужний засіб створення таблиць шляхом внесення або ре дактірованія полеі на формі. Розглянемо простий приклад того, як побудувати додаток, використовуючи експерт форм бази даних. У цьому прикладі використаний один із зразків баз даних, включених в Delphi.

Використання експерта форм бази даних.

1. Запустіть Delphi.

2. Виберіть Database / Database Form Expert з головного меню.

3. У першому діалоговому вікні виберіть Create a simple form і Great a form using TTable objects; натисніть Next.

4. У наступному діалоговому вікні виберіть DBDEMOS в секції Drive or Alias. Виділення DBDEMOS виводить список таблиць, що складають базу даних, в панелі списку ліворуч.

5. Виберіть EMPLOYEE.DB; клацніть мишею на Next.

6. Натисніть кнопку>>, щоб вказати, що ви хотіли б побудувати форму з відображенням усіх полів.

7.Продолжайте вибирати Next, беручи все за умовчанням до закінчення процесу створення форми.

8.Виберіте з меню Run / Run.

Це просте застосування дає користувачеві повний контроль над таблицею, що містить інформацію про службовців. Щоб маніпулювати записами, вгорі форми розміщена панель керування базою даних. Кожна кнопка панелі виконує певну функцію бази даних.

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

Використання Database Desktop для створення нової таблиці

Створимо таблицю нового зразка. Borland Database Desktop доступна в меню Tools у IDE Delphi. Виберіть цю опцію для виклику робочого столу.

Створення нової таблиці

1. Виберіть опцію File / New / Table з головного меню. У цей момент з'явиться діалогове вікно, запитуючи тип таблиці, яку ви хочете створити. При розробці нових програм найбільш зручна простотою роботи з нею база даних Paradox; тому оберіть Paradox 7 і натисніть ОК.

2. Перш за все ви повинні вирішити, які дані ви хочете зберігати у вашій таблиці і який тип цих даних. У цьому прикладі розглянемо таблицю інформації про студентів університету. Кожне поле має бути занесено в розділ Field Roster (список полів) діалогового вікна. Щоб занести перше поле, введіть SSN у колонці імені поля (Field Name). Це означає, що ви хочете додати нове поле, назване SSN.

3. Наступна частина інформації вимагає вказівки, який тип даних буде зберігатися в полі. Номери Social Security (соціальної страховки) зберігаються як рядки символів. Клацніть правою кнопкою миші на полі Type, щоб показати наявні типи даних. Для рядків Paradox використовує тип Alpha. Виберіть Alpha зі списку типів даних.

4. Деякі типи даних вимагають вказівки розміру. Це говорить базі даних про найбільшому обсязі даних, який може зберігатися в полі. Що стосується номерів страховки, то нам відомо, що SSN складається з 11 символів, включаючи тире, так що введемо в це поле число 11. Деякі типи даних, такі як Number (число), не використовують поняття "розмір поля".

5. На закінчення потрібно повідомити базі даних, чи є поле ключем, чи ні. Ключ означає, що за кожним записом закріплено унікальне значення. Використання ключів в базах даних надзвичайно важливо. Помітимо полі SSN як ключ, тому що ви знаєте, що кожному студенту буде відповідати один-єдиний запис і кожен студент має унікальний номер страховки.

6. Щоб визначити наступне поле в таблиці, натисніть Enter. Продовжуйте визначати поля, використовуючи інформацію з таблиці

Таблиця. Визначення полів таблиці і їх атрибутів

Ім'я поля Тип Розмір Ключ

SSN А 11 *

Name А 30

Class A 10

Phone A 8

GPA N

7. Клацніть на кнопці Save As, щоб зберегти інформацію про таблицю.

8. У діалозі Save Table as вкажіть у вікні списку Drive (or alias) ім'я DBDEMOS. Введіть studinfo.db в текстовому вікні New file name і для збереження таблиці клацніть на ОК.

Як з Delphi отримати доступ до створеної таблиці?

Найпростіший спосіб створення додатка, що має доступ до таблиці в Delphi: це Form Expert. Тепер розглянемо, які кроки необхідно зробити для побудови програми на порожньому місці. Найпростішим способом забезпечення доступу і маніпуляції даними є використання візуальних компонентів бази даних. Візуальні компоненти бази даних зберігаються на двох сторінках бібліотек візуальних компонентів: Data Access і Data Control. Органи управління у сторінці Data Access використовуються для того, щоб дати Delphi інформацію про таблиці бази даних та функціях, які повинні бути використані, тоді як сторінка Data Control містить ряд візуальних компонентів, які можуть відображати інформацію бази даних або забезпечувати інтерфейс для маніпуляцій даними (таких , як вставка, видалення і модифікація).

Як надати Delphi відомості про таблиці - компонент ТТаИе

Щоб використовувати таблицю, потрібно в якості першого кроку дати знати Delphi, що ви маєте намір взаємодіяти з таблицею. Щоб зробити це, потрібно помістити на форму об'єкт Table, якому доступні табличні дані. Перевірка списку властивостей показує, що там є властивість, зване DataBaseName і TableName. Це два мінімальних властивості, які потрібно встановити для того, щоб таблиця була доступна Delphi. Властивість DataBaseName відповідає наявним псевдонімом бази даних. TableName описує таблиці в базі даних, які повинні побут використані.

Забезпечення доступу до таблиці з інформацією про студентів

Першим кроком у створенні програми, що забезпечує доступ до бази даних з інформацією про студентів, яку ви створили раніше, має бути розміщення компонента ТТаИе на вашій формі та конфігурування властивостей DataBaseName і TableName.

1. Створіть новий додаток.

2. Помістіть на форму компонент ТТаИе. Компонент TTable може бути знайдений на сторінці DataAccess бібліотеки візуальних компонентів.

3. У списку властивостей встановіть DatabaseName як DBDEMOS. DBDEMOS - це псевдонім бази, в якій буде зберігатися таблиця STUDINFO.DB.

4. Після установки властивості DatabaseName властивість TableName має показати вікно списку з переліком всіх таблиць, які є в наявності в базі даних. Виберіть STUDINFO.DB як ім'я бази даних.

5. Встановіть значення властивості Active рівним true. Це негайно від-, вають таблицю під час запуску програми. Якщо встановити значення false, додаток не буде мати доступу до жодних даними в таблиці до тих пір, поки властивість не стане рівним true під час виконання.

6. Встановіть властивість Name рівним Studinfo.

Під час виконання можна модифікувати два інших властивості - Readonly і Exclusive. Установка значення властивості Readonly рівним true дозволяє додатку тільки переглядати дані в базі даних без можливості їх модифікації. Опція Exclusive дозволяє доступ до даних тільки цьому додатку. Тепер у програми є вся інформація, яка необхідна для підключення до таблиці. Однак немає ніякого способу маніпуляції даними таблиці до тих пір, поки об'єкт таблиці не буде пов'язаний з об'єктом DataSourse.

Забезпечення зв'язку - компонент TDataSourse

Delphi має можливість доступу до інформації в базі даних, яка доставляється поруч компонентів, відомих як набори даних (DataSets), одним з яких є компонент TTable. Прив'язані до даних ком-оненти (data-aware) - це органи управління, які відображають і маніпулюють тими даними, які доступні Delphi. Щоб забезпечити рівень абстракції для органів управління, які можуть переміщатися за даними і відображати інформацію, був розроблений TDataSource. TDataSource також дозволяє дізнатися, змінювалися чи є дані, і визначити, який стан набору або джерела даних.

Додавання DataSource

1. Виберіть DataSource і додайте його на форму.

2. Встановіть властивість DataSet рівним Studinfo. Це зв'яже джерело даних з компонентом TTable з ім'ям Studinfo, який у свою чергу отримує доступ до таблиці STUDINFO.DB в базі даних DBDEMOS.

3. Встановіть ім'я для DataSource як dsStudent.

Органи управління, прив'язані до даних - перегляд і модифікація даних

Отже, ви організували все необхідне для зв'язку з таблицею. Однак тепер треба вирішити, як дані повинні бути відображені, і як ними маніпулювати. Найпростіше це можна зробити за допомогою органів управління, прив'язаних до даних (їх називають data-aware або data-bound). Більшість засобів управління з прив'язкою до даних призначено для зв'язку полів бази даних з візуальним компонентом. Стандартні прив'язані компоненти досить потужні, прості у використанні, і Delphi має великий набір цих компонентів. За винятком DBNavigator, всі компоненти на сторінці Data Control використовуються для відображення інформації баз даних. Щоб почати працювати з ними, додайте до вашого прикладу сітку DBGrid.

Додавання прив'язаною до даних сітки DBGrid

1. Помістіть компонент DBGrid на вашу форму. Це перший з розміщених вами на формі компонентів, який бачимо під час виконання; змініть його розмір так, щоб він зайняв більшу частину форми.

2. Встановіть властивість DataSource рівним dsStudent; це зв'яже сітку з джерелом даних.

3. Що при цьому відбувається? Як тільки було встановлено властивість Data-Source, на сітці автоматично стали з'являтися імена полів. Якщо в таблиці STUDINFO.DB були дані, то вони повинні були б відображатися навіть під час проектування. Однак якщо значення властивості Active було встановлене на рівні False, то нічого не можна побачити до тих пір, поки воно не стане рівним True.

4. Запустіть програму. З цього моменту дані дійсно можуть бути введені в сітку. Надрукуйте номер SSN, натисніть кнопку Tab, надрукуйте ім'я. Продовжуйте натискати TAB до тих пір, поки не заповните всі поля. По завершенні першого запису компонент DBGrid автоматично зрушить курсор на наступний рядок. Продовжуйте додавання декількох простих записів в таблицю. Зверніть увагу, що якщо введені два записи з однаковим SSN, відбудеться помилка.

5. Завершіть програму та додайте ще один орган управління - компонент DBEdit. Він відображає одне поле таблиці. . На відміну від сітки, яка може відображати кілька записів, DBEdit відображає поле поточного запису. Поточний запис - це просто запис, до якої в даний момент має доступ машина бази даних. DBGrid вказує поточний запис, відображаючи поруч з нею трикутний значок.

6. Додайте DBEdit на форму і встановіть властивість DataSource рівним dsStudent. Тепер потрібно вказати поле, щоб компонент знав, що відображати. Щоб встановити поле, встановіть властивість DataField рівним SSN.

7. Запустіть програму.

Зверніть увагу, що якщо ви переходите до іншого запису (клацанням на ній у сітці), покажчик поточного запису переміщається. Ця програма надає користувачеві певні можливості управління, але для великих баз даних це неприйнятно. Delphi має потужний засіб управління, яке дозволяє переміщатися між об'єктами в таблиці: DBNavigator. DBNavigator - це панель, яка дозволяє легко пересуватися між таблицями.

Додавання DBNavigator.

Виберіть DBNavigator і помістіть його на форму. Встановіть властивість DataSource рівним dsStudent.

Встановіть властивість ShowHint рівним True. Це викличе появу підказки щоразу, коли курсор миші буде затримуватися над кнопкою панелі.

Запустіть програму. Зверніть увагу, як просто переміщатися між записами, стрибати до початку або кінця бази даних і редагувати записи.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
66.1кб. | скачати


Схожі роботи:
Програмування в Delphi
Програмування в Delphi
Середовище програмування DELPHI 2 0 2
Середовище програмування Delphi
Середовище програмування DELPHI 2 0
Середовище програмування DELPHI 20
Програмування для Word з Delphi
Середовище програмування Borland Delphi
Основи програмування в середовищі Delphi 70
© Усі права захищені
написати до нас