- •1.1. Что такое программа и как она выглядит?
- •1.2. Комментарии
- •1.3. Зарезервированные слова и типы данных
- •1.4. Объявление переменных
- •1.5. Операции и выражения
- •1.6. Ввод и вывод
- •1.7. Переменные и константы
- •1.8 Логические операторы
- •1.9. Управляющие операторы
- •1.10. Операторы циклов
- •1.11. Операторы перехода
- •2. Функции
- •2.1. Передача параметров
- •2.2. Библиотечные функции
- •2.3. Локальные и глобальные переменные
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Int local_var; /* по умолчанию auto */
- •2.4. Перегрузка
- •3. Массивы
- •4. Структуры
- •Int numberPeriod; //число переодов начисления процентов
- •Int page; //Количество страниц
- •Void print(); /*Внимание, записывается только прототип функции */
- •Int yearBorn; //год рождения
- •Int yearBorn; //год рождения
- •4.1. Демонстрационные программы
- •Int done;/*переменная, которая информирует о конце списка файлов */
- •6. Объединения
- •Info;//Обявление переменной типа объединение
- •Info;//Обявление переменной типа объединение
- •7. Объектно-ориентированное программирование
- •7.1. Классы и объекты
- •Демонстрационные программы
- •Результат работы программы
- •7.2. Конструкторы и деструкторы
- •Конструктор копирования
- •7.5. Наследование
- •7.3. Создание объектов и обращение к членам объекта
- •8. Абстрактные типы данных
- •9. Пространство имен
- •Void greeting();/*это пространство имен содержит функцию с тем же именем*/
- •Void big_greeting(); /*эта функция не попадает ни в одно из созданных подпространств,т.Е. Принадлежит пространству имен std */
- •//Определение функций
- •Void big_greeting() /* определение данной функции не принадлежит ни одному из созданных пространств имен, следовательно дальнейший код помещается в глобальное пространство имен */
- •10. Строки
- •4.3 Демонстрационные программы
- •4.10. Класс string
- •Класс AnsiString
- •Класс AnsiString
- •Класс Set
- •4.9. Перегрузка операторов
- •Использование "умных" указателей
- •4.8. Полиморфизм
- •Главное меню — компонент MainMenu
- •Диалоги
- •Файлы и потоки
- •Ввод-вывод в файл
- •Ifstream inStream; //Объявление входного потока
- •InStream.Open("character.Dat"); /*присоединение файла к входному потоку */
- •InStream.Close(); //закрытие входного потока
- •If(!out){ //при неудачной попытке
- •If(in.Fail()){ //поток не создан, то сообщение и выход
- •Управление потоком ввода-вывода
- •5.2. Ввод имен файлов
- •5.3. Манипуляторы
- •5. Указатели
- •5.1.Типы указателей и операции с указателями
- •Адресная арифметика
- •Сравнение указателей
- •Преобразование типа указателя
- •Указатель void
- •5.2. Динамические массивы
- •Int array[10]; //объявляется массив с именем array
- •Int a[10]; //объявляется массив с именем a
- •Int *array1; //указатель типа int с именем array1
- •Int *array[5];/*массив с именем array, его элементы указатели*/
- •Int (*point)[4][5]; /*объявление указателя на двумерный массив без имени */
- •Использование указателей в функциях и указатели на функции
- •Указатель классов
- •Шаблоны
- •Шаблоны функций
- •Void Swap (t& X, t& y) /* к моменту обращения тип т будет известен и заменен, например, на int */
- •Void sort(t array[], int maxIndex){ /*передали массив и его размер */
- •6.2. Шаблоны классов
- •6.3 Демонстрационные программы
- •7.1 Обработка исключений
- •Исключения и их стандартная обработка
- •Базовый класс исключений vcl Exception
- •Упражнения
- •Обработка исключительных ситуаций, возбуждаемых оператором new
- •Исходные файлы и объявление переменных
- •Связаные списки
- •Void newHead( //прототип функции создающей узел
- •Void newHead(//прототип функции создания узла
- •Поиск в связанных списках
- •Void newHead(PtrNode& head, //адрес головного узла
- •Директивы препроцессора.
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Особенности программирования под Windows.
- •Функция WinMain
- •Создание проекта Win32Application.
- •Библиотека mfc.
- •Создаем код
- •Шпаргалка
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Файл проекта
- •Введение
- •Свойства компонентов
- •События
- •Менеджер проектов
- •Пример: создание простейшего приложения
- •Графика Внедрение картинок
- •Редактор изображений
- •Классы для хранения графических объектов.
- •If (SelectDirectory( //Компонент библиотеки
- •Методы создания собственной графики. Рисование по пикселам
- •Int px, py; //координаты пикселей
- •Рисование с помощью пера
- •Int px, py; //координаты пикселей
- •Рисование кистью
- •Мультимедиа и анимация Общие сведения о звуковых и видеофайлах
- •Способы воспроизведения звуков
- •Создание мультфильма
- •Воспроизведение немых видео клипов — компонент Animate
- •Проигрыватель MediaPlayer
- •Процессы, потоки, распределенные приложения
- •If include "uOverlayl.H" // включение головного файла приложения
- •Функция CreateProcess
- •490 _ Глава 7
- •7.8.4 Элементы ActiveX
- •492 Глава 7
- •494 Глава 7
- •7.9 Компоненты-серверы сом
- •496 Глава 7
- •7.9.2 Свойства и методы сервера Word
- •500 Глава 7
- •Заключение
- •Что такое ansi?
- •Почему вместо русских букв в консольном приложении выводится мусор? Автор: Алексей Кирюшкин Версия текста: 1.0
- •Раздел I.2Выход 1
- •Раздел I.3Выход 2
- •Раздел I.4Выход 3
- •Раздел I.5Выход 4
- •(A)Потоки
- •(C)Ввод-вывод файлов
- •Выбор компонентов для групповых операций
- •Установка разделяемых свойств компонентов
- •Изменение размера компонентов
- •Выравнивание компонентов
- •Пример: Создание текстового редактора Проектирование формы приложения
- •Создание обработчиков событий
- •Создание меню
496 Глава 7
Вам надо найти в списке Design packages строку, в которой в виде комментария
написано ≪Borland C-H-Builder Server Components Sample Package≫ (см. рис 7.20) и
выключить индикатор в этой строке. Тем самым вы снимете соответствующий пакет
с регистрации в системе. Затем надо щелкнуть кнопку Add и добавить вместо от-
ключенного новый пакет. Пакеты размещаются в каталоге CBuilder6\Bin и имеют
имена bcb2kaxserver60.bpl для Office 2000/XP и bcb97axserver60.bpl для Office 97/98.
В зависимости от того, какой из этих пакетов у вас подключен (имя пакета вы мо-
жете видеть в строкепод списком Design packages — см. рис. 7.20), добавьте недос-
тающий.
Подобную операцию надо осуществить только один раз. В дальнейшем для
смены пакета вы просто выключаете индикатор используемого пакета, и затем
включаете индикатор другого.
В зависимости от того, какой пакет вы используете, в заголовочный файл ва-
шего приложения будет добавлена директива
Hnclude "Word_2K_SRVR.h"
ИЛИ
≪include "Word_97_SRVR.h"
а в файл реализации добавится директива
#pragma link "Word_2K_SRVR"
ИЛИ
#ргадта link "Word__97_SRVR"
Надо отметить, что свойства и методы одинаковых компонентов могут не-
сколько различаться в разных пакетах. Так что переход от одного из них к друго-
му требует в ряде случаев некоторых изменений в программе.
Все сказанное выше относилось к C++Builder 6. В C++Builder 5 имеется толь-
ко один пакет, и все компоненты-серверы СОМ размещаются на странице библио-
теки Servers. Так что в C++Builder 5 никакой путаницы с пакетами возникнуть не
может. В то же время надо отметить, что свойства и методы компонентов-серверов
СОМ в C++Builder 5 и 6 существенно различаются. Так что при переходе от
C++Builder 5 к C++Builder 6 приходится перепрограммировать приложения, ис-
пользующие серверы СОМ.
Теперь надо обсудить вопросы совместимости приложений, разработанных на ос-
нове серверов СОМ, с различными версиями Windows и Microsoft Office. Независимо
от того, какой пакет вы использовали при разработке приложения в C++Builder 6,
выполняемый модуль, как правило, будет нормально работать в Windows 2000/XP.
Но при последующем выполнении его в среде Windows 98 с Microsoft Office 98 воз-
никнут проблемы. Приложение будет требовать библиотеку CC3260MT.dll. Для того
чтобы приложение нормально выполнялось, потребуется записать файл этой библио-
теки (он расположен в каталоге CBuilder6\Bin) в системную папку System. После этого
приложение будет выполняться нормально.
Так что при распространении приложения с серверами СОМ, разработанного
в C++Builder 6, могут возникать некоторые проблемы. Как ни странно, проблем не
возникает с аналогичными приложениями, разработанными в C++Builder 5. Эти
приложений безо всяких проблем выполняются в Windows 98/2000/XP с Office
98/2000/ХР.
В заключение этого предварительного обзора проблем совместимости надо ска-
зать, что приложения с серверами СОМ нормально выполняются на чистых уста-
новках Microsoft Office. Если же на компьютере имеются какие-то прикладные
программы, не очень грамотно вмешивающиеся в офисные продукты Microsoft,
изменяющие их меню и системы команд, то при выполнении ваших приложений
с серверами СОМ могут возникать определенные сложности. Так что переноси-
мость подобных приложенийвсе-таки ограничена.
Процессы, потоки, распределенные приложения 497
Компоненты-серверы СОМ слабо документированы во встроенной справке
C++Builder. Хотелось бы хотя бы частично восполнить этот пробел. Но поскольку
в рамках данной книги невозможно рассмотреть подробно все многочисленные
серверы страниц Office2k, Office??, Servers, ограничимся только серверами, обеспе-
чивающими связь с Word.
Откройте новое приложение, перенесите на форму компонент WordApplication
и посмотрите в Инспекторе Объектов его свойства. Их очень немного. Кроме
обычных для всех компонентов Name и Tag имеется всего 4 свойства (во многих
компонентах-серверах их всего 3).
Свойство AutoCoimect определяет, должен ли сервер автоматически загру-
жаться с началом выполнения приложения. Если установить AutoConnect = true,
то соединение с сервером произойдет в момент начала выполнения вашего прило-
жения. Если же оставить значение AutoConnect = false, принятое по умолчанию,
то соединение с сервером можно установить вызовом метода Connect. Например:
WordApplicationl->Connect();
Впрочем, совершенно не обязательно устанавливать соединение свойством
AutoConnect или методом Connect. Соединение автоматически устанавливается,
когда выполняется вызов какого-то метода сервера или задается значение како-
му-то его свойству.
При использовании свойства AutoConnect надо иметь в виду, что установка
в true влияет только при запуске приложения, т.е. если это свойство установлено
во время проектирования. Задание AutoConnect = true во время выполнения при-
ложения ни на что не влияет.
Свойство ConnectKind определяет, как именно осуществляется соединение
с сервером. Это свойство может принимать следующие значения:
ckRunningOrNew
ckNewInstance
ckRunninglnstance
ckRemote
ckAttachToInterface
Подсоединиться к выполняющемуся серверу или создать
новый экземпляр сервера.
Всегда создавать новый экземпляр сервера.
Только подсоединиться к выполняющемуся серверу.
Подсоединиться к удаленному серверу. Эта опция должна
сочетаться с заданием свойства RemoteMachineName.
Не подсоединяться к серверу. Вместо этого приложение
обеспечивает интерфейс методом ConnectTo (об этом ме-
тоде будет сказано позднее). Опция ckAttachToInterface
не может использоваться совместно с установкой в true
свойства AutoConnect.
По умолчанию значение ConnectKind равно ckRunningOrNew. При этом если
в момент соединения имеется выполняющийся сервер (применительно к Word-
Application — если Word открыт), то приложение соединится именно с этим вы-
полняющимся экземпляром сервера. Если же в этот момент соответствующий сер-
вер не выполняется, то будет создан новый экземпляр сервера (в нашем случае бу-
дет осуществлен запуск Word).
Если значение ConnectKind равно ckRunningOrNew, то приложение всегда
создает новый экземпляр сервера. Если значение ConnectKind равно ckRunninglnstance,
то приложение всегда соединяется с выполняющимся сервером. В этом
случае, если выполняющегося сервера нет, будет сгенерировано исключение EOle-
SysError. Поэтому при ConnectKind = ckRunninglnstance, если нет уверенности,
что в момент соединения на компьютере имеется выполняющийся сервер, соедине-
ние надо осуществлять, например, так:
try
(
WordApplicationl->Connect();
}
catch (E01eSysError&)
{
Application->MessageBox(
"На компьютере нет выполняющегося в данный момент Word",
"Приложение будет закрыто",
MBJDK + MB_ICONEXCLAMATION);
Application->Terminate();
}
Приведенный код перехватывает исключение EOleSysError и выдает пользо-
вателю соответствующее сообщение.
Значение ConnectKind = ckRemote используется, если надо связаться с уда-
ленным сервером. В этом случае свойство RemoteMachineName должно указывать
компьютер, на котором выполняется удаленный сервер.
Таким образом, итог рассмотрения свойств, обеспечивающих подключение
к серверу, можно подвести следующим образом:
• Если вам надо, чтобы ваше приложение работало с каким-то открытым доку-
ментом сервера, выполняющимся в момент запуска приложения, следует за-
дать ConnectKind = ckRunninglnstance.
• Если, наоборот, вам надо, чтобы ваше приложение не испортило случайно ка-
кой-то документ в уже выполняющемся сервере, следует задать ConnectKind =
ckNewInstance.
• Если вам необходимо связаться с удаленным сервером, надо задать Connect-
Kind = ckNewInstance и установить соответствующее значение RemoteMachineName.
• В остальных случаях, вероятно, целесообразно сохранять заданное по умолча-
нию значение ckRunningOrNew.
Мы не рассмотрели пока значение ConnectKind равное ckAttachToInterface.
Для таких серверов, как WordApplication, оно не применимо. Его мы рассмотрим
несколько позднее.
После того, как вы установили соединение с сервером, он еще не становится
видимым пользователю. Впрочем, приложение может работать с этим сервером,
вызывать любые его методы, изменять или читать свойства, но сам сервер останет-
ся для пользователя за кадром. Если это нежелательно, если требуется, чтобы
пользователь видел, что происходит на сервере, или мог бы сам переключиться на
сервер и что-то там сделать, то надо задать свойству Visible сервера значение true.
Это делается по-разному в C+4-Builder 6 и 5. В C++Builder 5 это свойство устанав-
ливается непосредственно:
. WordApplicationl->Visible = true; // В C++Builder 5
А в C++Builder б свойство Visible, как и большинство других, доступно толь-
ко для чтения и может устанавливаться только специальными функциями. Для
Visible это функция set_Visible, в которую в качестве аргумента передается
true — сделатьвидимым, или false — сделать невидимым. Например:
WordApplicationl->set_Visible(tr,ue) ; // В C++Builder 6
Разрыв соединения с сервером осуществляется методом Disconnect. Кроме
того, у таких компонентов серверов СОМ, как WordApplication, имеется свойство
AutoQuit. Если установить это свойство в true, то при завершении приложения ав-
томатически вызовется метод, завершающий сервер. Это свойство полезно уста-
навливать в true, если вы работаете с новым экземпляром сервера, который созда-
ло ваше приложение, и после завершения приложения не требуется, чтобы пользе-
Процессы, потоки, распределенные приложения 499
ватель мог продолжать работу с сервером. Тогда можно или установить AutoQuit
в true, или при завершении приложения выполнить оператор вида:
WordApplicationl->Disconnect();
Это особенно необходимо, если в процессе работы вашего приложения с серве-
ром пользователь не сделал сервер видимым. Если вы не закроете соединение, то
после завершения вашего приложения сервер будет по-прежнему невидим, не бу-
дет отображен в полосе задач, но в действительности будет выполняться. И когда
пользователь решит закрыть Windows, он неожиданно может увидеть какое-то со-
общение вашего сервера-невидимки, например, запрос о сохранении файла.
