Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теллес М. - Borland C++ Builder. Библиотека программиста - 1998

.pdf
Скачиваний:
790
Добавлен:
13.08.2013
Размер:
4.35 Mб
Скачать

Borland C++ Builder (+CD). Библиотека программиста 331

Как добавить горизонтальную полосу прокрутки в окно списка (ListBox)?

Это весьма распространенная при программировании под Windows проблема. Добавить горизонтальную полосу прокрутки в окно списка несложно, но работать нормально она не будет. Дело в том, что вы должны установить горизонтальный размер списка для того, чтобы знать, насколько далеко его надо прокручивать. Для этого выберите самую длинную строку в списке и установите размер горизонтальной прокрутки так, чтобы он был равен длине этой строки. Сделать это надо следующим образом:

ListBox1->SendMessage(LB_SETHORIZONTALEXTENT, m_nMaxLength, 0);

где m_nMaxLength — целое значение, представляющее собой длину максимальной строки в пикселях. Для определения длины строки можно использовать метод GetTextExtent:

SIZE sz; GetTextExtentPoint32(ListBox1->Handle,szStrng,

strlen(szString), &sz); m_nMaxLength = sz.cx;

Можно ли использовать MessageDlg из Delphi в CBuilder?

Да, функцию MessageDlg можно использовать в CBuilder. У нее, правда, довольно замысловатый синтаксис:

MessageDlg("Status Message", mtError,

TMsgDlgButtons() << mbYes << mbNo, 0)

Как инсталлировать компонент Delphi в CBuilder?

Для того, чтобы сынсталлировать компонент Delphi в CBuilder вам надо располагать исходным кодом этого компонента, так как сынсталлировать DCU (Delphi Component Unit) в CBuilder нельзя.

Для инсталляции исходного кода вам надо проделать обычную процедуру инсталляции компонента в CBuilder, выбрав в качестве исходного файла файл PAS. Весь остальной процесс останется неизменным. CBuilder одинаково легко компилирует исходный код, написанный как на

C++, так и на Pascal.

Замечание

Не все компоненты Delphi будут работать в CBuilder. Как правило, проблем не возникнет, но если компонент Pascal использует свойство типа Real, не поддерживаемого CBuilder, при попытке использования компонента в своих приложениях вы получите странную ошибку компиляции (Real not supported, то есть тип Real не поддерживается).

Почему нельзя определить в программе элемент моего собственного компонента?

Как я понимаю, вам хотелось бы использовать конструкции типа:

TEdit myEdit;

Borland C++ Builder (+CD). Библиотека программиста 332

myEdit.somfunc();

К сожалению, использовать подобные вещи нельзя. Вместо этого вам надо в динамической памяти создать экземпляр класса TEdit при помощи оператора new. Это делается из-за того, что объекты VCL написаны на Pascal и уничтожаются по-своему. Для создания экземпляра объекта VCL в вашем приложении следует написать следующее:

TEdit *pEdit = new TEdit(this); pEdit->Parent = this;

Как разбить полное имя файла на составляющие элементы?

Функция ExtractFileExt извлекает расширение из имени файла и возвращает его в качестве строки:

string Ext = ExtractFileExt(FileName);

Как получить доступ к отдельным кускам растрового рисунка?

Используйте свойство Pixels растрового рисунка.

Как изменить элемент в списке, кроме как удалить и добавить снова?

Элементы списка хранятся в свойстве String массива Items. Вы можете напрямую изменять эти строки через это свойство-массив. Например, чтобы получить первую строку в списке (с индексом 0) и добавить в нее букву W, вам надо сделать следующее:

string s = List1->Items->Strings[0]; s += "W"; List1->Items->Strings[0] = s;

Как изменить цвет текста на кнопке?

Вы можете изменить цвет текста (но не цвет фона) кнопки, использовав для этого свойство Font- >Color. Например, чтобы сделать текст текста красным, вам надо написать следующее:

Button1->Font->Color = clRed;

Как хранить информацию, связанную с элементом списка?

Используйте свойство Items; вы можете работать с элементом списка, устанавливая или получая свойство Items->Object для него.

Как создавать растровые рисунки на кнопках во время исполнения?

