- •230100 Информатика и вычислительная техника
- •Введение
- •1.Функции
- •1.1. Создание пользовательских функций. Передача аргументов
- •1.2. Глобальные и локальные переменные
- •2.Процедуры
- •2.1. Пользовательские процедуры
- •2.2. Упреждающее объявление процедур и функций (forward)
- •3.Концепция типа данных
- •3.1. Абстракции в обработке информации
- •3.2. Понятие типа данных
- •3.3. Иерархия типов данных
- •3.4. Стандартные типы данных
- •3.5. Тип данных Boolean
- •3.6. Тип данных char
- •3.7. Ограниченные типы
- •4.Множества. Массивы
- •4.1. Операции над множествами
- •4.2. Массивы
- •4.3. Утверждения о массивах
- •5.Индуктивные функции на последовательностях (файлах, массивах)
- •5.1. Схема Горнера
- •5.2. Индуктивные функции
- •6.Записи
- •6.1. Представление сложных типов данных в памяти
- •6.2. Упаковка элементов сложных типов данных
- •6.3. Представление записей в памяти
- •7.Процедуры и функции
- •7.1. Создание пользовательских функций. Передача аргументов
- •7.2. Процедуры
- •7.3. Передача параметров по ссылке и значению
- •8.Основы объектно-ориентированного подхода
- •8.1. Основные положения объектно-ориентированного подхода
- •9.Конструкторы и деструкторы. Инкапсуляция
- •9.1. Хранение объектов в памяти. Доступ к свойствам из методов
- •9.2. Принцип инкапсуляции
- •9.3. Поля и свойства
- •10.Наследование и полиморфизм
- •10.1. Принцип полиморфизма
- •10.2. Виртуальные методы
- •10.3. Пример описания объекта
- •10.4. Параметры-процедуры
- •11.Основы программирования графики
- •11.1. Основные понятия компьютерной графики
- •11.2. Получение сведений о режимах экрана. Эффекты прозрачности
- •11.3. Графические построения
- •11.4. Построение графиков функций
- •11.5. Использование компонента tChart
- •11.6. Построение геометрических фигур
- •11.7. Обновление изображения
- •12.Построение динамических изображений
- •12.1. Анимация на основе операции xor
- •12.2. Буферизация фона
- •12.3. Работа с таймером
- •13.Динамические структуры данных
- •13.1. Размещение динамических переменных в памяти
- •13.2. Захват и освобождение динамической памяти
- •13.3. Нетипизированные указатели
- •14.Линейные списки: основные виды и способы реализации
- •14.1. Линейный список как абстрактный тип данных
- •14.2. Операции с динамическими массивами
- •14.3. Сортировка динамических массивов
- •14.4. Деревья
- •14.5. Потоки в памяти
- •15.Сортировка и поиск
- •15.1. Алгоритмы поиска
- •15.1.1Линейный поиск
- •15.1.2Двоичный поиск
- •15.1.3Поиск текстовых строк
- •15.2. Сортировка данных
- •15.2.1Сортировка массивов
- •16.Сортировка файлов. Рекурсия
- •16.1. Рекурсивные определения и алгоритмы
- •16.2. Программирование рекурсивных алгоритмов
- •16.3. Сортировка файлов
- •17.Файлы
- •17.1. Буферизация
- •17.2. Работа с текстовыми файлами
- •17.3. Работа с двоичными файлами данных
- •17.4. Нетипизированные файлы
- •17.5. Файловые потоки
- •18.Работа с файловой системой
- •18.1. Стандартные файловые диалоги
- •18.2. Получение сведений о дисках
- •18.3. Получение сведений о файлах
- •18.4. Сканирование дисков и директорий
- •19.Обработка исключительных ситуаций
- •19.1. Векторы прерываний
- •19.1.1Хранение данных в стеке
- •19.2. Контроль ввода-вывода
- •19.3. Обработка исключительных ситуаций в Delphi
- •20.Отладка программ
- •20.1. Интегрированная среда программирования
- •20.2. Инструменты отладки программ
- •20.3. Типичные ошибки в программировании
- •21.Принципы построения трансляторов
- •21.1. Синтаксис и семантика языков программирования
- •21.2. Структура языков программирования
- •21.3. Структура и организация работы транслятора
- •22.Параллельные процессы
- •22.1. Создание многопоточных приложений
- •22.2. Управление скоростью работы потоков
- •23.Модульные программы
- •23.1. Создание dll-библиотеки на Delphi
- •23.2. Вызов dll
- •23.2.1Статическое связывание
- •23.2.2Динамическое связывание
- •23.3. Отладка проектов с dll
- •23.4. Хранение форм в dll-библиотеках
- •24.Обмен данными между приложениями
- •24.1. Работа с буфером обмена
- •24.2. Основы ole-технологии
- •25.События и сообщения
- •25.1. Отправка и получение сообщений
- •25.2. Предотвращение повторного запуска программы
- •26.1. Основы com-технологии
- •26.2. Вывод отчета при помощи Microsoft Word
- •26.2.1Проверка наличия сом-сервера на компьютере
- •Общее правило: при работе с любым сом-сервером запретите пользователю им пользоваться, пока с сом-сервером работает ваша программа.
- •26.3. Подключение к сом-серверу Word из Delphi
- •26.4. Управление форматированием документа
- •26.5. Работа с таблицами
- •26.6. Запуск Word из внешней программы
- •26.7. Работа с AutoCad по com-технологии
- •27.Принципы организации реляционных баз данных
- •27.1. Основные сведения о базах данных
- •27.2. Проектирование структуры базы данных
- •27.3. Нормализация структур баз данных
- •28.Работа с локальными бд
- •28.1. Драйвер баз данных bde
- •28.2. Создание баз данных
- •29.Программная обработка локальных бд
- •29.1. Редактирование локальных бд
- •29.2. Вывод бд на экран
- •29.3. Цветовое выделение строк бд
- •30.Работа с распределенными бд
- •30.1. Основы языка sql
- •30.2. Понятие алиаса
- •30.4. Подключение к sql-серверу
- •31.Программная обработка данных в архитектуре "клиент – сервер"
- •31.1. Программный доступ к полям бд
- •31.2. Фильтрация и сортировка данных
- •32.Работа с нормализованными бд
- •32.1. Связывание таблиц
- •32.2. Вычисляемые поля
- •33.Субд Interbase
- •33.1. Работа с сервером Local InterBase
- •33.2. Утилита InterBase Server Manager
- •34.Работа с языком xml
- •34.1. Структура xml-документа
- •34.2. Использование xml в среде Delphi
- •34.3. Концепция dom - объектная модель документа
- •34.4. Использование xml
- •35.Основы программирования для Интернет
- •35.1. Работа с протоколом ftp
- •35.2. Передача файлов по ftp
- •Библиографический список
- •Приложение. Зарезервированные слова sql
- •Предметный указатель
25.1. Отправка и получение сообщений
Прежде всего, нужно выбрать некоторый номер (идентификатор) сообщения. Весь диапазон допустимых номеров разделен на следующие части:
От |
До |
Значение |
0 |
WM_USER-1 |
Зарезервированы Windows |
WM_USER |
32767 |
Пользовательские |
32768 |
49151 |
Зарезервированы для будущих версий Windows |
49152 |
65535 |
Текстовые сообщения |
Здесь WM_USER – это константа, определенная в модуле Windows. Для своих сообщений удобно описать константу вида
CONST my_message=WM_USER+100;
Добавляемое число выбирается произвольно из диапазона 1..32767.
Программа-отправитель должна найти ссылку на окно программы-получателя. Поиск ведется по тексту в заголовке окна (то есть по содержимому свойства Caption главной формы). Вот как это делается:
var h:thandle;
begin
h:=FindWindow(nil, 'Form1');
Тип данных Thandle соответствует ссылке на окно (это целое число – системный номер окна). Функция FindWindow выполняет поиск окна по тексту в его заголовке (в рассматриваемом случае ‘Form1’). Первый параметр используется при поиске окна по типу данных (классу) и для поиска по заголовку устанавливается в NIL.
Если ссылка на окно не равна нулю, то окно найдено, и ему можно послать сообщение:
if h<>0 then
postmessage(h,my_message,0,0)
Здесь h – ссылка на окно программы-получателя, my_message – константа-номер сообщения, последние два нулевых параметра – дополнительные данные (две целочисленные переменные типа Longint), передаваемые вместе с сообщением.
Зарезервированные Windows сообщения представлены соответствующими константами. Их также можно использовать в пользовательских программах. Например, сообщение WM_CLOSE закрывает указанное приложение (именно оно посылается операционной системе окну программы при щелчке по крестику в правом верхнем углу окна или нажатии Alt+F4). Следующий код позволяет из программы на Delphi закрыть редактор Microsoft Word (при условии, что в нем не открыты никакие документы и заголовок его окна имеет вид "Документ1 - Microsoft Word'").
var h:thandle;
begin
h:=FindWindow(nil,'Документ1 - Microsoft Word');
if h<>0 then
PostMessage(h,WM_CLOSE,0,0)
end;
А как быть, если в Word открыт какой-то файл? Его название отображается в заголовке окна и оно нам неизвестно. Значит, и окно мы не найдем? Найдем! Ведь мы точно знаем, что в заголовке будет присутствовать текстовая строка "Microsoft Word". Значит, надо перебрать все окна и искать в заголовке каждого окна эту текстовую строку. Следующая функция именно это и делает. Ей на вход надо подать искомую текстовую строку и ссылку на собственное окно программы – с него начнется перебор окон.
function FindNextWnd(StartHWND: HWND; AString : String): HWND;
var
Buffer : array [0..255] of char;
s:STRING;
i:BYTE;
begin
FillChar(Buffer,256,#0);
Result := StartHWND;
repeat
Result := FindWindowEx(0, Result, nil, nil);
GetWindowText(Result, Buffer, SizeOf(Buffer));
i:=0;
s:='';
WHILE (i<=255) AND (buffer[i]<>#0) DO
BEGIN
s:=s+buffer[i];
INC(i)
END;
IF s<>'' THEN
if Pos(ANSIUpperCase(AString),ANSIUpperCase(s))<>0 then
Break;
until (Result = 0);
end;
Вызывается такая функция примерно следующим образом:
VAR h:HWND; r:INTEGER;
CONST MSW='Microsoft Word';
BEGIN
h:=FindNextWnd(Self.Handle,MSW);
IF h<>0 THEN
PostMessage(h,WM_CLOSE,0,0)
END;
Примененный здесь тип данных HWND эквивалентен типу THandle.
Теперь научимся принимать сообщения. Во-первых, в принимающей программе нужно описать точно такую же константу my_message. Описание одной и той же константы в двух разных проектах – дело не только некрасивое, но и потенциально опасное. Поэтому крайне желательно подобные «межпроектные» константы описывать в специальных файлах, которые затем могут подключаться к нескольким проектам. Такие файлы называются include-файлами и традиционно имеют расширение .inc. Внутри include-файла пишется фрагмент текста программы. Далее текст, содержащийся в include-файле, помещается в то место текста программы директива компилятора {$I имя include-файла}. Рассмотрим пример. Пусть на диске имеются папки Project1, Project2, Common (Рис. 25 .97).
Рис. 25.97. Структура папок и файлов при использовании include-файлов.
В папке Common хранится текстовый файл const.inc, содержащий текст:
CONST
my_message=WM_USER+100;
В файлах проекта (main.pas) в том месте, где по синтаксису языка возможно употребление оператора CONST, следует написать:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
{$i ..\common\const.inc}
При этом путь к файлу можно не брать в кавычки, если он не содержит пробелов. Таким образом, перед компиляцией в файл main.pas вместо строчки
{$i ..\common\const.inc}
будут вставлены строки
CONST
my_message=WM_USER+100;
Подобный прием (вынесение части текста программы в отдельный файл) широко используется в языке С. Следует заметить, что применение include-файлов никак не сокращает размер результирующего exe-файла, оптимизации здесь не происходит, так как все равно фрагменты исходного текста компилируются в обоих проектах.
Для получения сообщения необходимо создать обработчик события «получение сообщения №N». Удобнее всего создать такой обработчик как метод объекта-главной формы приложения:
type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure aaa(var msg:tmessage); message my_message;
{ Public declarations }
end;
…
procedure tform1.aaa(var msg:tmessage);
begin
MessageDlg(‘Получено сообщение!’,mtInformation, [mbOK],0)
end;
Ключевое слово message в описании заголовка обработчика указывает на то, что он должен автоматически вызываться при поступлении сообщения с номером my_message. Обработчик получает на вход переменную msg типа Tmessage. Данный тип представляет собой запись с вариантами следующей структуры:
type
TMessage =record
Msg: Cardinal; { номер сообщения }
caseIntegerof
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
Проще говоря, поля WParam и LParam содержат те самые дополнительные параметры, которые можно указывать в процедуре PostMessage(ссылка_на_окно,номер_сообщения,WParam,LParam. Если нужно рассматривать передаваемые параметры не как тип данных Longint, а как отдельные байты, то можно использовать поля WParamLo, WParamHi и LParamLo, LParamHi типа Word.