Данное пособие предназначено для студентов II

Вид материалаРеферат

Содержание


Delphi и C++Builder
RAD (Rapid Application Design - сре
RAD-пакетом являются системы класса Delphi
С-базированную версии RAD
Delphi / C++Builder
Inprise AppCenter
Delphi выбрана базовой для разработки пользовательских WINDOWS-приложений; в соответствующих местах после заголовка абзаца C++Bu
Delphi и C++Builder
Цель работы
Модель программирования и концепция
Windows - операционная система
Понятие о сообщениях windows и их обработке
С- и Pascal
Long far pascal
Dt_singleline | dt_center | dt_vcenter)
WinProc. WinProc
2.З.два способа передачи сообщений
0 до WM_USER-1
0x8000 до 0xBFFF
SendMessage(Form1->Handle, WM_MyMessage, 0, iMessage)
...
Полное содержание
Подобный материал:
  1   2   3   4   5   6


АННОТАЦИЯ


Данное пособие предназначено для студентов II...V курсов, обучающихся или выполняющих лабораторные и практические задания по курсу 'Прикладное программирование' или создающих программное обеспечение (ПО) общего класса в среде операционный системы (ОС) WINDOWS (все версии).

Изложены основы создания WINDOWS-интерфейса прикладных программ с помощью RAD-систем (Rapid Application Design) Delphi и C++Builder фирмы Borland. Рассмотрены вопросы практического применения интерфейсных элементов WINDOWS для ввода и вывода пользовательских данных и управления выполнением программы. Приведена информация о RAD-системе Kylix для работы в среде ОС Linux.

Данное пособие НЕ ЯВЛЯЕТСЯ полным и всеобъемлющим руководством по созданию прикладных программ с помощью Delphi и C++Builder (для изучения конкретных вопросов следует обратиться к соответствующим литературным источникам); однако после изучения пособия имеющий некоторый опыт создания ДОС-программ, программирования на языке Pascal и C++ и навигации в WINDOWS пользователь вполне сможет разрабатывать простые интерфейсы в стиле WINDOWS.

Требуемое аппаратное обеспечение для проведения работ - ПЭВМ класса IBM PC не хуже АТ/586 с размером ОП более 32 Мбайт с твердым диском объемом не менее нескольких Гбайт, дисплей класса не хуже VGA. Пакеты Delphi и C++Builder требуют более 150... 250 Мбайт дискового пространства.


СОДЕРЖАНИЕ


Введение ......................................................................................................




1.Цель работы...............................................................................................




2.Модель программирования и концепция многозадачности в

операционной системе WINDOWS........................................................




2.1.WINDOWS - операционная система, управляемая событиями.....




2.2.Понятие о сообщениях WINDOWS и их обработке.......................




2.З.Два способа передачи сообщений....................................................




3.Интегрированные среды Delphi / C++Builder........................................




3.1.Считывание, сохранение и создание проектов...............................




3.2.Oсновные файлы проекта Delphi......................................................




4.Создание простых WINDOWS-приложений.........................................




4.1.Форма - основа разработки приложения в Delphi.............................




4.1.1.Настройка свойств формы............................................................




4.1.2.Настройка связи событий с процедурами их обработки..........




4.1.3.Установка свойств во время выполнения приложения.............




4.1.4.Модальный и немодальный диалоги...........................................




4.1.5.Стандартные формы-панели сообщений....................................




4.1.6.Статическое и динамическое использование компонентов.....




5.Часто используемые элементы WINDOWS и их применение.............




5.1.Полезные невизуальные объекты Delphi / C++Builder...................




5.1.1.Класс TStringList............................................................................




5.1.2.Класс ТТimer..................................................................................




5.2.Компонент TEdit...............................................................................




5.З.Компонент TMemo.............................................................................




5.4.Koмпонент TLabeL.............................................................................




5.5.Компонент TCheckBox.......................................................................




5.6.Компонент TListBox...........................................................................




5.7.Компонент TComboBox.....................................................................




5.8.Компонент TRadioGroup....................................................................




5.9.Koмпонент TPanel...............................................................................




5.10.Компонент TBitBtn...........................................................................