Это просто. Как и все растровые рисунки, рисунки на кнопках (TBitBtn) создаются как растровый рисунок размером 1 на 1 пиксель. Для того, чтобы увелич ить их до желаемого размера, установите значения свойств Width и Height в соответствующие значения. После этого можно использовать свойство Canvas кнопки для того, чтобы что-то отобразить на ней. При этом надо помнить, что цвет пикселя в левом нижнем углу растрового рисунка используется как «прозрачный» цвет кнопки.

Сказанное выше имеет силу только для случая создания объекта TBitBtn во время исполнения.

Borland C++ Builder (+CD). Библиотека программиста 333

Если же вы собираетесь разрисовать уже существующую кнопку этого типа, задание значений свойств Width и Height можно опустить.

Дочернее окно MDI не закрывается. Как можно его закрыть?

Вам надо добавить следующую строку в код метода FormClose дочерней формы MDI:

Action = caFree;

По умолчанию дочерние окна не закрываются, а минимизируются. Зачем я не знаю.

Как в CBuilder поместить дату и время в строку состояния?

Добавление в строку состояния текущих даты и времени дело не хитрое. Вы можете получить текущие дату и время при посредстве функции VCL Now(), которая возвращает их как объект

TDateTime.

Для того, чтобы поместить полученные данные в панель состояния, вам надо создать в ней секции (panel). После этого при помощи свойства Items секций вы устанавливаете текст, отображаемый в них. Для этого следует написать что-то вроде:

StatusBar->Panels->Items[nTimeIndex]->Text = strTime;

StatusBar->Panels->Items[nDateIndex]->Text = strDate;

В этом примере nTimeIndex это индекс секции, в которой вы хотите отображать время, а nDateIndex — секции даты; StrTime и strDate это строки времени и даты соответственно. Если вам не нравится использовать объект TDateTime, просто подключите файл <time.h> и используйте функцию localtime для получения даты и времени в местном формате.

Как изменить цвет фона формы?

На первый взгляд, нет ничего проще можно установить свойство формы Color в значение любого цвета. К большому сожалению, это не работает (по крайней мере в версии 1.0). С другой стороны, справиться с этой ошибкой не намного сложнее. Надо просто добавить изменение цвета формы в обработчик события формы OnCreate:

Color = clRed; // Цвет фона установлен

Как преобразовать введенное в поле редактирования значение в число с плавающей точкой?

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

double dValue = atof(Edit1->Text.c_str());

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

это обезопасит вашу программу от ошибок пользователя Примеч. перев.>

Borland C++ Builder (+CD). Библиотека программиста 334

Как загрузить растровый рисунок во время исполнения?

Это несколько зависит от того откуда, собственно, вы собираетесь его загружать. Для того, чтобы загрузить растровый рисунок из файла во время исполнения, следует использовать метод LoadFromFile. Например, для загрузки рисунка из файла в растровый рисунок Bitmap1, вам следует написать:

Bitmap1->LoadFromFile("c:\\windows\\somebitmap.bmp");

Замечание

Для того, чтобы получить обратную косую черту (backslash), в C/C++ вам нужно поставить две такие черты подряд.

Как запретить один из переключателей в группе?

Для того, чтобы

обратиться к

элементу группы

переключателей

(radio buttons),

обычно используется

свойство Items

(RadioGroup->Items).

Для запрещения

и разрешения

элементов группы вам хотелось бы работать с самими управляющими элементами, а не с их заголовками. Так что неудивительно, что для обращения к элементам как к объектам нужно использовать свойство Controls объекта RadioGroup (группа переключателей). Вот кусочек кода, который запретит выбор третьего (нумерация идет с нуля) переключателя из группы:

RadioGroup1->Controls[2]->Enabled = false;

Файлы помощи и проблемы

Почему при нажатии F1 я получаю пустое окно сообщения?

Вам надо скачать обновленные файлы помощи с Web-сайта фирмы Borland. Адрес, по которому это можно сделать: http://www.borland.com/techpubs/bcppbuilde.

Почему нет помощи по TStringGrid?

