- •ВВЕДЕНИЕ
- •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
30.3. Пример использования запросов в Delphi
Сформируем форму так, как это показано на рис.30.1, и напишем обработчики событий создания формы и нажатия кнопки «Выполнить» следующим образом:
Procedure TForm1.FormCreate(Sender:TObject); Begin // Связь в БД определяется в файле DB1.udl
ADOConnection1.ConnectionString:=’File Name=DB1.udl’; ADOConnection1.Open; // Открываем соединение с БД
// Связываем компоненты доступа и управления БД
ADOQuery1.Connection:=ADOConnection1;
DataSource1.DataSet:=ADOQuery1;
DBGrid1.DataSource:=DataSource1;
End;
Procedure TForm1.Button1Click(Sender:TObject); Begin
// Закрываем активный запрос
If ADOQuery1.Active then ADOQuery1.Close; ADOQuery1.SQL.Clear; // Очищаем текст запроса ADOQuery1.SQL.Add(’Select * From TSpis;’); // Записываем запрос
// Выполняем запрос и выводим результат запроса в DBGrid1.
ADOQuery1.Open;
End;
ADOConnection1 |
ADOQuery1 |
DataSource1 |
DBGrid1
Button1
Рис.30.1. Форма с компонентами для работы с запросами
31.СОЗДАНИЕ СОБСТВЕННЫХ КОМПОНЕНТОВ
Всостав Delphi входит более 450 стандартных компонентов. Но иногда возникает необходимость усовершенствовать некоторые компоненты или создать свои новые компоненты. Все компоненты должны являться наследниками класса TComponent.
ВDelphi можно создать заготовку для нового компонента, пройдя путь:
153
File → New → Component или Component → NewComponent
После этого на экране появляется окно, в котором нужно определить:
•наследуемый класс (Ancestor Type);
•имя нового класса (Class Name);
•имя странички палитры компонентов (Paletter Page);
•место расположения файла с модулем нового компонента.
Врезультате получаем заготовку модуля Unit c процедурой регистрации компонента. Остается только дополнить этот модуль новыми возможностями и установить его, пройдя путь:
Component → Install Component
В итоге в палитре компонентов Delphi появится новый компонент.
Для нового компонента можно создать свой значек, войдя в графический редактор: Tools → Image Editor. В нем нужно создать компонентный ресурсный файл: File → New → Component Resource File, в котором задать растровое изображение значка размером 24 х 24 пикселя с палитрой из 16 цветов: Resource → New → BitMap. Далее нужно назвать новый ресурс именем класса компонента, причем используя только прописные буквы, затем сохранить ресурсный файл с именем модуля, описывающего компонент, и расширением «.dcr». При регистрации нового компонента ему будет автоматически присвоен новый значок.
Рассмотрим пример создания нового компонента – наследника класса TListBox, который будет поддерживать табуляцию строк. Табуляция строк нужна для разбивки содержимого строк на колонки, начинающиеся с определенной позиции в строке. Например, мы хотим вывести в виде таблицы фамилии и должности сотрудников. Фамилии, допустим, будут начинаться с 5–й позиции в строке, а должности – с 40–й. Стандартный компонент TListBox не поддерживает табуляцию, и так как фамилии имеют разное количество символов, в таблице названия должностей будут начинаться с разных позиций, что затрудняет ее восприятие.
Вновом компоненте предлагается в строки, помещаемые в новый LisBox, записывать между словами символы табуляции (код #09) и в класс компонента ввести новое свойство STabStop типа TStrings, в которое будем записывать в каждой ее строке номера позиций табуляции.
Врезультате получим компонент, который из таблицы
Иванов Инженер
Сидоренко Техник
Там Технолог позволит получить более воспринимаемую таблицу:
Иванов Инженер
Сидоренко Техник
Там Технолог
154
В этой таблице, в отличие от компонента TStringGrid, будет выбираться вся строка, а не отдельная ячейка таблицы.
Реализация такого компонента приведена ниже: unit Ulistmy;
interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TListmy = class(TListBox) // Имя нового класса – TListMy private
FfTabStop:TStrings; // Поле для хранения позиций табуляции // Метод задания позиций табуляции
Procedure SetTabStop(value:Tstrings); protected
public
Atabstop:Array[1..20] of integer; // Массив значений позиций табуляции
//Новый метод создания окна компонента
Procedure CreateWnd; override;
//Новый метод определения параметров окна компонента
Procedure CreateParams(var Params:TcreateParams);override;
//Новый конструктор компонента с выделением дополнительной памяти constructor create(Aowner:TComponent);override;
//Новый деструктор по освобождению памяти
Destructor Destroy;override;
// Метод задания компоненту массива значений позиций табуляции
Procedure tabset; Published
// Определяем новое свойство STabStop, доступное на этапе проектирования property STabStop:Tstrings read FfTabstop write SetTabStop;
end;
procedure Register; // Метод регистрации компонента implementation
procedure Register; begin
//Регестрируем новый компонент ListMy на страничке Samples
RegisterComponents('Samples', [TListmy]); end;
//Метод записи значений в свойство STabStop
Procedure Tlistmy.SetTabStop(value:TStrings); Begin
ffTabStop.Assign(value); // Запись значений в поле FFTabStop tabset; // Устанавливаем в компоненте новую табуляцию Invalidate; // Перерисовываем компонент
end;
155
Procedure TListmy.CreateParams(var Params:TCreateParams);
Begin
//Вызываем наследуемый метод задания параметров компонента inherited CreateParams(Params);
with Params do Begin
//Изменяем стиль окна нового компонента, разрешаем табуляцию
Style:=Style or $80{Lbs_Usetabstops};
end;
end;
Procedure Tlistmy.CreateWnd; var i,j,err:integer;s:String; Begin
//Вызываем наследуемый метод создания окна
Inherited CreateWnd;
tabset; // Устанавливаем табуляцию для нашего окна
end;
Procedure Tlistmy.Tabset; var i,j,err:integer;s:string; Begin
//Проверяем наличие строк, задающих позиции табуляции в FFTabStop if fFTabStop.count>0 then Begin
//Открываем цикл переписи позиций табуляции из FFTabStop в ATabStop for i:=1 to fFtabstop.count do Begin
s:=Fftabstop.strings[i-1];
val(s,j,err); // Переводим строку s в число j
if err<>0 then Atabstop[i]:=0 else
//Записываем позиции табуляции в ATabStop с учетом того, что ширина одного
//символа равна четырем базовым единицам Windows
Atabstop[i]:=j*4;
end;
end else Begin Atabstop[1]:=0; end;
// Посылаем сообщение окну нового компонента, устанавливающее табуляцию
SendMessage(Handle,LB_SetTabStops,
Fftabstop.count,Longint(@Atabstop));
end;
Constructor Tlistmy.Create(Aowner:Tcomponent); Begin
inherited Create(Aowner); // Вызываем наследуемый конструктор Create
//Выделяем память под список позиций табуляции
Fftabstop:=Tstringlist.create;
end;
Destructor Tlistmy.Destroy; Begin
156