Загальні питання програмування CBuilder (FAQ)

Що таке «Compiler Error # 1» і як мені від неї позбутися

Помилка компілятора № 1 (Compiler Error # 1) може бути викликана різними причинами Як правило, ви зможете позбутися від неї, закривши CBuilder, а потім запустивши знову і завантаживши свій проект за допомогою команди File ä Reopen Якщо це не допоможе, вам доведеться розібратися в тому, що ж відбувається насправді Перейдіть у вікно DOS, запустіть програму make, задавши їй як параметр make-файл вашого проекту вивчіть видаються помилки і виправте їх

AnsiString – це Delphi-сумісні рядка, використовувані в CBuilder Якщо у вас є можливість вибору, використовуйте краще AnsiString, а не рядки STL і масиви символів Завдяки наявності великої кількості вельми гідно оформлених методів використовувати їх простіше, ніж просто рядки або char *

Наприклад, замість того, щоб використовувати чреваті помилками методи типу strcat і strcpy, ви

можете використовувати методи AnsiString, відповідно + = і =, як це показано в наступному фрагменті коду:

/ / Якщо вам не зробити по іншому

char szBuffer[20]

strcpy ( szBuffer, &quotThis is a good test&quot) strcat ( szBuffer, &quot and so is this&quot)

/ / А краще зробити так

AnsiString strBuffer

strBuffer = &quotThis is a good test" strBuffer += &quot and so is this"

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

Що ж стосується другої частини питання, то для перетворення AnsiString в char * вам треба використовувати метод AnsiString c_str Наприклад:

void func (char * strBuffer) / / Прототип якоїсь функції

AnsiString s = &quotThis is a good test" func(sc_str())

Для додавання елемента в безліч, наприклад, у властивість FontStyle використовується оператор <<. Для додавання елемента «напівжирний» (bold) в об'єкт-стиль шрифту треба написати наступний рядок:

pMyFont-&gtStyle &lt&lt fsBold

Що означає помилка «Member function must be called ..»

Помилка «Member function must be called ..» («Повинна викликатися функція класу ..») трапляється досить часто у програмістів, які звикли програмувати мовою Pascal, і, перемикаючись на C + +, забувають про дужках Як правило, ця помилка означає, що якщо, наприклад, у вас є клас Foo, у якого є метод Bar, то ви пишіть:

Foo f fBar

Насправді ви повинні написати:

Foo f fBar()

У мові Pascal ви можете викликати функцію або метод, що не мають аргументів, не використовуючи дужки, а в C + + наявність дужок у викликах функцій строго обовязково За наявністю дужок компілятор визначає, що ви намагаєтеся викликати функцію, а не передати чого-небудь адресу функції класу Наприклад:

void func(int x) func(fBar)

кардинально відрізняється від:

func(fBar)

У першому прикладі результат виклику методу Bar передається в функцію У другому ж – адреса функції класу Bar передається у функцію func як аргумент Це і викликає помилку компілятора

Помилка «Structure required» («Требуется структура») означає, що ви намагаєтеся викликати щось використовуючи точку () Замість стрілки (->) Коли ви використовуєте покажчик на структуру або обєкт, використовуйте стрілку Якщо ви маєте справу з реальним обєктом або посиланням на обєкт, використовуйте крапку Наприклад:

Foo *pFoo

pFoo-> Bar () / / ОК

pFooBar () / / Помилка: потрібна стрілка У цьому випадку і

/ / Генерується помилка, про яку ми говоримо

Foo foo

foo-> Bar () / / Помилка: потрібна точка

fooBar () / / ОК

Знову ж, до виникнення цієї помилки може привести безліч причин Наприклад недолік місця на диску або порушення набору файлів покрокового линкера (incremental linker) Для того, щоб перебороти цю проблему, закрийте CBuilder і видаліть з директорії з вашим проектом всі файли з розширенням IL. Крім того, в деяких випадках може допомогти виконання команди Build All (зібрати все)

Виберіть пункт Add To Project (додавання в проект) і додайте RC або RES файл, що містить ресурс, з яким ви хочете працювати у вашому проекті CBuilder автоматично розпізнає ці файли і запускає компілятор ресурсів для файлу RC, а також вбудовує RES файл в ресурси проекту Ви також можете використовувати макроси USERC і USERES у вашому файлі проекту:

USERES(&quotmyresourcesres&quot) USERC(&quotmyresourcesrc&quot)

Ні На даний момент VCL може бути тільки статично довантажуючи в програму, фірма Borland клятвено обіцяла, що в наступних версіях CBuilder VCL можна буде довантажувати динамічно

Ви повинні збирати програму, використовуючи отладочную версію VCL У використанні вихідного коду VCL є три стадії По-перше, вам треба включити інформацію відладчика, з тим щоб ви могли використовувати його У головному меню виберіть пункт Options ä Environment і клацніть на

закладці Library Клацніть на кнопці Build with debug info (збирати з інформацією відладчика) Далі вам треба приєднати версію VCL, призначену для налагодження На тій же самій сторінці сторінкового діалогу встановіть прапорець Link with debug VCL (лінковані з отладочной версією VCL) І, нарешті, вам треба повідомити отладчику, де знаходиться вихідний код VCL Все в тому ж сторінковому діалозі клацніть на закладці Preferences і введіть шлях до вихідного коду в поле Path for Source (шлях до вихідного коду) Розділяйте кожен шлях крапкою з комою ()

Є кілька способів для прискорення налагодження Найдієвіший, звичайно, це додати оперативної памяті у ваш компютер У вас не вийде скільки-небудь серйозної роботи з ОЗУ менше 32 Мбайт Є і інші способи Приберіть всі невживані або непотрібні змінні з вікна перегляду Чим менше речей система повинна відстежувати, тим швидше вона працює На час налагодження закрийте вікно Object Inspector Воно оновлюється при кожному кроці, так що це дозволить вам трохи прискорити процес

Швидше за все, з компілятором все гаразд Спробуйте виконати в CBuilder наступний код: int func ()

{

int x = 2 int y = 3

MessageBox (NULL, Добралися до функції”, Info, MB_OK)

}

У свій додаток вставте виклик функції func і пройдіться по ній по кроках за допомогою відладчика Погляньте на значення змінних x і y у вікні перегляду Швидше за все, вони будуть рівні 0 Помилка компілятора Ні Компілятор побачив, що ви їх ніколи не використовуєте, і тому не розглядає їх Отладчик знає про їх існування (оскільки вони все-таки є в коді), але також знає і те, що у них немає значень В результаті ви бачите 0 Якщо ви не використовуєте змінні, вони не будуть мати значний при налагодженні Якщо ви дійсно хочете знати їх значення, спробуйте наступне:

int func(void)

{

int x = 2 int y = 3

AnsiString strTemp = &quot X = &quot + AnsiString(x) +  &quot Y = &quot + AnsiString(y) MessageBox(NULL, strTempc_str(), &quotInfo&quot, MB_OK)

}

У вікні повідомлення ви побачите правильні значення змінних

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

/ / Почати нову сторінку в принтері

Printer()-&gtBeginPage()

Точно також і буфер обміну використовується як функція Cliboard ()

На жаль, CBuilder ігнорує опції компілятора з вирівнювання, замінюючи їх своїми власними Отже, ви не можете використовувати прапори компілятора -a1/2/3 Замість цього, використовуйте директиву pragma pack, як показано нижче:

/ / Вирівняти на один байт

#pragma pack(push,1)

struct  StructureNeedingAligment

{

/ / Дані структури

}

/ / Відключити вирівнювання

#pragma pack(pop)

Як приймати перетаскується (drag-and-drop) файл в моїй формі

Як завжди, з посмішкою Насправді вам треба обробити метод WM_DROPFILES Приклад: void TMainForm :: WMDropFiles (TWMDropFiles & Msg)

{

char szTemp[256]

int nNumberOfFiles = DragQueryFile(MsgDrop, 0xFFFFFFFF, szTemp, 256 )

for ( int nFile = 0 nFile &lt nNumberOfFiles ++nFile)

{

/ / Отримуємо імя перетягуваного файлу

DragQueryFile( MsgDrop, nFile, szTemp, 256 )

/ / Робимо щось з файлом

ProcessFileName(szTemp)

}

/ / Закінчуємо процес

DragFinish(MsgDrop)

}

Найпростіший спосіб – встановити властивість компонента Aligment в значення alClient Це буде автоматично змінювати розмір компонента в розмір форми щоразу, коли її розмір буде змінюватися (включаючи і перше її поява)

Якщо у вас є яка то особлива причина змінювати розмір компонента під час виконання (наприклад, вам може знадобитися залишити навколо нього 1 піксель), ви можете зробити це за допомогою властивостей компонента Top, Left, Height і Width Наприклад:

/ / Збільшуємо поле редагування до розміру форми,

/ / Залишаючи навколо нього кордон у 2 пікселя

Edit1-&gtTop = 2

Edit1-&gtLeft = 2

Edit1-&gtWidth = Width – 4 Edit1-&gtHeight = Height – 4

Для використання макросу TRACE вам треба зробити дві речі По-перше, визначити символ

__TRACE По-друге, підключити заголовний файл checksh Приклад:

#define     TRACE

# Include TRACE (Я тут \ N)

Висновок з макросу TRACE здійснюється у файл з назвою OutDbg1TXT, який завантажується в редактор файлів Він не зберігається автоматично, вам треба зберегти його з редактора Крім того, CBuilder НЕ запропонує вам зберегти його при закритті проекту, так що якщо ви його відкрили, то не забудьте зберегти

Використовуйте клас TImageList У компонентів TImageList є метод Draw, в який можна задати кордону він дуже схожий на функцію Windows API BitBlt

Як динамічно створити компонент під час виконання Дуже просто Використовуйте оператор new:

*pEdit = new TEdit(this) pEdit-&gtParent = this pEdit-&gtLeft = 10

pEdit-&gtTop = 10

pEdit-&gtHeight = 20

pEdit-&gtWidth = 200 pEdit-&gtVisible = TRUE

Не забудьте встановити властивість parent компонента, а то він не буде відображатися У прикладі мається на увазі, що «this» – це форма, але це може бути будь-який компонент, що має вікно

Використовуйте клас String Наприклад, для того, щоб відформатувати десяткове число, ви повинні написати щось на кшталт:

/ / Замість sprintf (szBuffer, % d, nNumber) String s = String (nNumber)

/ / Можна створювати відформатовані рядки всередині тексту

String s = Hello, world Мені + String (nNumber) + років від роду;

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

*

*