На самом деле TStringGrid настолько походит на TDrawGrid, что вы вполне можете использовать помощь по последнему. Если же вы хотите иметь обновленные файлы помощи, содержащие, в частности, и помощь по TStringGrid, обратитесь по адресу, указанному в предыдущем вопросе.

Много ли перекрестных ссылок пропущено в файлах помощи?

Да. Фирма Borland в курсе проблемы, так что в данный момент прорабатывается большое добавление к файлам помощи, содержащее пропущенные перекрестные ссылки. Правда некоторые пропущенные ссылки относятся к файлам помощи Microsoft, которые Borland лишь распространяет по лицензии. Следите за последней информацией на Web-сайте Borland.

Как добавить помощь по F1 для моего собственного компонента?

Если вы написали новый компонент и теперь хотите, чтобы при нажатии клавиши F1 на закладке IDE, содержащей его, появлялся ваш файл помощи, вам придется использовать систему открытия помощи (Borland OpenHelp). Для инсталляции файла помощи к вашему компоненту вам надо проделать следующее:

Создайте новый файл помощи для своего компонента. Переместите его в ту директорию, где он

Borland C++ Builder (+CD). Библиотека программиста 335

будет находиться постоянно. При нем должен находиться и связанный с ним файл TOC (Table Of Contents, содержание) или CNT (CoNTents).

Запустите приложение OpenHelp. Нажмите кнопку Add, расположенную под списком уже имеющихся файлов помощи.

Выберите свой файл помощи в том каталоге, куда вы его поместили на первом шаге.

Переместите его из списка существующих в список выбранных файлов, отметив в первом списке и нажав кнопку >.

Нажмите кнопку Apply, а затем кнопку OK.

CBuilder виснет, когда я щелкаю на закладке Find диалога помощи. В чем дело?

В директории, где у вас находится Windows найдите файл инициализации winhelp.ini и отредактируйте его с помощью любого текстового редактора, удалив ссылки на все продукты фирмы Borland (типа Delphi или С++), которые в ставили на свой компьютер ранее, а теперь удалили. После этого удалите все файлы GID в директории CBuilder\help. Теперь все должно работать нормально.

Базы данных

Почему на файле Btrieve я получаю сообщение «Record/Key Deleted»?

Это как правило может быть вызвано двумя причинами<$FBtrieve – это тип базы данных, используемый, например, в системе Novell Netware. — Примеч. перев.>. Во-первых, вы могли включить в свои строки NULL (символы с кодом 0). Btrieve подразумевает, что BDE передает ему строки, в которых в качестве заполнителя используется пробел. Во-вторых, причиной может служить запись с неуникальным индексом. Когда вы добавляете запись в таблицу, индексированные поля проверяются на допустимость значений. Так что убедитесь, что данные индекса корректны.

Как поместить текущую дату в поле редактирования DBEdit?

Для того, чтобы поместить текущую дату в поле используйте функцию Now() класса TDateTime.

Как установить фильтр, содержащий специальные символы типа "/"?

Если имя поля содержит специальный символ типа «/», как в случае Last/First, в выражении, определяющем фильтр вам надо заключить это имя в квадратные скобки [Last/First]. Пример: Filter = "[Last/First] = 'Telles/Matt''

Как использовать индексы в базах данных?

Для того, чтобы иметь возможность использовать индексы, вам надо работать с базой данных с помощью класса TTable. Обратить к его описанию для получения информации о соответствующих свойствах.

Как подключиться к базе данных Access (или подобной), не заставляя пользователя вводить никаких данных?

Как вы возможно знаете, при подключении к «посторонней» базе данных (такой как Access), BDE CBuilder запросит у пользователя имя для входа в базу и пароль. Если вы используете компонент TDatabase для подключения к базе данных Access, то сможете справиться с этой проблемой. Установите свойство базы данных login в false. После этого при помощи свойства Params

Borland C++ Builder (+CD). Библиотека программиста 336

установите значения имени и пароля:

USER NAME="ADMIN"

PASSWORD="ADMIN"

Как определить, что запись базы данных была изменена?

