Використання функцій Delphi в додатках CBuilder

Якщо ви можете використовувати форму Delphi в додатку, то чому б не спробувати використовувати модуль Delphi без форми, асоційованої з ним Як було б здорово використовувати всі реалізовані раніше в Delphi можливості при написанні коду на C + + На щастя, це можливо

Хочу запропонувати вам хороший приклад, що підтверджує мої слова Коли я приступав до написання цієї книги, я вирішив, що відмінним прикладом можливостей CBuilder може послужити код, що відображає на екрані текст, повернений на певний кут Витончено виглядає, ще витонченіше пишеться Коротше кажучи, ідеальний приклад Поширив по найдальших закутках свого жорсткого диска, я таки знайшов код, який робив якраз те, що треба – повертав текст при виведенні на екран під певним кутом Я давно вже забув, де і для чого я його використовував, але головне – він був, і він працював Це все плоди моєї ідеї про сховище коду Але опустимо це зараз, повернемося до коду Отже, я розкопав його тільки для того, щоб переконатися, що він, звичайно ж, для Delphi Трохи нижче в книзі, коли ми будемо говорити про роботу з компонентами, ви побачите, як я перевів його на C + + А зараз це стане приголомшливим прикладом використання коду Delphi в CBuilder

Код реалізований у вигляді модуля Delphi Це «самодостатній» модуль, тобто в ньому міститься і опис (interface) функцій, і самі функції На відміну від мови C + +, в якому є окремий заголовний файл для опису і початковий (source) файл для реалізації, Object Pascal використовує один модуль для того й іншого Це простіше в експлуатації, але погано вяжеться з C + + Чи все-таки .? Давайте подивимося

Рис 113 Форма прикладу повороту тексту

Створіть форму CBuilder Додайте на неї напис, поле редагування і кнопку, так, як показано на рис 113 Простір в центрі поля форми буде використано для відображення повернутого тексту Одне зауваження з приводу цієї форми: для того щоб все працювало як треба, вам необхідно встановити один з шрифтів типу True Type Якщо ви виберете властивість font (шрифт) і в його поле в

Object Inspector клацнете по кнопці .., То побачите список шрифтів, відображений ний в лівій частині Object Inspector У цьому списку представлені всі шрифти, які можуть бути обрані в системі Нам потрібен один з тих шрифтів, перед назвою якого в списку стоять дві перекриваються літери T (TT – True Type) Шрифти True Type масштабуються, і їх можна повернути при відображенні на екран Звичайні, символьні шрифти не можуть бути повернені, і з ними цей приклад працювати не буде

Після того як форма створена, треба створити модуль Delphi для подальшого додавання в проект Ви можете за бажанням або набрати код модуля руками, або скористатися кодом, що зберігаються на прикладеному компакт-диску, – кому що більше подобається Якщо вам більше подобається власноруч набити його, створіть новий текстовий файл у вікні редактора системи і додайте в нього наступні рядки:

unit Rotate interface Uses

Graphics, WinTypes, WinProcs

procedure AngleTextOut(C : TCanvas Angle,X,Y :Integer Str :String) implementation

procedure AngleTextOut(C : TCanvas Angle,X,Y :Integer Str :String) var

LogRec TLOGFONT

OldFontHandle, NewFontHandle HFONT begin

GetObject(CFontHandle, SizeOf( LogRec ), Addr( LogRec )) LogReclfEscapement := Angle * 10

NewFontHandle := CreateFontIndirect( LogRec ) OldFontHandle := SelectObject(CHandle, NewFontHandle) CTextOut(X, Y, Str)

NewFontHandle  := SelectObject(CHandle,OldFontHandle) DeleteObject( NewFontHandle )

end

Збережіть цей модуль під імям rotatepas Цей модуль здатний здійснити всю роботу, необхідну для повороту тексту в поле форми Він відображає текст шляхом тимчасового створення нового шрифту, вибором цього шрифту в контекст пристрою (device context) форми і безпосередньо отрісовиванія тексту, після чого позбавляється від старого шрифту Програма не занадто складна, але цілком відповідає своєму призначенню

Для того щоб використовувати нову форму, вам треба включити новий модуль в модуль форми Відкрийте код модуля форми і виберіть у головному меню команду File д Include Unit Hdr Виберіть модуль Rotate і натисніть кнопку OK При цьому автоматично згенерує новий заголовний файл для коду модуля rotatepas формату C + + Якщо ви тепер поглянете в каталог проекту, то побачите там файл rotatehpp, який містить всі описи і функції, що знаходяться у файлі rotatepas, перекладені на C + + Ось як цей файл виглядає:

//———————————————————-

// Rotatehpp – bcbdcc32 generated hdr (DO NOT EDIT) rev: 0

// From: Rotatepas

//———————————————————-

#ifndef RotateHPP

#define RotateHPP

//———————————————————-

#include &ltWindowshpp&gt

#include &ltGraphicshpp&gt

#include &ltSystemhpp&gt namespace Rotate