5.11.Компонент TMediaPlayer.................................................................




5.12.Koмпонент TDriveComboBox..........................................................




5.13.Koмпонент TDirectoryListBox.........................................................




5.14.Koмпонент TFileListBox..................................................................




5.15.Koмпонент TBiSwitch......................................................................




5.16.Koмпонент TSpinEdit.......................................................................




5.17.Koмпонент TDirectoryOutline..........................................................




5.18.Koмпонент TGauge...........................................................................




5.19.Koмпонент TImage...........................................................................




5.20.Стандартные диалоговые окна WINDOWS и их применение.....




5.20.1.Компонент TOpenDialog.............................................................




5.20.2.Koмпонент TSaveDialog..............................................................




5.20.3.Компонент TFontDialog..............................................................




5.20.4.Компонент TColorDialog..........................................................




5.20.5.Компонент TPrintDialog............................................................




5.20.6.Koмпонент TPrintSetupDialog..................................................




5.20.7.Koмпонент TFindDialog............................................................




5.20.8.Koмпонент TReplaceDialog......................................................




5.21.Дополнительные компоненты Delphi и C++Builder.....................




5.22.Поддержка технологий DDE и OLE в Delphi и C++Builder.........




6.Стандартные меню WINDOWS...............................................................




6.1.Компонент ТМаinМеnu......................................................................




6.2.Компонент ТРорuрМеnu....................................................................




7.Рисование в Delphi и класс TCanvas.......................................................




8.Печать в Delphi..........................................................................................




9.Некоторые полезные функции и приемы программирования

в Delphi и C++Builder...............................................................................




9.1.Часто используемые функции и процедуры....................................




9.2.Приемы работы с командной строкой

и процессами-потомками...................................................................




9.3.Создание интерфейса, независимого от размеров окна.................




9.4.Oбработка ошибок и исключительных ситуаций...........................




9.5.Шаблоны приложений и форм..........................................................




10.Пример создания реального приложения в Delphi.............................




11.Возможность прямых системных вызовов WINDOWS.....................




12.Использование компилятора с командной строкой............................




13.0сновные отличия синтаксиса C++Builder'a от Delphi.......................




Заключение...................................................................................................




Список рекомендуемой литературы..........................................................






ВВЕДЕНИЕ


Известно, что до 50...70% времени на создание (с помощью традиционных средств) программного обеспечения (и часто столько же по объему) приходится на разработку интерфейсной части программы (функционирование окон ввода и вывода данных, управление режимами функционирования программы etc). Со­временные операционные системы (например, ОС WINDOWS, [1]), снабженные графическим интерфейсом и набором стандартных интерфейсных элементов, значительно облегчают нелегкий (и часто неприятный) процесс разработки ин­терфейса пользователя.

С другой стороны пользователь не отказался бы от механизма, облегчающего рутинную работу по программированию повторяющихся участков кода - таймеров, блоков обращения к базам данных, системам статистической обработки данных и разрешения стандартных математических уравнений, подсистемам сетевого доступа и многих других.

Начало 90-х годов ознаменовалось значительным ростом аппаратных воз­можностей персональных ЭВМ (ПЭВМ) и, в связи с этим, массовым переходом к использованию оболочки WINDOWS разработки Microsoft Corporation, снаб­женной дружественным графическим интерфейсом и обладающей возможностью многозадачности. Полное соответствие международным стандартам CUA (Common User Access), огромный набор системных процедур WINDOWS и отсут­ствие ограничений на создание собственных (концепция DLL-библиотек), возможность доступа к оперативной памяти практически неограниченного объе­ма и многие другие поддерживаемые возможности обусловили применение WINDOWS почти на каждом оснащенном ПЭВМ рабочем месте. Дальнейшее перерастание оболочки WINDOWS'3.1 в полноценную операционную систему WINDOWS'9x/WINDOWS’NT еще более увеличило интерес к ней (не всегда, впрочем, полностью оправданный).

