Бібліотека стандартних шаблонів (STL) в CBuilder (FAQ)

Чому при використанні класу vector видається цілий оберемок помилок

Напевно, ви робите що-небудь типу:

#include &ltvectorh&gt int func(void)

{

vector&ltint&gt array

}

і на рядку vector якраз і отримуєте свій оберемок помилок Для виправлення ситуації використовуйте іменовану область видимості для STL, яка називається std Ось код, який дозволить ваші проблеми:

#include &ltvectorh&gt

use namespace std / / Просто додайте цей рядок

int func(void)

{

vector&ltint&gt array

}

Природно Не забудьте тільки додати відповідний заголовки (vector, list і т п) і повністю визначити імя компонента STL, використовуючи вираз std :: Що стосується всього іншого, можна сміливо сказати, що компоненти STL працюють в компонентах точно також, як і в простих додатках

Це можна зробити за допомогою методу Add властивість Items Іншими словами, коли ви працюєте з елементами переліку або комбінованого списку, ви працюєте безпосередньо з властивістю Items CBuilder розділив всю роботу зі списками (комбінованими списками) на окремі частини – для обробки даних і модифікації самих списків

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

ListBox1-&gtItems-&gtAdd( &quotMyItem1&quot )

Для модифікації заданого елемента списку ви звертаєтеся до властивості items як до масиву і пишіть наступне:

ListBox1-&gtItems[nInd] = &quotMyItem2"

І, нарешті, для видалення елемента зі списку, використовуючи метод Remove: ListBox1-> Remove (0) / / Видалення першого елемента списку

Будь-яке повідомлення Windows з числа тих, що не обробляються компонентом CBuilder, може бути додано в нього за допомогою карти повідомлення (message map) Для цього визначте повідомлення як константу:

#define WM_MY_Message (WM_USER+1)

Після цього в опис класу форми або компонента (що знаходиться, як відомо, в заголовному файлі) додайте наступні рядки:

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_MY_MESSAGE,TMessage,   OnMyMessage) END_MESSAGE_MAP

Нарешті, визначте в своєму класі метод OnMyMessage як метод класу, що має один аргумент типу TMessage:

void __fastcall OnMyMessage( TMessage&amp msg )

Далі, вже в коді функції ви можете визначити будь-які дії, які повинні виконуватися при отриманні заданого користувачем повідомлення Якщо ви використовуєте повідомлення, певне Windows, але не має втілення в CBuilder, опустіть останній крок Всі інші кроки залишаться точно такими ж

Не обовязково використовувати модифікатор fastcall у ваших власних методах Тільки методи, що додаються в компоненти, повинні використовувати його в обовязковому порядку Методи, які заміщають в ваших компонентах методи VCL так само повинні застосовувати __ fastcall

Все це викликано тим, що VCL була написана на мові Pascal У мовах C + + і Pascal використовуються різні угоди про виклики, у звязку з чим і був введений модифікатор __ fastcall – для коректного тлумачення аргументів

Мені здається, питання має звучати так: «При інсталяції все начебто працює нормально, але компонент поводиться дивно – видає повідомлення про порушення прав доступу (access violation) Як з цим боротися »

Швидше за все, при компіляції компонента не проводилося вирівнювання по межі слова Якщо ви змінили вирівнювання директивою компілятора С + + або Pascal, компонент може видавати непередбачувані результати

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

ListBox1-&gtSendMessage(LB_SETHORIZONTALEXTENT,  m_nMaxLength,  0)

де m_nMaxLength – ціле значення, що представляє собою довжину максимальної рядка в пікселях Для визначення довжини рядка можна використати метод GetTextExtent:

SIZE sz

GetTextExtentPoint32(ListBox1-&gtHandle,szStrng, strlen(szString), &ampsz)

m_nMaxLength = szcx

Так, функцію MessageDlg можна використовувати в CBuilder У неї, правда, досить хитромудрий синтаксис:

MessageDlg(&quotStatus Message&quot, mtError, TMsgDlgButtons() &lt&lt mbYes &lt&lt mbNo, 0)

Для того, щоб синсталліровать компонент Delphi в CBuilder вам треба розташовувати вихідним кодом цього компонента, так як синсталліровать DCU (Delphi Component Unit) в CBuilder не можна Для інсталяції вихідного коду вам треба виконати звичайну процедуру інсталяції компонента в CBuilder, вибравши як вихідного файлу файл PAS Весь інший процес залишиться незмінним CBuilder однаково легко компілює вихідний код, написаний як на C + +, так і на Pascal

Не всі компоненти Delphi працюватимуть в CBuilder Як правило, проблем не виникне, але якщо компонент Pascal використовує властивість типу Real, який не підтримується CBuilder, при спробі використання компонента у своїх додатках ви отримаєте дивну помилку компіляції (Real not supported, тобто тип Real не підтримується)