В форму, содержащую интересующий вас источник данных добавьте событие OnDataChange. Если вы хотите работать непосредственно с данными, добавьте обработчик в источник данных. В противном случае добавьте его в чувствительный к данным управляющий элемент, обрабатывающий их.

Как отменить редактирование записи в базе данных?

В объект базы данных добавьте метод Abort.

Обработка исключительных ситуаций

Как использовать выражения try ... catch?

В принципе все, что может вызвать появление исключительной ситуации, должно быть заключено в блок try, для того, чтобы вы могли обработать эту исключительную ситуацию. В общем виде блок try ... catch выглядит следующим образом:

try

{

//Выражение, которое может привести к

//возникновению исключительной ситуации

}

catch(Exception& ce)

{

// Обработка исключительной ситуации

}

Как сделать обработчик исключительной ситуации функцией-членом класса формы?

В CBuilder объект-приложение обрабатывает большинство исключительных ситуаций, возникающих в базовых классах, таких как формы. Для того, чтобы поставить в соответствие

обработчику исключительной ситуации собственный обработчик формы выполните присваивание в методе Create формы:

__fastcall TForm1::FormCreate()

{

Application->OnException = MyHandler;

}

После этого определите обработчик в форме примерно следующим оьбразом:

void __fastcall TForm1::MyHandler(System::TObject* Sender, SysUtils::Exception *e)

{

//Здесь производится собственно обработка

//исключительной ситуации

Borland C++ Builder (+CD). Библиотека программиста 337

}

Разное

Какие еще источники информации по CBuilder существуют?

Лучшие источники информации электронные конференции, расположенные по адресу forums.borland.com. В них содержится постоянно обновляемая информация по всем аспектам CBuilder (ActiveX, VCL, базы данных и т. д. и т. п.). Кроме того, группа Borland в конференциях CompuServe (BCPPWIN) также является очень неплохим источником свежей информации. И, наконец, собственно домашняя страница CBuilder на www.borland.com.

Как использовать формы CBuilder в приложении на Visual C++, использующем MFC?

В CBuilder создайте DLL, содержащую формы, которые вы собираетесь использовать. Для вызова из MFC создайте для каждой из них «оберточную» функцию, определенную как extern C. В MFC создайте библиотеку импорта, используя команду dumpbin / exports для того, чтобы найти имена функций и создать файл DEF, содержащий эти значения. Теперь вы можете использовать опцию lib/def: для создания библиотеки импорта для вызова функций в вашем приложении MFC.

Как средствами CBuilder получить доступ к метке диска CD-ROM?

При помощи функции Windows API GetVolumeInformation. CBuilder может без проблем вызывать функции Windows API напрямую.

Как использовать OLE Automation в CBuilder?

Для создания объекта OLE automation в CBuilder используйте функцию CreateOleObject. Для

получения и установки значений свойств этого объекта воспользуйтесь его методами OlePropertySet и OlePropetyGet. И, наконец, для вызова методов этого объекта используйте метод

OleProcedure.

Как осуществить обработку времени простоя в CBuilder?

Лучший способ для обработки времени простоя (idle time processing) — создать поток (thread). Если вы действительно хотите делать что-то в цикле обработки сообщений времени простоя, вы можете использовать обработчик события приложения OnIdle. После того, как закончите свои действия, установите Done в true с тем, чтобы вызвался метод WaitMessage для корректного обновления системы.

Создание компонентов

Как добавить свойство класса, например TFont, в мой компонент?

Если вы используете уже существующее свойство вроде TFont, следует просто определить свойство этого типа. В случае же, если вы хотите создать новое свойство, являющееся классом, для использования в своем компоненте, вам надо позаботиться о нескольких вещах. Во-первых, используемый вами класс должен являться потомком (хотя бы далеким) TPersistent, то есть наследовать от класса, наследующего от TPersistent. Во-вторых, вы должны определить класс, в котором вы собираетесь использовать свойство.

Наконец, вы должны добавить в компонент, содержащий класс свойства, свойство данного типа, объявленное как __published, которое вы хотите использовать как «нормальную» переменную

Borland C++ Builder (+CD). Библиотека программиста 338

<Например: __published: __property TFont *myFont. — Примеч. перев.>. Теперь можно использовать саму эту переменную для работы с методами свойства read и write.