Однако переход к новому поколению программных средств разработки при­кладных пользовательских программ значительно (до 3...5 лет) задержался - программирование под WINDOWS на 'старом добром' С (или Pascal'е) более чем нерационально, работа на C++ непроста даже с использованием библиотек клас­сов MFCL (Microsoft Foundation Class Library) фирмы Microsoft Corp. и OWL (Object Windows Library) фирмы Borland. Явно необходим был новый подход к созданию программного продукта уровня разработчика, что позволяло самому широкому классу программистов включиться в бесконечную гонку создания соб­ственных WINDOWS-приложений.

Новый подход действительно был разработан; соответствующие системы были названы RAD (Rapid Application Design - среды быстрой разработки при­ложений); основа этих систем - соответствующая библиотека классов VCL (Visual Components Library - библиотека визуализируемых классов). Конечно, RAD-системы не появились на пустом месте - одним из их 'прародителей' была широко известная библиотека Turbo Vision (имеющаяся в С- и Pascal-вариантах разработки Borland), полностью основанная на плодотворнейших идеях програм­мирования конца 20 века - объектно-ориентированном программировании (ООП). После внедрения Turbo Vision оставался лишь один прямо напраши­вающийся шаг - добавление возможностей работы с объектами как с визуальными сущностями именно на этапе проектирования интерфейса - DesignTime (используя естественную для WINDOWS концепцию 'перетаскивания' - Drag&Drop), и этот шаг был сделан в основанных на VCL-подходе RAD-системах.

В первом пятилетии 90-х годов приблизительно одновременно появились первые RAD-продукты - Visual Basic и Visual C++ (Microsoft Corp.), Delphi (Borland), Optima C++ и некоторые другие.

С точки зрения автора (давнего приверженца интегрированных сред фирмы Borland), наиболее удобным RAD-пакетом являются системы класса Delphi / C++Builder (nd.com.ru), обладающая удачным соотношением между сложностью (а значит, и определенной негибкостью при использовании) и широтой набора объектов (как ви­зуальных, так и невизуальных, что как раз и определяет гибкость). Огромным преимуществом интегрированных сред (ИС) Delphi (nd.com.ru/delphi) и C++Builder (nd.com.ru/cbuilder) является значительная открытость системы - возможно добавление (и удаление) специфических объектов (в соответствии с требованиями конкретного разработчика - например, разработчика баз данных, специалиста по численному моделированию, создателя малтимедиа-приложений etc); в настоящее время существуют (часто бесплатно распространяемые) сотни мегабайт самых разнообразных объектов, разработанных третьими фирмами и/или независимыми разработчиками. Наличие компилятора с командной стро­кой в стиле MS-DOS, поставляемые в комплекте EXPERT'ы (аналоги WIZARD'ов фирмы Microsoft Corp.), регулярный выпуск новых версий Delphi делают Delphi не только удобным, но перспек­тивным продуктом разработчика.

Недостатки Delphi - определенная 'раздутость' выполняемых файлов (всегда являющаяся оборотной стороной легкости этапа разработки); причем невозможность множественного наследования в базовом для Delphi языке программирования Borland Object Pascal 8.0 практически не ограничивает разработчика.

Весной 1997 году Borland выпустила полностью С-базированную версии RAD / VCL-среды (получившую название Borland C++Builder), что позволило включить в список сегодняшних клиентов фирмы Borland армаду С-программистов. Есть надежды на достаточно быстрое и безболезненное внедре­ние C++Builder'a в практику разработчиков WINDOWS-приложений (хотя разработчики Borland не славятся эффективными С-компиляторами). Набор (палитра) компонентов C++Builder'a полностью соответствует таковой для Delphi. Последние версии указанных пакетов отличаются мощной поддержкой разработки программных продуктов, предназначенных для эксплуатации в сети InterNet и объектов ActiveX.

В целом семейство интегрированных сред Delphi / C++Builder фирмы Borland столь хороши, что более чем конкурентоспособны с (несколько запоздавшим) пакетом Developer Studio фирмы Microsoft Corp. На грани нового 21 века Borland предложила аналог Delphi для разработки приложений на платформе Linux - интегрированную среду Kylix [14] (nd.ru/kylix/index.php), обладающую практически