Як я розумію, вам хотілося б використовувати конструкції типу: TEdit myEdit

myEditsomfunc()

На жаль, використовувати подібні речі не можна Замість цього вам треба в динамічній памяті створити екземпляр класу TEdit за допомогою оператора new Це робиться через те, що обєкти VCL написані на Pascal і знищуються по-своєму Для створення екземпляра обєкта VCL у вашому додатку слід написати наступне:

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

Функція ExtractFileExt витягує розширення з імені файлу і повертає його в якості рядки: string Ext = ExtractFileExt (FileName)

Використовуйте властивість Pixels растрового малюнка

Елементи списку зберігаються у властивості String масиву Items Ви можете безпосередньо змінювати ці рядки через це властивість-масив Наприклад, щоб отримати перший рядок у списку (з індексом

0) і додати в неї букву W, вам треба зробити наступне:

string s = List1-&gtItems-&gtStrings[0] s += &quotW"

List1-&gtItems-&gtStrings[0] = s

Ви можете змінити колір тексту (але не колір фону) кнопки, використавши для цього властивість Font-

> Color Наприклад, щоб зробити текст тексту червоним, вам треба написати наступне: Button1-> Font-> Color = clRed

Використовуйте властивість Items ви можете працювати з елементом списку, встановлюючи або отримуючи властивість Items-> Object для нього

Це просто Як і всі растрові малюнки, малюнки на кнопках (TBitBtn) створюються як растровий малюнок розміром 1 на 1 піксель Для того, щоб збільшити ить їх до бажаного розміру, встановіть значення властивостей Width і Height у відповідні значення Після цього можна використовувати властивість Canvas кнопки для того, щоб щось відобразити на ній При цьому треба памятати, що колір пікселя в лівому нижньому кутку растрового малюнка використовується як «прозорий» колір кнопки

Сказане вище має силу тільки для випадку створення обєкту TBitBtn під час виконання

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

Вам треба додати наступний рядок в код методу FormClose дочірньої форми MDI: Action = caFree

За замовчуванням дочірні вікна не закриваються, а мінімізуються Навіщо – я не знаю

Додавання в рядок стану поточних дати і часу – справа не хитра Ви можете отримати поточні дату і час при посередництві функції VCL Now (), яка повертає їх як обєкт TDateTime

Для того, щоб помістити отримані дані в панель стану, вам треба створити в ній секції (panel) Після цього за допомогою властивості Items секцій ви встановлюєте текст, що відображається в них Для цього слід написати щось на кшталт:

StatusBar-&gtPanels-&gtItems[nTimeIndex]-&gtText =  strTime StatusBar-&gtPanels-&gtItems[nDateIndex]-&gtText = strDate

У цьому прикладі nTimeIndex це індекс секції, в якій ви хочете відображати час, а nDateIndex – секції дати StrTime і strDate це рядки часу і дати відповідно Якщо вам не подобається використовувати обєкт TDateTime, просто підключіть файл і використовуйте функцію localtime для отримання дати і часу в місцевому форматі

На перший погляд, немає нічого простіше – можна встановити властивість форми Color в значення будь-якого кольору На превеликий жаль, це не працює (принаймні у версії 10) З іншого боку, впоратися з цією помилкою не набагато складніше Треба просто додати зміна кольору форми в обробник події форми OnCreate:

Color = clRed / / Колір фону встановлений

Для того, щоб перетворити інформацію введену в поле редагування в число з плаваючою точкою вам треба перетворити властивість Text цього поля, як це показано в наступному коді:

double dValue = atof(Edit1-&gtTextc_str())

Даний фрагмент коду витягує введене в поле редагування значення в буфер char * і передає його у функцію atof, яка власне і проводить перетворення з char * в double Для визначення функції atof вам, можливо, доведеться підключити файл <$ FХочется додати - візьміть за правило проводити подібні перетворення всередині блоку try ... except

– Це убезпечить вашу програму від помилок користувача – Прямуючи перев&gt

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

Bitmap1-&gtLoadFromFile(&quotc:\\windows\\somebitmapbmp&quot)

Для того, щоб отримати зворотну косу риску (backslash), в C / C + + вам потрібно поставити дві такі риси поспіль

Для того, щоб звернутися до елементу групи перемикачів (radio buttons), зазвичай використовується властивість Items (RadioGroup-> Items) Для заборони і дозволу елементів групи вам хотілося б працювати з самими керуючими елементами, а не з їх заголовками Так що не дивно, що для звернення до елементів як до обєктів потрібно використовувати властивість Controls обєкта RadioGroup (Група перемикачів) Ось шматочок коду, який заборонить вибір третього (нумерація йде з нуля) перемикача з групи:

RadioGroup1-&gtControls[2]-&gtEnabled = false

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

*

*