Сложности состоят в том, что вы должны заместить метод компонента Create так, чтобы создавался элемент класса свойства. В противном случае система даст сбой при попытке Object Inspector загрузить это свойство.

Замечание

Если вы хотите, чтобы пользователь иметь возможность редактировать отдельные части комплексного свойства в Object Inspector, вам надо объявить и их как __published внутри класса этого свойства.

Почему при попытке посмотреть свойство моего компонента в Object Inspector система выдает мне ошибку «переполнение стека»?

Скорее всего, функция set присваивается имени свойства вместо переменной класса. Например:

int Fx; // Переменная класса для свойства

__property int X={read=X, write=SetX}; __fastcall void SetX(int X)

{

X = x; // Здесь вместо X должно быть Fx!

}

Как создать круглую кнопку?

Используйте функцию Windows API CreateEllipticRegion для создания области в виде окружности, а потом функцию API SetWindowRgn, передав ей ссылку (handle)на кнопку и область, созданную первой функцией.

Какие файлы надо иметь при создании компонента?

Заголовочный файл (H или HPP) и OBJ-файл должны быть скопированы в директорию CBuilder\Lib. Это позволит CBuilder корректно компилировать и компоновать приложения, использующие этот компонент в своих формах.

Как создать компонент, который бы выглядел как массив?

Создайте для этого индексированный компонент. Выглядит он примерно следующим образом:

__property double Xpoint[int nLine][int Index] =

{read = GetXPoint, write = SetXPoint};

В этом примере показано свойство с именем XPoint, представляющее собой двумерный массив. Функция GetXPoint выглядит примерно следующим образом:

virtual double __fastcall GetXPoint( int nLine, int nIndex );

В то же время функция SetXPoint выглядит так:

virtual void __fastcall SetXPoint( int nLine, double dPoint );

Воплощать свойства в виде настоящих массивов нет никакой необходимости, но это я оставляю на

Borland C++ Builder (+CD). Библиотека программиста 339

ваше усмотрение.

Как можно протестировать свой компонент, не добавляя его в палитру?

Вы можете протестировать компонент, создав его экземпляр в некоем родительском окне, после чего менять значения свойств, как это необходимо для тестирования. Например для того, чтобы создать на форме новый экземпляр компонента Edit, вам следует написать:

TEdit *pEdit; // Эта строка пишется в заголовочном файле pEdit = new pEdit(this); // Владелец - форма

pEdit->Parent = this; // ЗАПОМНИТЕ! Родителем должна быть форма pEdit->Left = 10;

pEdit->Width = 100; pEdit->Top = 10; pEdit->Height = 20;

Этот блок кода создает компонент edit, расположенный на форме в позиции 10,10 и протянутый на 100 пикселей вправо и 20 пикселей вниз. Подобный блок кода может быть использован для любого вида компонентов, поскольку все компоненты поддерживают эти атрибуты.

Глава 16. Другие источники информации

Web-узлы

Списки рассылки

Конференции UseNet

Другие электронные источники информации

При работе с новыми программными продуктами (технологиями) одна из наиболее неприятных особенностей состоит в том, что имеется очень мало справочного материала. При работе с Visual Basic, Delphi или Oracle нетрудно найти книги, Web-узлы, журналы или другие источники информации о проблемах, которые у вас могут возникнуть при работе с этими инструментами. Однако при работе с таким достаточно новым методом, как CBuilder, вы, вероятно, обнаружите, что имеется недостаток хорошей и доступной информации. Число Web-узлов, книг и журналов, посвященных CBuilder, растет скачкообразно, но у вас могут быть проблемы с их поиском. В этой главе мы рассмотрим некоторые доступные источники информации для CBuilder, особенно те области Internet'а и компьютерных сетей, где можно найти наиболее современные ответы на ваши вопросы.

Web-узлы фирмы Borland

Первым и наиболее очевидным источником информации по всем вопросам, связанным с CBuilder, является Web-узел фирмы Borland. Этот узел, http://www.borland/com, содержит богатую техническую информацию о CBuilder. Здесь вы найдете сравнение CBuilder с другими программными продуктами и технические статьи, показывающие, как выполнять задания и решать проблемы в этой системе. Borland поддерживает на своем узле базу данных по обнаруженным вирусам и секцию ответов на наиболее часто задаваемые вопросы.

