Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_самостійне_опрацюв.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.22 Mб
Скачать

2. Клас tСustomControl.

Клас TcustomControl призначений для створення на його основі нестандартних віконних елементів управління. Процес візуалізації в ньому спрощений за рахунок використовування спеціального класу Tcanvas, що інкапсулює канву.

Доступ до канви здійснюється через властивість

property Canvas: Tcanvas;

Малювання елемента управління здійснюється методом

procedure PaintWindowfDC: HDC); override;

після отримання повідомлення WM PAINT.

Можливості цього класу успадковували класи TPanel, TGroupBox, TStringGrid і т. д.

3. Клас tGraphicControl.

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

Наочний приклад елемента управління, якому не потрібно одержувати фокус, – це компонент TLabel, призначений для відображення тексту, або компонент Timage, призначений для візуалізації зображень.

Для візуалізації елементів управління на основі цього класу використовується канва, інкапсульована в класі TCanvas.

Доступ до канви здійснюється через властивість

property Canvas: TCanvas;

Малювання елемента управління здійснюється методом

procedure PaintWindow(DC: HDC); override;

після отримання повідомлення WM PAINT.

Питання для самоконтролю:

  1. Скільки класів лежить в основі різноманіття всіх класів?

  2. Який клас лежить в основі ієрархії класів?

  3. Яке призначення класу TWinControl?

  4. Що забезпечує клас TCustomControl?

  5. Який метод викликається при створенні віконного елемента управління?

  6. Якою властивістю визначається зовнішній вигляд віконного елемента?

  7. Як здійснюється доступ да канви?

  8. Яким методом здійснюється малювання елемента управління?

Тема 1.4. Обробка виняткових ситуацій.

    1. Використовування виняткових ситуацій.

    2. Протоколювання виняткових ситуацій

    3. Коди помилок у виняткових ситуаціях

    4. Виняткова ситуація EAbort. Функція Assert.

1. Використовування виняткових ситуацій.

Якщо відбулася помилка і збуджена виняткова ситуація, то вона буде оброблятися по такому алгоритму:

1. Якщо ситуація виникла усередині блоку try..except, то там вона і буде оброблена. Якщо ІС "просунута" далі за допомогою оператора raise, а також якщо вона виникла в блоці try..finally, обробка продовжується.

2. Якщо програмістом визначений обробник події Application.onException, то він отримає управління. Обробник оголошений таким чином:

TExceptionEvent = procedure (Sender: TObject; E: Exception) object;

3. Якщо програміст ніяк не визначив реакцію на ІС, то буде викликаний стандартний метод showException, який повідомить про клас і місце виникнення виняткової ситуації.

Пункти 2 і 3 реалізуються в методі TApplication.HandleException. Власне, виглядають вони наступним чином:

if not (ExceptObject is EAbort) then

if Assigned(FOnException) then

FOnException(Sender, Exception(ExceptObject))

else

ShowExceptior. (Exception(ExceptObject));

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

program Project1;

uses

Forms

SysUtils //додано уручну – там описаний клас Exception Dialogs

Unitl in 'Unitl.pas' {Forml};

{$R *.RES}

type

TExceptClass = class

public

procedure GlobalExceptionHandler(Sender: TObject; E:Exception);

end;

procedure TExceptClass.GlobalExceptionHandler(Sender: TObject;

E:Exception);

begin

ShowMessage('Відбулася виняткова ситуація ' + E.ClassName

+ ': ' + E.Message + #13#10'З’єднайтесь з розробниками по тел. 222-33-44');

end;

begin

with TExceptClass.Create do

begin

Application.OnException := GlobalExceptionHandler;

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

Free;

end;

end.

Тут клас TExceptClass створюється тільки для того, щоб бути носієм методу ClobalException. Обробник будь-якої події – метод, і він повинен відноситися до якого-небудь об'єкту. Оскільки він тут потрібен ще до ініціалізації форм додатку і інших його складових частин, то і об'єкт класу TExceptClass створюється першим. Тепер користувач знає, що дякувати за несподіванки потрібно по вказаному в повідомленні про помилку телефону розробників.

Є і більш простий спосіб привласнити обробник події Application.OnException. Для цього помістите на форму компонент типу TApplicationEvents (сторінка Additional Палітри компонентів), роль якого - надання "візуального" доступу до властивостей невізуального об'єкту TApplication. Серед його подій є і OnException.

Але як "помацати" переданий при винятковій ситуації об'єкт? Звичайна конструкція on EExceptionType do... указує на клас об'єкту, але не на конкретний екземпляр. Якщо під час обробки потрібний доступ до властивостей цього екземпляра, його потрібно пойменувати усередині on..do, вказавши перед ім'ям класу якийсь ідентифікатор:

on EZD: EZeroDivide do EZD.Message := 'Ділення на нуль!';

Тут виникле виключення виступає під ім'ям EZD. Можна змінити його властивості і відправити далі:

var APtr : Pointer;

Forml : TForm;

try

APtr := Forml;

with TObject(APtr) as TBitmap do;

except

on EZD: EInvalidCast do EZD.Message :=. EZD.Message + 'хa-хa!';

Raise;{ тепер обробка буде зроблена у іншому місці }

end;

Але як пойменувати виняткову ситуацію, що не потрапила ні в одну з директив on..do? Або, можливо, у вашому обробнику взагалі немає on. .do, а попрацювати з об'єктом треба? Описаний вище шлях тут не підходить. Для цих випадків є пара системних функцій ExceptObject і ExceptAddr. На жаль, ці функції ініціалізувалися тільки усередині конструкції try..except; в try..finally працювати з об’єктом – винятковою ситуацією не представляється можливим.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]