Разработчики пакетов Delphi и C++Builder расширяют ассортимент своих продуктов в иные области информационных технологий

  •  Поддержка Java-ориентированных технологий многоплатформенных приложений - собственноразработанная интегрированная среда JBuilder (nd.com.ru/jbuilder).
  •  Разработка средств управления и мониторинга объектных распределенных систем Inprise AppCenter (управление объектами технологии CORBA и Enterprise Java Beans (EJB), см. nd.com.ru/appcenter.
  •  Применение интегрированного комплекса средств Inprise Application Server (IAS) на основе стандартов CORBA и J2EE (nd.com.ru/appserver).
  •  Внедрения многозвенной архитектуры MIDAS (MulIi-tier Distributed Application Services); данная технология расширяет возможности предложенной ранее Microsoft Corp. технологии DCOM (Distributed Component Object Model) и поддерживается начиная с Delphi 3 и C++Builder 3 (nd.com.ru/midas).


Таким образом, в данной работе именно система Delphi выбрана базовой для разработки пользовательских WINDOWS-приложений; в соответствующих местах после заголовка абзаца C++Builder будут приведены данные по пакету C++Builder; подробнее о различиях см. также раздел 13.

На WEB-сайте ac.ru/pilger_roll автора данной работы можно найти примеры разработок на Delphi и C++Builder, иллюстрирующие некоторые особенности применения указанных ИС.

Введение в возможности Delphi и C++Builder по работе с базами данных приведено в методической раз­работке 'Введение в язык SQL запросов к базам данных' того же автора.


1. ЦЕЛЬ РАБОТЫ


Целью работы является дать первоначальные теоретические знания о функ­ционировании ОС WINDOWS и рассмотреть практические основы создания приложений в системах Delphi / C++Builder. После ознакомления с данным ме­тодическим руководством (желательно параллельно с работой на ПЭВМ) пользователь сможет разрабатывать простые WINDOWS-приложения; данная основа и постоянная практика позволят программисту стать профессионалом.

Для желающих самостоятельно изучать дополнительную литературу (а это наряду с ежедневной работой на ЭВМ является единственным способом приобрести профессиональные знания) можно рекомендовать литературные источники [1] для ознакомления с идеологией функционирования WINDOWS, [2] для знакомства с объектно-ориентированной версией языка Pascal, источник [3] для освоения малтимедийных возможностей WINDOWS, [4] для изучения функций WINDOWS API, [5,10] для создания при­ложений с помощью Delphi, [6,7,10] для освоения возможностей Delphi по работе с базами данных, [7] для практики работы с Delphi (в частности, разра­ботки собственных компонентов), [8] как прекрасный справочник по стандартным компонентам Delphi и [9] в качестве руководства для продвину­тых Delphi-программистов.

Для ознакомления с версией C++ для C++Builder'a можно рекомендовать работу [11].


2. МОДЕЛЬ ПРОГРАММИРОВАНИЯ И КОНЦЕПЦИЯ

МНОГОЗАДАЧНОСТИ В ОПЕРАЦИОННОЙ

СИСТЕМЕ WINDOWS


Принципиальная разница между программированием на стандартном языке С и программированием в WINDOWS состоит в том, что все программы для WINDOWS разрабатываются на основе понятия передачи сообщений. Каждая программа для WINDOWS имеет цикл ввода сообщений и (для каждого из окон) - свою процедуру обработки сообщений.

Таким образом, сущность программирования в WINDOWS состоит в приня­тии сообщения (а при необходимости и генерации оного), пересылке его в то окно, для которого оно предназначено, возможно быстрой обработке этого сообщения и возврата к чтению следующего сообщения [1].

Зачем передавать сообщения ? Дело в том, что WINDOWS - многозадачная ОС, способная выполнять одновременно несколько программ; при этом ни одна программа не должна захватывать центральный процессор (ЦП) на слишком долгое время (так как это может вызвать ошибки в параллельно выполняемых и чувствительных к замедлению программах). В приоритетных многозадачных ОС (например, UNIX) выполнение программы прерывается по истечению априорно отведенного ей кванта времени (даже если в этот момент заканчивается важная и неотложная операция). В WINDOWS параллельное выполнение не является при­оритетным - передача управления от одной задачи к другой производится в явном виде самими этими задачами. WINDOWS функционирует как многозадач­ная ОС каждый раз, когда прикладная программа анализирует очередь сообщений. Если предназначенных данной программе сообщений не оказывает­ся, WINDOWS начинает искать сообщения для других активных в данный момент программ и передает управление той, для которой сообщение имеется; далее процесс повторяется.

При разработке предназначенной для WINDOWS программы ее необходимо структурировать таким образом, чтобы она могла поддерживать передачу управления по вышеописанной схеме. Если не принять соответствующих мер, внешне корректная вновь созданная программа, возможно, будет работоспособ­ной, но запущенные вместе с ней другие программы сильно рискуют остановиться вовсе (программа монопольно займет ресурсы всей ОС).

Заметим, что вышеприведенный метод реализации многозадачности в WINDOWS носит название кооперативной многозадачности (cooperative multitasking) и является единственным для WINDOWS'3.1; в ОС WINDOWS'9x (и, соответственно, WINDOWS’NT) реализован метод так называемой вытесняющей многозадачности (preemptive multitasking), при этом ОС сама решает, у какой программы отобрать управление и какой его передать (кооперативная многозадачность оставлена в WINDOWS'9x только в целях поддержки 16-битных приложений). Каждое 32-битное приложе­ние в WINDOWS'9x имеет отдельную очередь сообщений и не зависит от того, как другие задачи работают со своими очередями (поэтому ситуация 'повисания системы' вследствие слишком редкой проверки очереди сообщений 16-битным приложением теоретически невозможна).

Кроме сказанного, 32-битные приложения в WINDOWS'9x могут использо­вать особый механизм - многопоточность (multithreading). В принятой для WINDOWS'9x терминологии исполняемое 32-битное приложение называется процессом (process); процесс состоит как минимум из одного потока.

Поток (thread) - часть кода программы, которая может выполняться одновременно с другими частями кода; потоки в пределах одного процесса используют одно адресное пространство, описатели оьъектов и иные общие ресурсы, но имеют отдельные счетчики команд; приоритетностью выполнения потоков (как и процессов) управляет ядро ОС на основе системы приоритетов. Потоки являются средством обеспечения параллельности обработки данных и часто используются для выполнения в программе асинхронных операций (asynchronous operations) - операций, которые могут быть инициализированы в любое время безотносительно к основному течению программы (лежащий на поверхности пример - периодическое сохранение редактируемого документа или опрос устройства пользовательского ввода - например, ‘мыши’ или клавиатуры). Потоки требуют меньших издержек, создаются (и уничтожаются) быстрее процессов (поэтому их иногда называют ‘дегковесными процессами’). В связи с использованием всеми потоками данного процесса общей памяти (конечно, за исключением индивидуальных стеков и содержимого регистров) обмен данными между ними предельно прост; по этой же причине создание использующего многопоточность приложения требует особой тщательности вследствие возможности случайного ‘пересечения’ по адресному пространству и/или нарушения последовательности операций (например, чтения/записи). ИС Delphi и C++Builder предоставляют родительский класс (в смысле ООП) TThread для реализации потоков [10].

Операционная система с симметричной мультипроцессорной обработкой (symmetric multiprocessing, SMP); такая как WINDOWS’NT, может выполнять на любом процессоре как код пользователя, так и код собственно ОС; при превышении числом потоков числа процессоров поддерживается многозадачность путем разделения времени каждого процессора между всеми ожидающими потоками.

Разработчики WINDOWS’NT ввели понятие волокон (fibers); волокном называется небольшой (‘облегченный’) поток, планировку которого осуществляет приложение.


2.1. WINDOWS - ОПЕРАЦИОННАЯ СИСТЕМА,

УПРАВЛЯЕМАЯ СОБЫТИЯМИ


WINDOWS генерирует сообщение, когда происходит какое-либо событие или должно быть выполнено действие. Например, при перемещении 'мыши' (а это типичное событие) генерируется сообщение, указывающее (в числе других параметров) координаты точки, в которой находится курсор. Таким же образом сама ОС WINDOWS информирует прикладную программу о том, что в меню был выбран определенный пункт (например, 'Прекратить выполнение').


2.2. ПОНЯТИЕ О СООБЩЕНИЯХ WINDOWS И ИХ ОБРАБОТКЕ


Все сообщения в WINDOWS строятся в соответствии со строго определен­ным и компактным форматом. Любители C++ могут заглянуть в файл WINDOWS.H и проанализировать структуру сообщений MSG


/* структура сообщения WINDOWS */

typedef struct tag MSG

{

HWND hwnd;

WORD message;

WORD wParam;

LONG IParam;

DWORD time;

POINT pt;

} MSG;


Первый элемент приведенной структуры указывает на окно, которому предназначено сообщение (каждому окну присвоен уникальный номер - handle, идентифицирующий окно в течение сеанса работы в WINDOWS). Второй эле­мент сообщения - идентификатор сообщения (начинающийся с символов WM_ идентификатор, см. файл WINDOWS.H). Третий и четвертый элементы (wParam и IParam) несут дополнительную информацию. В элементе time содержится время помещения события в очередь, в pt - координаты 'мыши' в этот момент.

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

Сообщения анализируются в цикле, который имеется в каждой написанной для WINDOWS программе. Ниже даны С- и Pascal-варианты указанного цикла.


// С - вариант цикла обработки сообщений

MSG msg; // объявление структуры типа MSG

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}


{ Pascal - вариант цикла обработки сообщений }

while GetMessage(Message, 0, 0, 0) do

begin

TranslateMessage(Message);

DispatchMessage(Message);

end;


Функция GetMessage ищет (сканируя очередь) сообщение в очереди данной программы. Если сообщений не найдено, анализируется системная оче­редь, где распознаются поступившие от клавиатуры или 'мыши' сообщения; если таковых не оказалось, прикладная программа 'засыпает'. Функция GetMessage приостанавливает выполнение программы до тех пор, пока в очередь сообщений данной программы поступит какое-либо сообщение, далее поступившее первым сообщение извлекается и выполнение программы возобновляется.

Функция GetMessage возвращает значение FALSE, если получено сообщение WM_QUIT, означающее, что программа должна закончить работу.

Функция TranslateMessage обрабатывает только поступившие с клавиатуры сообщения, преобразуя последовательность событий типа 'клавиша отпущена / клавиша нажата' в одно из следующих сообщений WM_DEADCHAR, WM_SYSCHAR и WM_SYSDEADCHAR.

Последняя в цикле функция DispatchMessage передает сообщение в окно (реально - связанной с данным окном процедуре обработки сообщений).

В действительности с каждым окном, создаваемым под управлением WINDOWS, связана некоторая функция обработки сообщений, именуемая оконной функцией WinProc. Связывание соответствующей WinProc-функции с заданным окном осуществляется присвоением имени WinProc-функции полю lpfnWndProc структуры типа WNDCLASS, определяющей данное окно, и регистрацией класса окна функцией RegisterClass.

При вызове SendProc или DispatchMessage в действительности вызывается именно функция WinProc (ниже приведен пример данной функции, оформленной как С-функция с Pascal-вызовом); приведенная функция обрабатывает всего два стандартных сообщения WINDOWS - WM_PAINT (перерисовать окно - в данном простейшем случае вывести в окно заданный текст) и WM_DESTROY (уничтожить окно)


LONG FAR PASCAL

WinProg_1(HWND hWnd, // идентификатор данного окна

WORD msg, // код кообщения

WORD wParam,

LONG lParam)

{

HDC hdc; // дескриптор устройства вывода

PAINTSTRUCT ps; // параметры отображения окна

RECT rect; // размер клиентской области вывода


switch (msg)

{

// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

case WM_PAINT: // полность перерисовать окно

hdc=BeginPaint(hWnd, &ps); // взять дескриптор устройства

GetClientRect(hwnd, (LPRECT) &rect); // определить область вывода

DrawText(hdc, (LPSTR) ‘’Hello, BAKANOV !’’, // выдать текст

-1, (LPRECT) &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hWnd, &ps); // освободить дескриптор устройства

break;

// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

case WM_DESTROY: // уничтожить окно

PostQuitMessage(0);

break;


// обработать другие сообщения Windows


default: // обработчик по умолчанию (обязательная