В дополнение к своему Web-узлу, Borland поддерживает ряд конференций в сети Usenet (Usenet newsgroups) для обсуждения проблем CBuilder. Выход на эти конференции с сервера forums.borland.com. На этом сервере вы найдете следующие конференции (newsgroups), посвященные исключительно CBuilder:

Borland C++ Builder (+CD). Библиотека программиста 340

borland.public.cpp.jobs: обсуждаются рабочие места, связанные с работой с Borland C++ либо c CBuilder.

borland.public.cbuilder.activex: конференция, посвященная использованию методов ActiveX,

связанных с CBuilder. Здесь вы найдете описания использования, написания и нахождения управляющих элементов ActiveX.

borland.public.cbuilder.commandlinetools: конференция, посвященная использованию инструментов командной строки, которые поставляются с CBuilder. Здесь вы найдете информацию об использовании командных версий компилятора, компоновщика, программы сборки make, утилиты поиска grep и всех других инструментов, которые образуют систему утилит командной строки CBuilder.

borland.public.cbuilder.database: конференция, посвященная вопросам баз данных при использовании системы CBuilder. Вы найдете здесь вопросы и ответы об использовании CBuilder с различными распространенными базами данных (такими, как Oracle, dBase или Access), а также такие темы, как настройка выражений SQL, манипуляции с индексами и другие интересные разделы.

borland.public.cbuilder.ide: конференция, посвященная интегрированной среде разработки в CBuilder. Рассмотренные здесь вопросы включают создание "горячих" клавиш, установку и использование инструментов, работа с Мастером и другие темы, связанные с использованием и расширением интегрированной среды разработки.

borland.public.cbuilder.jobs: конференция, посвященная исключительно рабочим местам в мире компьютерной индустрии, связанным с использованием CBuilder. Компании помещают здесь

сообщения о вакансиях, а эксперты предлагают свои услуги. В этой конференции обсуждались гонорары консультантов по CBuilder, вопросы найма CBuilder программистов и какие компании используют эту систему.

borland.public.cbuilder.language: конференция, посвященная языкам CBuilder, C++ и

расширениям этого языка, введенным компанией Borland. Эта конференция обсуждает не только вопросы стандартного C++ и как они связаны с компилятором CBuilder, но и расширения, сделанные фирмой Borland для этого языка.

borland.public.cbuilder.non-technical: конференция, посвященная нетехническим аспектам CBuilder. Здесь собрана информация о проблемах инсталляции, новых версиях и исправлениях, новых Web-узлах для этой системы и другие вопросы о системе, не имеющие технической направленности.

borland.public.cbuilder.vcl: конференция, посвященная системе VCL внутри системы CBuilder. Вопросы на этой конференции рассматриваются от использования VCL компонент, которые поставляются вместе с системой до создания собственных VCL компонент. Сейчас это наиболее активная из конференций Borland и, вероятно, будет оставаться такой и в будущем. Если ваши вопросы связаны с программированием на CBuilder и формами, то вы должны прежде всего посмотреть эту конференцию для поиска ответов.

borland.public.cbuilder.winapi: конференция, посвященная работе с Windows API и CBuilder. Вы найдете здесь вопросы и ответы, имеющие отношение не только к тому, какие функции API доступны для работы, но и каково их влияние в CBuilder. Кроме того, вы узнаете, как расширить

существующие VCL компоненты при использовании Windows API и как включить функции API в ваши собственные компоненты. Эта конференция также часто посещается.

Каждая конференция Borland обычно получает несколько сотен посланий каждый день. Если у вас есть программа поиска по этим посланиям, то вы увидите, что стоит немного подождать, пока поиск не определит, не встречалась ли проблема, с которой вы столкнулись, другому пользователю, который зафиксировал ее в какой-либо из конференций. Не пытайтесь идти в одиночку в этот прекрасный новый мир программирования.

CompuServe

Соседние файлы в предмете Программирование на C++