- •Часть 2
- •Оглавление
- •1. Структурный подход к программированию
- •1.1. Цели структурного программирования
- •1.2. Основные принципы структурного подхода
- •1.3. Спецификация программ
- •1.4. Метод пошаговой детализации
- •2. Предыстория объектно-ориентированного программирования
- •2.1. Введение в объектно-ориентированное программирование
- •2.2. Тип Объекты
- •2.3. Основные понятия ооп. Инкапсуляция. Наследование
- •X, y : integer; {координаты позиции}
- •XX,yy:array [1..1000] of integer;
- •2.4. Совместимость объектных типов по присваиванию
- •2.5. Описание типа-потомка
- •2.6. Полиморфизм
- •2.7. Виртуальные методы. Конструкторы и деструкторы
- •2.7.1. Правила работы с виртуальными методами
- •3. Типы данных и операторы языка object pascal в delphi
- •3.1. Предопределенные типы данных
- •3.1.1 Вещественные типы
- •3.1.2. Длинные строки
- •3.2. Структурированные типы
- •3.2.1. Множества
- •Var MySet: set of 'a'..'z';
- •3.2.2. Массивы
- •Var FlexArray: array of Real;
- •Var Ints: array of array of Integer;
- •3.2.3. Записи
- •Var Record1,Record2:tDateRec;
- •3.2.4. Указатели
- •I: Integer;
- •V1,v2,v3,v4,v5:Variant;
- •I:Integer;
- •3.3. Типы данных, специфичные для Windows
- •3.3.1. Приведение и преобразование типов
- •3.4. Операторы языка Паскаль
- •I:Integer;
- •I:Integer;
- •3.4.1. Элементы управления редактированием
- •3.5. Процедуры и функции библиотеки vcl
- •4. Реализация ооп на языке pascal
- •V: Real;
- •Наследование
- •Virtual;
- •Конструкторы и деструкторы
- •Перекрытие методов
- •5. Программирование в среде delphi
- •5.1. Основные элементы
- •5.2. Реализация объектно-ориентированного программирования
- •5.3. Разработка интерфейса приложения
- •5.3.1. Создание простейшего Windows-приложения
- •5.3.2. Создание Windows-приложения с метками и кнопками
- •Объект Свойство Значение
- •6.1.3. Меню Edit
- •6.1.4. Меню Search
- •6.1.5. Меню View
- •6.1.6. Меню Run
- •6.1.7. Меню Component
- •6.1.8. Меню Tools
- •6.1.9. Полоска кнопок быстрого доступа SpeedBar
- •6.1.10. Локальные меню. SpeedMenu
- •6.2. Работа с формами
- •6.2.1. Палитра компонентов
- •6.2.2. Object Inspector
- •6.2.3. Написание кода
- •6.2.4. Компиляция проекта
- •6.2.5. Интегрированный отладчик
- •6.2.6. Файлы, создаваемые системой
- •7. Структура delphi-программ
- •7.1. Разработка проекта Dialog
- •7.2. Процедуры вызова диалоговых окон
- •7.3. Преобразования типов
- •Var factW,optW,Rost,Delta:integer;
- •Var factW,optW,Rost,Delta:real;
- •7.4. Простейшие компоненты
- •7.4.1. Группы радиокнопок - компоненты RadioGroup, RadioButton, GroupBox
- •7.4.2. Компоненты выбора из списков - ListBox, ComboBox
- •7.4.3. Многострочные окна редактирования Memo и Richedi
- •7.4.4. Графические объекты
- •If OpenDialog1.Execute
- •Image1.Picture.LoadFromFile
- •7.4.5. Канва и пиксели
- •X, y :real; // координаты функции
- •7.4.6. Воспроизведение немых видео клипов – компонент Animate
- •7.4.7. Установка и настройка приложения: работа с файлами *.Ini
- •IniFile.Free;
- •Упражнения
- •8. Репозиторий объектов и эксперты
- •8.1. Страницы репозитория объектов
- •8.1.1. Страница New
- •8.1.2. Страница Forms
- •8.1.3. Страница Dialogs
- •8.1.4. Страница Data Modules
- •8.1.5. Страница Projects
- •8.2. Эксперты Delphi
- •8.2.1. Application Expert
- •8.2.2. Dialog Box Expert
- •9. Классы и модули
- •9.1. Классы и сокрытие информации
- •9.2. Классы и модули
- •9.3. Модули и область видимости
- •9.4. Модули и программы
- •9.5. Информация о типе на этапе выполнения
- •If MyAnimal is Dog then …
- •If MyAnimal is Dog
- •If MyAnimal is Dog then
- •10. Использование компонентов
- •10.1. Буксировка из одного компонента в другой
- •10.2. Обработка исключений
- •10.3. Восприятие ввода для пользователя
- •Val( Edit1.Text,Number,Code);
- •Val((Sender as tEdit).Text,Number,Code);
- •11.2. Различные роли элементов меню
- •11.3. Редактирование меню с помощью Menu Designer
- •If OpenDialog1.Execute
- •If SaveDialog1.Execute
- •Procedure tForm1.ViewEdit1Click(Sender:tObject); begin
- •If Panel1.Visible
- •If Buttons1.Enabled
- •12. Получение «ввода от мыши» и рисование в форме
- •12.1. События, связанные с мышью
- •12.2. Рисование в форме
- •If ssShift in Shift
- •If Circle then Canvas.Ellipse(Center.X-Radius.X,Center.Y-
- •Else Canvas.Rectangle(Center.X-Radius.X,Center.Y-
- •12.3. Черчение и рисование в системе Windows
- •13. Инструментальная линейка и строка состояния
- •13.1. Построение инструментальной линейки
- •Procedure tForm1.SpeedButton1Click(Sender:tObject); begin
- •If SpeedButton1.Down
- •13.2. Добавление всплывающих подсказок в линейку
- •13.3. Комбинированный список в инструментальной линейке
- •13.4. Построение строки состояния
- •14.1. Добавление второй формы в программу
- •14.2. Создание диалоговой панели
- •Задание № 1
- •Procedure tForn1.BitBtnClick(Sender:tObject); begin PageControl1.SelectNextPage(true);
- •Do ListBox1.Items.Add(PageControl1.Page[I].Caption);
- •14.3.1. Блокнот с набором ярлыков
- •If FontDialog1.Execute
- •15.2. Жизненный цикл программного средства
- •15.3. Понятие качества программного средства
- •15.4. Обеспечение надежности основной мотив разработки программных средств
- •15.4.1. Методы борьбы со сложностью
- •15.4.2. Обеспечение точности перевода
- •15.4.3. Преодоление барьера между пользователем и разработчиком
- •15.4.4. Контроль принимаемых решений
- •Литература
- •Часть 2. Объектно-ориентированное программирование
Procedure tForn1.BitBtnClick(Sender:tObject); begin PageControl1.SelectNextPage(true);
end;
Другая кнопка вызывает ту же процедуру, передавая значение false в качестве параметра для выбора предыдущей страницы. Свойство SelectNextPage рассматривает последнюю страницу как единственную перед первой, и перемещение происходит непосредственно между этими страницами. Существует третий метод, доступный для изменения страниц (после ярлычков и кнопок). Компонент список (ListBox) заполняется с помощью метода FormCreate путем копирования заголовка каждой страницы (свойство Page хранит список объектов TabSheet):
for I:=0 to PageControl1.PageCount–1
Do ListBox1.Items.Add(PageControl1.Page[I].Caption);
14.3.1. Блокнот с набором ярлыков
Стандартный подход к построению блокнота с ярлыками в Delphi предполагает использование двух раздельных компонентов NoteBook и TabSet. На этапе проектирования можно работать на страницах блокнота, изменяя значение его свойства PageIndex; вы не можете щелкать на ярлысках, как с компонентами PageControl. Как только вы вводите новое значение для свойства PageIndex или ActivePage в Object Inspector, соответственно изменяется видимая страница блокнота. Можно также выбрать локальное меню блокнота, в котором имеются команды для перемещения к следующей и предыдущей странице.
Альтернативой применения PageControl, TabSet и NoteBook является использование компонента TabbedNoteBook.
Задание № 2
Поместите в форму компонент NoteBook, а затем компонент TabSet и выровняйте последний с нижней частью формы (alButtom), а компонент NoteBook с клиентской областью (alClient). Присвойте названия страницам блокнота, выбирая свойство Pages и вводя некоторые значения в соответствующем редакторе. Подготовте ярлыки с помощью ввода некоторых строк для свойства Tabs.
Чтобы соединить блокнот с множеством ярлыков, нужно записать код для события OnChange компонента TabSet:
procedure TForm1.TabSet1Change(Sender:TObject;NewTab:
Integer; var AllowChange:Boolean);
begin
NoteBook1.PageIndex:= NewTab;
end;
Вы можете активизировать страницу, используя также их названия (свойство ActivePage блокнота) вместо индекса (свойство PageIndex). Это возможно, если только названия страниц совпадают с названиями ярлыков.
NoteBook1.ActivePage:=TabSet1.Tabs[NewTab];
Задание № 3
В форму поместите компонент TabbedNoteBook в форму. Создайте три страницы. Поместите кнопку Close, которая должна присутствовать на всех страницах.
На первой странице блокнота поместите список (ListBox) с названиями страниц. Чтобы изменить страницы в блокноте с помощью ListBox, напишите следующий код:
procedure TForm1.ListBox1Click(Sender:TObject);
begin
TabbedNoteBook1.PageIndex:=ListBox1.ItemIndex;
end;
На второй странице блокнота поместите компонент FontDialog и кнопку для изменения шрифта. Чтобы изменить шрифт, когда пользователь щелкнет по соответствующей кнопке, запишите код:
If FontDialog1.Execute
then TabbedNoteBook1.TabFont:= FontDialog1.Font;
Задание № 4
В форму поместите компонент DriveComboBox и DirectoryListBox. На правой стороне формы поместите компонет Image и под ним - TabSet.
Когда пользователь выбирает новый каталог, ярлыки должны сразу вывести на экран имена файлов с растровыми изображениями ярлыков каждый раз, когда изменяется выбор в списке каталога. Для этого поместите компонент FileListBox в форму (поместите его позади других компонентов или присвойте его свойству Visible значение False). Затем измените свойство Mask списка файлов на *.bmp. Для того чтобы связать компонент DirectoryListBox с компонентом FileListBox, запишите в окне Object Inspector для свойства DirectoryListBox следующее имя компонента: FileListBox1. Теперь добавьте метод для обработки события OnChange списка каталога:
procedure TForm1.DirectoryListBox1Change(Sender:TObject);
begin
with FileListBox1
do if Item.Count = 0
then begin
TabSet1.Tabs.Clear;
Image1.Visible:= False;
TabSet1.Tabs.Add(‘None’);
end
else begin
Image1.Visible:= True;
TabSet1.Tabs:= FileListBox1.Items;
end;
end;
Когда ярлыки выводят на экран имена файлов, для загрузки соответствующего растрового изображения в компонент Image используется следующий код:
procedure TForm1.TabSet1Change(Sender:TObject;
NewTab:Integer;var AllowChange:Boolean);
begin
if TabSet1.Tabs[NewTab] <> ‘None’
then TabSet1.Tabs[NewTab];
end;
15. ОБЩИЕ ПРИНЦИПЫ РАЗРАБОТКИ ПРОГРАММ
15.1. Специфика разработки программных средств
Разработка программных средств (ПС) имеет ряд специфических особенностей:
Прежде всего следует отметить некоторое противостояние: неформальный характер требований к ПС (постановки задачи) и понятия ошибки в нем, но формализованный основной объект разработки программы ПС. Тем самым разработка ПС содержит определенные этапы формализации, а переход от неформального к формальному существенно неформален.
Разработка ПС носит творческий характер (на каждом шаге приходится делать какой-либо выбор, принимать какое-либо решение), а не сводится к выполнению какой-либо последовательности регламентированных действий. Тем самым эта разработка ближе к процессу проектирования каких-либо сложных устройств, но никак не к их массовому производству. Этот творческий характер разработки ПС сохраняется до самого ее окончания.
Следует отметить также особенность продукта разработки. Он представляет собой некоторую совокупность текстов (т. е. статических объектов), смысл же (семантика) этих текстов выражается процессами обработки данных и действиями пользователей, запускающих эти процессы (т. е. является динамическим). Это предопределяет выбор разработчиком ряда специфичных приемов, методов и средств.
Продукт разработки имеет и другую специфическую особенность: ПС при своем использовании (эксплуатации) не расходуется и не расходует используемых ресурсов.
