- •ВВЕДЕНИЕ
- •1. ИСТОРИЯ РАЗВИТИЯ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ, СИСТЕМЫ СЧИСЛЕНИЯ И ЕДИНИЦЫ ИНФОРМАЦИИ
- •1.1. История развития вычислительной техники
- •1.2. Системы счисления
- •1.3. Единицы информации
- •2. СТРУКТУРА ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА И ОПЕРАЦИОННЫЕ СИСТЕМЫ
- •2.1. Структура персонального компьютера.
- •3. ОСНОВЫ АЛГОРИТМИЗАЦИИ И РАБОТА В DELPHI
- •3.1. Основы программирования
- •3.2. Программирование в среде Delphi
- •4. БАЗОВЫЕ ЭЛЕМЕНТЫ DELPHI
- •4.1. Алфавит среды Delphi
- •4.2. Константы
- •4.3. Переменные
- •4.4. Основные типы переменных
- •4.5. Операции над переменными и константами
- •5. СТАНДАРТНЫЕ ФУНКЦИИ И ПОДПРОГРАММЫ
- •5.1. Математические функции
- •5.2. Функции преобразования
- •5.3. Дополнительные системные подпрограммы и функции
- •6. ОПЕРАТОРЫ DELPHI
- •6.1. Оператор присваивания
- •6.2. Оператор безусловной передачи управления
- •6.3. Условный оператор if
- •6.4. Оператор разветвления Case
- •6.5. Составной оператор
- •7. ОПЕРАТОРЫ ЦИКЛОВ
- •7.1. Оператор цикла For
- •7.2. Оператор цикла Repeat
- •7.3. Оператор цикла While
- •8. РАБОТА С МАССИВАМИ
- •9. РАБОТА СО СТРОКАМИ
- •9.1. Процедуры работы со строками
- •9.2. Функции работы со строками
- •10. РАБОТА С ЗАПИСЯМИ
- •11. ПРОЦЕДУРЫ И ФУНКЦИИ
- •12. МОДУЛЬ UNIT
- •13. РАБОТА СО МНОЖЕСТВАМИ
- •14. РАБОТА С ФАЙЛАМИ
- •14.1. Текстовые файлы
- •14.2. Типированные файлы
- •14.3. Нетипированные файлы
- •15. РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ
- •16. ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ И СТРУКТУРЫ ДАННЫХ
- •16.1. Динамические переменные
- •16.2. Работа со стеком
- •16.3. Работа со списками или очередями
- •16.4. Работа с деревьями
- •17.1. Объекты и классы
- •17.2. Области видимости класса
- •17.3. Свойства (Property) и инкапсуляция
- •17.4. Методы, наследование и полиморфизм
- •17.5. События (Events)
- •18.1. Выделение памяти под объект
- •18.2. Описание класса TObject
- •18.3. Операторы приведения типов классов
- •19. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
- •19.1. Два вида оператора Try
- •19.2. Программное создание исключительной ситуации
- •19.3. Основные исключительные ситуации
- •20. ОСНОВНЫЕ КЛАССЫ И ОБЩИЕ СВОЙСТВА КОМПОНЕНТОВ
- •20.1. Класс TList
- •20.2. Класс TStrings
- •20.3. Общие свойства компонентов
- •21. ГРАФИЧЕСКИЕ ВОЗМОЖНОСТИ DELPHI
- •21.1. Класс Tcanvas
- •21.2. Классы ТGгарhic и ТРicture
- •21.3. Классы TFont, TPen и TBrush
- •21.4. Работа с изображениями
- •22. ВИЗУАЛЬНЫЕ КОМПОНЕНТЫ DELPHI
- •22.1. Компонент TBitBtn
- •22.2. Компоненты TDrawGrid и TStringGrid
- •22.3. Компонент TPageControl
- •22.4. Компонент TTimer
- •22.5. Компонент TGauge
- •22.6. Компонент TСolorGrid
- •23. СТАНДАРТНЫЕ ДИАЛОГОВЫЕ ОКНА И ТИПОВЫЕ ДИАЛОГИ
- •23.1. Стандартные диалоговые окна
- •23.2. Типовые диалоги
- •24. ФОРМА, ПРИЛОЖЕНИЕ И ГЛОБАЛЬНЫЕ ОБЪЕКТЫ
- •24.1. Форма и ее свойства
- •24.2. Объект Application
- •24.3. Глобальные объекты
- •25. МЕЖПРОГРАММНОЕ ВЗАИМОДЕЙСТВИЕ
- •25.1. Обмен сообщениями
- •25.2. Динамический обмен данными
- •25.3. Совместное использование общей памяти
- •25.4. Каналы
- •25.5. Сокеты
- •26. ТЕХНОЛОГИЯ COM
- •26.1. Интерфейс
- •27. ТЕХНОЛОГИЯ АВТОМАТИЗАЦИИ
- •27.1. Основы OLE Automation
- •27.2. Примеры использования серверов автоматизации
- •27.3. Компоненты ActiveX
- •28. ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ
- •28.1. Создание DLL
- •28.2. Использование DLL
- •28.3. Пример написания DLL
- •29. РАБОТА С БАЗАМИ ДАННЫХ
- •29.1. Основные определения
- •29.2. Взаимодействие приложения на Delphi с базами данных
- •29.3. Компоненты взаимодействия с базами данных
- •29.4. Работа с локальной базой данных
- •30. ОСНОВЫ ЯЗЫКА SQL
- •30.1. Составные части SQL
- •30.2. Команда SELECT
- •30.3. Пример использования запросов в Delphi
- •31. СОЗДАНИЕ СОБСТВЕННЫХ КОМПОНЕНТОВ
- •32. РАБОТА С РЕЕСТРОМ
- •33. ПЕРСПЕКТИВЫ ПРОГРАММИРОВАНИЯ В DELPHI
Fftabstop.Free; // Освобождаем память из–под списка табуляции Inherited Destroy; // Вызываем наследуемый деструктор Destroy end;
end.
Для подключения своего значка к вновь созданному компоненту можно создать компонентный ресурсный файл с именем UListMy.dcr, в котором необходимо определить растровое изображение значка размером 24 х 24 пикселя и названием TListMy.
Запись новый строки в компонент ListMy1 можно осуществить оператором:
ListMy1.Items.Add(#09+’Иванов’+#09+’Инженер’);
При этом слова «Иванов» и «Инженер» будут располагаться с позиций, заданных в свойстве STabStop.
Если создается целый набор своих компонентов, то их можно поместить в один пакет. Для этого нужно пройти путь:
Component → Install Packages → Add
Затем нужно создать свой пакет и поместить в него свои компоненты.
32. РАБОТА С РЕЕСТРОМ
Системный реестр операционной системы Windows представляет собой общедоступную древовидную базу данных для хранения настроечной информации как самой Windows, так и других программ, установленных на компьютере. В первых версиях Windows все настройки программ и самой операционной системы хранились в специальных текстовых файлах с расширением «ini». С развитием системы таких файлов становилось все больше и больше. Они были разбросаны по разным каталогам, и стало очень сложно управлять такой системой. Начиная с Windows 95, вся настроечная информация стала заноситься в одно место – реестр. Работа с реестром в Delphi осуществляется через модуль Registry, а работа с реестром вне Delphi – системной программой RegEdit.exe.
С помощью реестра можно настроить нужным образом любую установленную на компьютере программу. Однако возможности реестра представляют основной интерес при создании собственных программ широкого применения – это и запись в реестр серийного номера программы, и подсчет числа вызовов вашей программы, и защита программы от копирования, и периодическое информирование разработчика о масштабах распространения вашей программы и многое другое.
Весь реестр разделяется на 5 ключевых областей:
•HKEY_CLASSES_ROOT – содержит информацию о расширениях файлов, классах и зарегистрированных в системе COM серверах. Содержимое этого ключа дублируется в разделе
HKEY_ LOCAL_MACHINE\SOFTWARE\Classes;
•HKEY_CURRENT_USER – содержит множество настроек программного обеспечения (информацию о конфигурации рабочего стола, клавиатуры и информацию о параметрах меню Пуск) текущего пользователя, т.е. того
157
пользователя, который в настоящий момент зарегистрирован в системе. Реестр копирует содержимое одного из подразделов в разделе HKEY_USERS в данный раздел и по окончании работы его обновляет;
•HKEY_LOCAL_MACHINE – содержит информацию, относящуюся к компьютеру: местонахождение драйверов, параметры настроек установленных на компьютере программ и COM–серверов. Он самый крупный и самый важный из всех разделов реестра. В нем содержится в одном из подразделов копия ключа HKEY_CLASSES_ROOT и все возможные варианты в зависимости от текущей аппаратной конфигурации содержимого раздела HKEY_CURRENT_CONFIG;
•HKEY_USERS – содержит описания настроек компьютера для всех зарегистрированных в системе пользователей. Подраздел Default является разделом HKEY_CURRENT_USER для конфигурации пользователя Windows по умолчанию;
•HKEY_CURRENT_CONFIG – содержит описание текущей конфигурации оборудования компьютера и является отражением одной из ветвей раздела HKEY_LOCAL_MACHINE\Config, в котором описаны все созданные в
системе конфигурации оборудования. Когда конфигурация меняется, меняется и содержимое раздела HKEY_CURRENT_CONFIG – он начинает «отражать» уже другую ветвь раздела HKEY_LOCAL_MACHINE\Config.
Физически, содержимое реестра находится в нескольких файлах и это зависит от версии Windows. Например, для Windows XP основные настройки реестра находятся в каталоге %SystemRoot%\System32\Config. Точный список файлов реестра можно посмотреть в разделе
HKEY_LOCAL_MACHINE\System \CotnrolSet\Control\HiveList\
Для работы с реестром в Delphi нужно:
•подключить модуль Registry, объявив его в операторе Uses,
•создать переменную типа TRegistry и вызвать ее конструктор,
•выполнить работы с реестром с помощью методов класса TRegistry,
•освободить память, занимаемую переменной типа TRegistry.
Остановимся на описании некоторых свойств и методов класса TRegistry:
•Property RootKey: HKEY; – определение текущего корневого ключа (один из возможных пяти, приведенных выше);
•Property CurrentKey: HKEY; – получение текущего открытого ключа реестра;
•Function OpenKey(const Key: String; CanCreate: Boolean): Boolean; – открытие ключа Key в текущем корневом каталоге, но если такого ключа нет, то он будет создан при CanCreate=True. Функция возвращает истину, если операция открытия ключа успешно выполнена;
•Function ReadString(const Name: String): String; – чтение значения параметра
Name строкового типа;
•Procedure WriteString(const Name, Value: String); – запись значения Value в
параметр Name строкового типа;
•Function CreateKey(const Key: String): Boolean; – создание нового ключа Key
в текущем ключе;
158
•Procedure CloseKey; – закрытие открытого ключа и запись изменений в реестр;
•Function DeleteKey(const Key: String): Boolean; – удаление из реестра ключа
Key. Корневые ключи не поддаются удалению;
•Function DeleteValue(const Name: String): Boolean; – очистка значения параметра Name;
•Function ReadInteger(const Name: String): Integer; – чтение значения параметра Name целого типа;
•Procedure WriteInteger(const Name: String; Value: Integer); – запись значения
параметра Name целого типа.
Рассмотрим пример записи в реестр некоторой информации о своей программе.
Uses …., Registry; // Подключаем к программе модуль Registry
………..
Var Reg:TRegistry; // Определяем указатель на реестр
Begin
Reg:=TRegistry.Create; // Выделяем память под реестр
//Устанавливаем корневой ключ
Reg.RootKey:=HKEY_LOCAL_MACHINE;
//Создаем в ключе Software ключ MyProgram
Reg.OpenKey(’Software\MyProgram’,True);
//Создаем в текущем ключе параметр ID и записываем в него
//серийный номер нашей программы: ABCD–1234.
Reg.WriteString(’ID’,’ABCD–1234’); Reg.CloseKey; // Закрываем ключ
Reg.Destroy;// Освобождаем память, выделенную ранее переменной Reg
End;
Работать с реестром можно также с использованием программы RegEdit.exe путем создания текстового файла с нужными изменениями и последующего вызова из Delphi программы RegEdit с передачей ей текстового файла через параметры командной строки.
Операции, которые мы сделали в предыдущем примере, можно оформить
иследующим образом:
//Первая строка текстового файла для формата NT4
Const RegID=’REGEDIT4’+#13#10;
//Строка ключа
RegPath:=’[HKEY_LOCAL_MACHINE\SOFTWARE\MyProgram]’+ #13#10;
// Задание имени параметра и его значения
|
RegNew=’”ID”=”ABCD–1234”’+#13#10; |
Var |
RegFile:TFileStream; // Переменная файлового потока |
RegCmd:String; // Командная строка
P:Pchar; // Указатель на строку с нулевым символом в конце строки
Begin
159
//Создаем текстовый файл
RegFile:=TFileStream.Create(’MyFile.reg’,fmCreate);
//Записываем в него управляющую строку
RegFile.Write(RegID[1], Length(RegID));
//Записываем текущий ключ реестра
RegFile.Write(RegPath[1], Length(RegPath));
//Записываем определения параметров для текущего ключа
RegFile.Wtite(RegNew[1], Length(RegNew));
//Закрываем файл
RegFile.Free;
//Определяем командную строку
RegCmd:=’RegEdit /s ’+’MyFile.reg’;
//Преобразуем обычную строку в указатель P
StrPCopy(P, RegCmd);
//Вызываем из Delphi программу EditReg и вносим в реестр изменения
WinExec(P, SW_MINIMIZE);
// Удаляем текстовый файл
If FileExists(’MyFile.reg’) then DeleteFile(’MyFile.reg); End;
Можно просканировать весь реестр в поисках заданных ключей и значений параметров с помощью следующей рекурсивной процедуры:
// Поиск в реестре значений параметров
Procedure Scanreg(skey,findpar:String;valpars:Tstringlist; var reg:Tregistry);
//SKey – ключ просмотра
//FindPar – имя искомого параметра
//ValPars – список найденных значений параметров
//Reg – указатель на реестр
var st:Tstringlist; // Внутренний список строк i:integer;s,s1:String;
dt:TRegDataType; Begin
// Открытие текущего ключа
if reg.OpenKeyReadOnly(skey) then Begin
st:=Tstringlist.create; |
|
|
reg.GetValueNames(st); |
// Получение списка параметров |
|
for i:=0 to st.count-1 do Begin |
// Проход по списку |
|
if st.Strings[i]=findpar then Begin |
|
|
dt:=reg.GetDataType(findpar); |
// Получение типа параметра |
|
if dt=rdstring then Begin |
|
|
s:=reg.ReadString(st.Strings[i]); |
// Получение значения параметра |
valpars.add(s); // Добавление значения в список значений параметров end;
end;
160