Тестування компонента AngleText (повернений текст) в CBuilder

Наступний логічний крок після написання компонента це його тестування Тестування синсталлірованного компонента вельми просто – ви просто кладете його на форму і встановлюєте ті властивості, за змінами яких хочете поспостерігати Так само просто тестуються таким способом і методи компонента Вся проблема цього способу полягає в втрачений час Якщо вам за результатами тесту треба внести зміну, для цього треба змінити компонент, скомпілювати і синсталліровать його, що забирає дуже багато часу на кожен тест Отже, було б куди краще протестувати компонент до інсталяції

Завдяки деяким речам, про які ви вже дізналися з цієї книги, ми можемо це зробити

Як ви дізналися з глави про використання VCL, компоненти можуть створюватися програмістом динамічно під час виконання Ми можемо скористатися цим для тестування візуального представлення компонента – Того, з чим виникає, зазвичай, велика частина проблем Наступний рівень тестування буде необхідний для синсталлірованного компонента, оскільки його інтерфейс з Object Inspector варто перевірити

Для тестування нашого компонента ми будемо використовувати форму, показану на рис 142 Як ви бачите, форма складається з рамки малювання (paintbox) і двох кнопок Кнопку використовуються для збільшення (>) І зменшення (<) кута в керуючому елементі AngleText, який ми збираємося розташувати на формі.

Рис 142 Форма для тестування компонента AngleText

Додайте у форму обробник події Create, а в нього додайте нижченаведений код Це призведе до створення нового екземпляра компонента на просторі, зайнятому рамкою малювання Так можна зробити, тому що рамка малювання не має власного вікна, і, отже, вона просто зарезервує місце для компонента, який ми збираємося туди помістити:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

pAngleText = new TAngleText(this) pAngleText-&gtParent = this pAngleText-&gtTop = PaintBox1-&gtTop pAngleText-&gtLeft = PaintBox1-&gtLeft

pAngleText-&gtWidth = PaintBox1-&gtWidth

pAngleText-&gtHeight = PaintBox1-&gtHeight pAngleText-&gtAngle = 0

pAngleText-> Font = Font pAngleText-> Color = Color pAngleText-> Text = Проба пера;

}

Як можна бачити, ми встановлюємо значення властивостей, які задають позицію і кут так само, як і Text, Color і Font Перед тим як рухатися далі повинен звернути вашу увагу на одну деталь, про яку я не згадав раніше, і яка спливла тільки зараз Властивість форми Font повинно бути вибрано і встановлено в один з шрифтів TrueType (шрифти, перед назвами яких стоїть здвоєна буква T), оскільки тільки ці шрифти можуть бути

повернені

Після того, як все встановлено, при запуску форми в поле рамки малювання повинна зявитися наша рядок тексту («Проба пера») Для того, щоб мати можливість змінювати кут, додайте два обробника – для кнопок збільшення та зменшення кута Оброблювачу кнопки збільшення кута (>) повинен відповідати наступний код:

void __fastcall TForm1::IncrementClick(TObject *Sender)

{

/ / Збільшення на 10 градусів

pAngleText-&gtAngle += 100

}

Як ви можете бачити, оскільки властивість Angle розцінюється як змінна-член класу, для її зміни можна застосовувати навіть оператор + = Інша частина методу не представляє особливого інтересу – у ній просто додається 10 градусів до поточного значення кута Точно так само, з кнопкою зменшення кута (<) повинен бути пов'язаний метод DecrementClick, що виглядає наступним чином:

void __fastcall TForm1::DecrementClick(TObject *Sender)

{

/ / Зменшення на 10 градусів

pAngleText-&gtAngle += 100

}

Останнім кроком написання тесту буде додавання екземпляра класу TAngleText в заголовний файл форми Додайте заголовний файл для TAngleText в заголовний файл форми, відкривши останній (клацнувши правою кнопкою миші і вибравши Open Source / Header File виберіть у спливаючому меню) і потім вибравши в основному меню пункт File | Include Unit Hdr Виберіть зі списку модуль TAngleText, а потім додайте наступну рядок в розділ приватних оголошень заголовного файлу форми:

private: // User declarations TAngleText *pAngleText

Скомпілюйте і запустіть додаток, і ви побачите компонент AngleText, відображений в центрі форми, приблизно як показано на рис 143

Рис 143 Компонент AngleText під час виконання тесту

Тепер можна починати тестування Натисніть кнопку збільшення кута Як бачите .. нічого не відбулося Чому Тут криється наша перша помилка Намагаючись знайти джерело проблеми ми виявимо, що властивість Angle нашого компонента дійсно змінюється (це можна побачити в відладчик), але керуючий елемент на змінює положення тексту Чому Хороший спосіб щось зрозуміти в даній ситуації – це мінімізувати вікно форми, а потім повернути його в нормальний розмір Текст раптово повернеться Отже, проблема криється в тому, що компонент не перемальовується належним чином Власне кажучи, в даному випадку проблема в тому, що він взагалі ніяк не перемальовується

Можна запропонувати два рішення цієї проблеми По-перше, ми можемо змусити користувача перемальовувати компонент при натисканні кнопки Це призведе до появи усюди в коді користувача наступних рядків:

pAngleText-&gtAngle += 100 pAngleText-&gtRepaint()

Подібний код швидко набридне користувачеві Чому він повинен сам хвилюватися про те, щоб відобразити компонент заново Це проблема розробника компонента, а зовсім не кінцевого користувача Всі візуальні аспекти компонента повинні лежати всередині нього

Для того, щоб впоратися з цією проблемою самостійно, нам треба знати, коли змінюється кут, і при його зміні перемальовувати компонент Метод Write властивостей компонента викликається, коли користувач намагається змінити цю властивість Ми можемо змінити компонент так, щоб він сам перемальовував себе, коли властивість Angle компонента змінюється Змініть заголовний файл компонента TAngleText наступним чином:

class TAngleText : public TCustomControl

{

private:

double FAngle int FXPos

int FYPos protected:

virtual void __fastcall Paint(void)

virtual void __fastcall SetXPos(int XPos ) virtual void __fastcall SetYPos(int YPos )  virtual void __fastcall SetAngle(double Angle ) public

    fastcall TAngleText(TComponent* Owner)

__published:

__property double Angle={read=FAngle, write=SetAngle}

__property int XPos={read=FXPos, write=SetXPos}

__property int YPos={read=FYPos, write=SetYPos}

__property Text

__property Font

__property Color

}

А тепер додайте код і в вихідний файл компонента: void __ fastcall TAngleText :: SetAngle (double Angle)

{

if ( Angle = FAngle )

{

FAngle = Angle Repaint()

}

}

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

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

Рис 144 Коректно працюючий компонент AngleText

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*