{

//–type  declarations—————————————-

//–var, const, procedure————————————  extern void __fastcall AngleTextOut(Graphics::Tcanvas* C, int Angle, int X, int Y, System::AnsiString Str)

namespace Rotate

{

//–type  declarations————————————————

//–var,  const,  procedure——————————————–

extern void __fastcall AngleTextOut(Graphics::Tcanvas* C, int Angle, int X, int Y, System::AnsiString Str)

namespace Rotate

{

//–type  declarations————————————————

//–var,  const,  procedure——————————————–

extern void __fastcall AngleTextOut(Graphics::Tcanvas* C, int Angle, int X, int Y, System::AnsiString Str)

} /* namespace Rotate */

#if  defined(NO_IMPLICIT_NAMESPACE_USE) using Namespace Rotate

#endif

//– end unit ——————————————————-

#endif // Rotate

Не варто намагатися змінити цей файл, про що попереджає і коментар на початку файлу Якщо ви все ж спробуєте його змінити, то CBuilder автоматично перепише його, коли файл rotatepas компілюватиметься наступного разу, і ваші зміни, швидше за все, вступлять в протиріччя з вмістом самого модуля Rotate Отже, якщо ви зміните цей файл, то в

кращому випадку програма не скомпіліруется, а в гіршому – зависне під час роботи

Зверніть увагу, що CBuilder автоматично генерує іменовану область видимості (namespace), всередину якої укладає всі функції і визначення модулів, а також додає пропозицію using в заголовний файл Як ми вже говорили раніше на сторінках цієї книги, це не найкращий спосіб роботи з іменованими областями видимості, але він дозволяє нам викликати в нашому коді функції напряму, не хвилюючись про те, в якій області вона знаходиться І, що навіть більш важливо, це дає можливість підключати кілька модулів, не піклуючись про те, до якого з них належить та чи інша функція або обєкт

Якщо в підключеному модулі виявився обєкт Pascal, то, як неважко переконатися, в сгенерированном заголовному файлі буде повний переклад цього обєкта як класу C + + CBuilder практично повністю сумісний з усіма типами, використовуваними в Object Pascal

Останнє, на що варто звернути увагу в перетворенні, – це на останній параметр функції У модулі Pascal параметр Str має тип String Цей тип – реалізований у Pascal генеральний тип String Однак у CBuilder немає класу String, Який би безпосередньо був повязаний з цим типом Замість цього параметр сприймається як тип AnsiString, Який еквівалентний типу String в Delphi

Окрім іншого, для виклику функції нам потрібні рядок тексту і значення кута повороту Рядок ми будемо використовувати, заздалегідь задану в коді програми, а кут повороту дозволимо користувачеві вводити в поле редагування на формі Для завершення прикладу нам залишилося додати обробник для кнопки Відобразити текст Додайте обробник для неї, а в нього додайте наступні рядки:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Canvas-&gtBrush-&gtColor = Color

AngleTextOut (Canvas, atoi (Edit1-> Textc_str ()), Width / 2, Height / 2, повернути текст)

}

Колір фону тексту ми зробили таким же, як колір форми, щоб текст не виглядав крикливою, криво наліплені етикеткою Після цього ми встановлюємо початкову точку тексту в центр форми, поділивши навпіл параметри Height (висота) і Width (ширина) Від користувача ми отримуємо значення кута повороту, задане їм у поле редагування форми Кут являє собою число (градуси) від 0 (відповідного нормальному, горизонтальному розташуванню тексту) до 360 Тепер, після того як весь код набрано, давайте підемо далі і скомпілюємо і зберемо наш додаток в CBuilder При цьому автоматично скомпілюйте модуль Pascal і модуль форми C + +, після чого вони будуть зібрані воєдино

Відзначте, що компілятор Pascal автоматично запускається для модулів з розширенням Pas

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

Рис 114 Програма повороту тексту в дії

Незважаючи на те що цей приклад не була надто складним, у ньому показано все, що вам треба знати про використання модулів Pascal в CBuilder Якщо модуль компілюється в Delphi, він, швидше за все, буде компілюватися і в CBuilder Обмеження існують тільки для версії CBuilder 10 У додатках, написаних на Delphi 30, не можна використовувати ніяких нових компонентів VCL для форм, які експортуватимуться в CBuilder 10 Точно так само не можна використовувати і функції Delphi 30, яких немає у версії Delphi 20 CBuilder 10 сумісний з Delphi 20 і майже сумісний з Delphi 30, хоча, звичайно, між ними й існують відмінності Відносно CBuilder 30 подібних обмежень не виявлено

Коли я працював над створенням форм в Delphi 30 для подальшого використання в CBuilder, то зясував, що зазвичай практично всі перекладається правильно Використання будь-якого з нових компонентів (наприклад, таких як TCoolBar) В Delphi 30 тягне за собою неможливість використання цієї форми в CBuilder 10 Версія CBuilder 30 повністю сумісна з Delphi 30 До середини 1998 року фірма Borland привела у відповідність один одному два своїх головних програмних продукту, так щоб всі наступні їх версії були повністю сумісні

Ви можете поцікавитися, а чи немає можливості (при тому, що CBuilder може використовувати форми Delphi 30) використовувати форми CBuilder в Delphi 30 Як не дивно, немає Delphi 30 поставляється без компілятора C + +, в той час як CBuilder включає в себе повний компілятор Pascal Так що форми CBuilder використовувати в Delphi 30 можна

Джерело: Теллес М – 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>

*

*