ПРОГРАММИРОВАНИЕ НА DELPHI

Страница создана Афина Ильина
 
ПРОДОЛЖИТЬ ЧТЕНИЕ
ПРОГРАММИРОВАНИЕ НА DELPHI
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ
 (ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ)

     Кафедра автоматизированной обработки информации

    ПРОГРАММИРОВАНИЕ НА DELPHI

             МЕТОДИЧЕСКИЕ УКАЗАНИЯ
                 к лабораторным работам
                для студентов направления
          «Информатика и вычислительная техника»

                   ВЛАДИКАВКАЗ 2013
ПРОГРАММИРОВАНИЕ НА DELPHI
С о с т а в и т е л ь: доцент, к.т.н.
                                                         Будаева А.А.

Методические указания к лабораторным работам по дисциплине
«Программирование на Delphi» по специальности «Информатика и
вычислительная техника» предназначены для студентов 1 курса
при выполнении лабораторных работ
ПРОГРАММИРОВАНИЕ НА DELPHI
Оглавление

Общие методические указания к выполнению лабораторных работ ........................................... 4
Лабораторная работа № 1 .................................................................................................................. 5
Лабораторная работа №2 ................................................................................................................. 11
Лабораторная работа № 3 ................................................................................................................ 16
Лабораторная работа №4 ................................................................................................................. 19
Лабораторная работа №5 ................................................................................................................. 23
Лабораторная работа №6 ................................................................................................................. 27
Лабораторная работа №7 ................................................................................................................. 37
Лабораторная работа № 8 ................................................................................................................ 45
Лабораторная работа №9 ................................................................................................................. 58
Лабораторная работа № 10 .............................................................................................................. 61
Лабораторная работа № 11 .............................................................................................................. 66
Лабораторная работа №12 ............................................................................................................... 71
Список литературы .......................................................................................................................... 73
Приложение ...................................................................................................................................... 74
ПРОГРАММИРОВАНИЕ НА DELPHI
Общие методические указания к выполнению лабораторных работ

     При выполнении лабораторных работ необходимо:
1.   В соответствии с целью работы сформулировать задачу, которая должна быть решена
     с помощью приложения.
2.   Разработать алгоритм решения задачи.
3.   Разработать приложение, включающее интерфейс, программные модули
     вычислительных процедур, формы представления результатов.
4.   Выполнить компьютерное моделирование.
5.   Произвести тестирование алгоритма и приложения.
6.   Сделать выводы и обобщения.
7.   Составить электронный вариант отчета с результатами выполнения приложения.
     Образец оформления титульного листа приведен в приложении. При выполнении
     работ рекомендуется обратиться к литературе [1 - 9]
Лабораторная работа № 1
                    Тема: «Проектирование и реализация классов пользователя»

Цель:
   1) Изучение теоретических основ объектно-ориентированного программирования
   2) Приобретение практических навыков проектирования интерфейсов классов
   3) Приобретение практических навыков создания иерархии классов

Теоретическая часть

Объектно-ориентированное программирование (ООП) основано на понятиях класса и экземпляра.
Класс представляет собой объединенный набор данных и подпрограмм, предназначенных для
обработки этих данных. Например, класс данных «ученик» мог бы включать набор переменных,
содержащих информацию об ученике (имя и фамилия, класс, в котором он учится, баллы по
предметам и т.д.) – их называют свойства класса данных, и набор операций (их называют
методами), предназначенных для управления данными класса «ученик» (перевод в другой класс,
выставление оценки и т.д.).

Общие принципы ООП:
Инкапсуляция – объединение данных и методов их обработки; разделение доступа к данным между классами.
Наследование – классы объектов могут наследовать свойства друг друга; пример – классы «ученик»
и «преподаватель» наследуют некоторые свойства класса «человек».
Полиморфизм – методы объектов могут переопределяться. Пример – классы объектов
«прямоугольник» и «круг» могут иметь разные методы рисования с одним и тем же именем Draw()
В ООП программа представляет собой не просто последовательно исполняемый набор инструкций, а
совокупность подпрограмм, реагирующих на внешние события, такие как нажатие клавиши,
кнопки мыши и т.д.
Все современные языки программирования основаны на концепции ООП, позволяющий значительно
увеличить сложность программ и сократить время их разработки за счет более эффективного
повторного использования кода.

Пример. Пример объявления элементов класса
  type
  TForm1 = class(TForm) {Объявление класса-потомка через класс-предок}
   {Опубликованные элементы, заданные средой Delphi}
   Button1: TButton;
   Button2: TButton;
   procedure ButtonlClick(Sender: TObject);
   procedure Button2Click(Sender: TObject);
  private
   {Приватные элементы}
   FNumber: Integer;
  protected
   {Защищенные элементы}
   procedure SetNumber(ANumber: Integer); virtual;
  public
   {Общедоступные элементы}
   Count: Integer;
  published
   (Опубликованные элементы}
   property Number: Integer read FNumber write SetNumber;
  end;
В этом классе с именем TForm1, являющемся непосредственным потомком класса
TForm, используются все перечисленные выше секции.
      Элементы Button1, Button2, Button1Click и Button2Click созданы самой средой Delphi
и являются опубликованными.
      Элемент FNumber является приватным, и его нельзя использовать вне модуля, в
котором описан класс TForm1.
      Элемент SetNumber является защищенным, и его можно использовать только в классе
TForm1 и его потомках, независимо от того, в каких модулях они будут описаны.
      Элемент Count является общедоступным, и его можно использовать в любом месте
программы.
      Наконец, элемент Number также является опубликованным, но созданным
программистом, и его можно использовать всюду.
      В потомках класса можно изменять область доступности отдельных компонентов, за
исключением компонентов, объявленных в секции private. При этом можно лишь расширять
диапазон доступности, т.е. возможны следующие трансформации:
      protected —> public,
      protected -> published,
      public —> published.

                                            Методы

        Методы - это обычные подпрограммы (процедуры и функции), объявленные внутри
класса. Объявляются и описываются они так же, как и обычные подпрограммы в модулях,
т.е. в интерфейсе модуля внутри соответствующего класса записывается лишь заголовок, а в
исполнительной части - само содержание метода.
        При описании методов в исполнительной части допускается записывать сокращенный
заголовок без указания формальных параметров, а для функции - и без указания типа воз-
вращаемого результата. Если же заголовок записывается полностью, список формальных
параметров и тип возвращаемого результата для функции должны быть идентичны
первоначальному объявлению. При описании метода перед его именем должен быть
поставлен квалификатор, в качестве которого выступает имя класса (но не имя
соответствующей переменной).
        В отличие от обычных подпрограмм при обращении к методу ему передается
параметр Self - указатель на конкретный объект или класс, с которым осуществляется работа.
        При обращении к методу внутри класса, которому он принадлежит, используется его
имя с набором соответствующих параметров, а при обращении извне класса перед именем
метода ставится квалификатор, в качестве которого выступает либо имя объекта, которому
принадлежит метод (для обычных методов), либо имя класса, которому принадлежит этот
метод (для методов класса).
        В самом методе может быть обращение к методам предков. При обращении к методам
предков перед именем метода ставится квалификатор, в качестве которого выступает имя
класса-предка, для которого определен применяемый метод, либо используется
зарезервированное слово inherited. В последнем случае вызывается метод с указанным
именем ближайшего предка, обладающего этим методом.

                                 Конструкторы и деструкторы

      Конструкторы и деструкторы являются специальными подпрограммами, предназна-
ченными для создания и удаления конкретных объектов в процессе выполнения программы.
Они настолько важны и специфичны, что определяются специальными зарезервированными
словами.
Конструктор предназначен для создания в динамической области памяти объекта
соответствующего класса и инициализации.
       Объявляется конструктор с помощью зарезервированного слова constructor, после
которого, как и для других подпрограмм, следует имя конструктора с помещенным в
круглых скобках списком формальных параметров. По возможности конструктору следует
давать имя Create.
       При описании конструктора, как правило, сначала вызывается наследуемый
конструктор предка. Далее идет заполнение полей теми или иными значениями. Так как при
создании объекта все байты полей заполняются нулями, что соответствует нулевым
значениям чисел, пустым строкам, значению False логических величин, значению nil
указателей и т. д., то задавать следует только ненулевые значения.
       Для создания объекта конструктор вызывается как подпрограмма-функция, значение
которой присваивается имени объекта. При этом имя конструктора используется с
квалификатором, в качестве которого выступает имя класса, но не объект. Вызов этот
осуществляется, когда соответствующий объект еще не создан, с этой точки зрения
конструктор родствен так называемым методам класса, которые могут вызываться без
создания реальных объектов.
       Для объектов, создаваемых Delphi, конструктор, как правило, не используется, так как
они создаются автоматически вместе с объектом (например, с формой), в который они
входят.
       Деструктор предназначен для удаления из динамической области памяти объекта и
выполнения других побочных действий, связанных с удалением объекта.
       Объявляется деструктор с помощью зарезервированного слова destructor, после
которого, как и для других подпрограмм, следует имя деструктора, как правило, без списка
параметров. Как правило, деструктор является виртуальным методом. Наиболее
распространенными являются деструкторы с именем Destroy, родоначальниками которых
является деструктор класса TObject.
       При описании деструктора, обычно сначала выполняются действия, специфические
для данного класса, а затем вызывается наследуемый деструктор предка. При этом
заботиться об удалении объекта из динамической области памяти не следует, так как оно
выполняется наследуемым деструктором. Как правило, в деструкторе выполняются
действия, противоположные тем, которые выполнялись в конструкторе, и в обратном
порядке.
       Для удаления объекта деструктор вызывается как обычная подпрограмма. При этом
имя деструктора используется без квалификатора, если он вызывается внутри метода
удаляемого объекта, или с квалификатором, в качестве которого выступает имя объекта, если
он вызывается извне объекта.
       Для объектов, создаваемых Delphi, деструктор, как и конструктор, как правило, не
используется, так как они удаляются автоматически вместе с объектом (например, с
формой), в который они входят. Конечно, если такой объект следует удалить, не удаляя
объекта, в который он входит, надо использовать деструктор.

Задание к работе

   1. Требуется описать и реализовать соответствующий класс, в котором обязательно
      присутствуют следующие методы:
      • Метод инициализации Init;
      • Ввод с клавиатуры Read;
      • Вывод на экран Display;
   2. Все задания должны быть реализованы тремя способами:
      • Тип данных представляется структурой с необходимыми полями, а операции реализуются
         как внешние функции, которые получают объекты данного типа в качестве аргументов;
•      Как класс с закрытыми полями, где операции реализуются как методы класса
•      Инкапсулировать поля класса в независимой структуре и в ней реализовать указанные
       методы; в основном классе должно быть одно поле данных, представленное объектом-
       структурой.

Задание 1 – проектирование интерфейса класса

Вариант                                          Задание
1, 7, 13      Комплексное число представляется парой действительных чисел (a,b), где f –
              действительная часть, b – мнимая часть. Реализовать класс Complex для работы с
              комплексными числами. Обязательно должны присутствовать операции:

                         a.   Сложения add, (a,b)+(c.d) = (a+b, c+d);
                         b.   Вычитания sub, (a,b)-(c.d) = (a-b, c-d);
                         c.   Умножение mul, (a,b)*(c,d) = (aс-bd, ad+bc);
                         d.   Деление div, (a,b)/(c,d) = (ac + bd, bc-ad)/(c2 + d2);
                         e.   Сравнение equ, (a,b) = (c,d), Если (a=c) и (b = d );
                         f.   Сопряженное число conj, conj(a,b) = (a, -b).

2, 8, 14      Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а
              — числитель, b — знаменатель. Создать класс Rational для работы с ра-
              циональными дробями. Обязательно должны быть реализованы операции:

                         a.   сложения add, (а, b) + (с, d) = (ad + be, bd);
                         b.   вычитания sub, (a, b) - (с, d) = (ad - be, bd);
                         c.   умножения mul, (a, b) x (c,d) = (ac, bd);
                         d.   деления div, (a, b) / (с, d) = (ad, be);
                         e.   сравнения equal, greate, less.

              Должна быть реализована приватная функция сокращения дроби reduce, которая
              обязательно вызывается при выполнении арифметических операций.
3, 9          Создать класс vector3D, задаваемый тройкой координат. Обязательно должны
              быть реализованы: сложение и вычитание векторов, скалярное произведение
              векторов, умножение на скаляр, сравнение векторов, вычисление длины вектора,
              сравнение длины векторов.

4, 10         Создать класс Money для работы с денежными суммами. Число должно быть
              представлено двумя полями: рубли и копейки. Дробная часть (копейки) при
              выводе на экран должна быть отделена от целой части запятой. Реализовать
              сложение, вычитание, деление сумм, деление суммы на дробное число,
              умножение на дробное число и операции сравнения

5, 11         Создать класс Triangle для представления треугольника. Поля данных должны
              включать углы и стороны. Требуется реализовать операции: получения и
              изменения полей данных, вычисления площади, вычисления периметра,
              вычисления высот, а также определения вида треугольника (равносторонний,
              равнобедренный или прямоугольный)

6, 12         Создать класс Point для работы с точками на плоскости. Координаты точки —
              декартовы. Обязательно должны быть реализованы: перемещение точки по оси X,
перемещение по оси Y, определение расстояния до начала координат, расстояния
          между двумя точками, преобразование в полярные координаты, сравнение на
          совпадение и несовпадение

Задание 2 – создание иерархии классов

Вариант                                      Задание
   1.     Создать абстрактный базовый класс с виртуальной функцией - площадь. Создать
          производные классы: прямоугольник, круг, прямоугольный треугольник, трапеция
          со своими функциями площади. Для проверки определить массив ссылок на
          абстрактный класс, которым присваиваются адреса различных объектов. Площадь
          трапеции:S=(a+b)h/2
   2.     Создать абстрактный класс с виртуальной функцией: норма. Создать производные
          классы: комплексные числа, вектор из 10 элементов, матрица (2х2). Определить
          функцию нормы - для комплексных чисел - модуль в квадрате, для вектора -
          корень квадратный из суммы элементов по модулю, для матрицы - максимальное
          значение по модулю.
   3.     Создать    абстрактный    класс    (кривые)   вычисления    координаты y для
          некоторой x. Создать производные классы: прямая, эллипс, гипербола со своими
          функциями вычисления y в зависимости от входного параметра x.

          Уравнение прямой: y=ax+b , эллипса: x2/a2+y2/b2=1, гиперболы: x2/a2-y2/b2=1
   4.     Создать абстрактный базовый класс с виртуальной функцией - сумма прогрессии.
          Создать производные классы: арифметическая прогрессия и геометрическая
          прогрессия. Каждый класс имеет два поля типа double. Первое - первый член
          прогрессии, второе (double) - постоянная разность (для арифметической) и
          постоянное отношение (для геометрической). Определить функцию вычисления
          суммы, где параметром является количество элементов прогрессии.
              • Арифметическая прогрессия aj=a0+jd, j=0,1,2,…
              • Сумма арифметической прогрессии: sn=(n+1)(a0+an)/2
              • Геометрическая прогрессия: aj=a0rj, j=0,1,2,…
              • Сумма геометрической прогрессии: sn=(a0-anr)/(1-r)
   5.     Создать базовый класс список. Реализовать на базе списка стек и очередь с
          виртуальными функциями вставки и вытаскивания.
   6.     Создать базовый класс - фигура, и производные класс - круг, прямоугольник,
          трапеция. Определить виртуальные функции площадь, периметр и вывод на
          печать.
   7.     Создать базовый класс - работник и производные классы - служащий с почасовой
          оплатой, служащий в штате и служащий с процентной ставкой. Определить
          функцию начисления зарплаты.
   8.     Создать абстрактный базовый класс с виртуальной функцией - площадь
          поверхности. Создать производные классы: параллелепипед, тетраэдр, шар со
          своими функциями площади поверхности. Для проверки определить массив
          ссылок на абстрактный класс, которым присваиваются адреса различных
          объектов.

                 Площадь поверхности параллелепипеда: S=6xy. Площадь поверхности
                 шара: S=4π r2. Площадь поверхности тетраэдра: S=a2√ 3
   9.     Создать класс человек, производные от которого девушки и молодые люди.
          Определить виртуальную функцию реакции человека на вновь увиденного
          другого человека.
   10.    Создать абстрактный базовый класс с виртуальной функцией - объем. Создать
          производные классы: параллелепипед, пирамида, тетраэдр, шар со своими
          функциями объема. Для проверки определить массив ссылок на абстрактный
класс, которым присваиваются адреса различных объектов.

                       Объем параллелепипеда - V=xyz (x,y,z - стороны , пирамиды: V=xyh (x,y, -
                       стороны, h - высота), тетраэдра: V= a3√ 2/12, шара: V=4π r3/3.
         11.   Создать абстрактный класс - млекопитающие. Определить производные классы -
               животные и люди. У животных определить производные классы собак и коров.
               Определить виртуальные функции описания человека, собаки и коровы.
         12.   Создать базовый класс - Предок, у которого есть имя. определить виртуальную
               функцию печати. Создать производный класс Ребенок, у которого функция печати
               дополнительно выводит имя. Создать производный класс от последнего класса -
               Внук, у которого есть отчество. Написать свою функцию печати.
         13.   Создать класс живущих с местоположением. Определить наследуемые классы -
               лиса, кролик и трава. Лиса ест кролика. Кролик ест траву. Лиса может умереть -
               определен возраст. Кролик тоже может умереть. Кроме этого определен класс -
               отсутствие жизни. Если в окрестности имеется больше травы, чем кроликов, то
               трава остается, иначе трава съедена. Если лис слишком старый он может умереть.
               Если лис слишком много (больше 5 в окрестности), лисы больше не появляются.
               Если кроликов меньше лис, то лис ест кролика.
         14.   Создать абстрактный базовый класс с виртуальной функцией - корни уравнения.
               Создать производные классы: класс линейных уравнений и класс квадратных
               уравнений. Определить функцию вычисления корней уравнений.

.
Содержание отчета:
   1. Номер, тема, цель лабораторной работы.
   2. Задание к работе.
   3. Описание входных, промежуточных и результирующих данных с указанием их типа.
   4. Математическая модель задачи.
   5. Схема алгоритма решения задачи по ГОСТу.
   6. Программа на языке программирования.
   7. Результат выполнения программы.
   8. Вывод о проделанной работе.
Лабораторная работа №2

              Тема: Знакомство с основами визуального программирования.

Цель:
  1. Овладеть основными приемами работы с формами
  2. Приобретение практических навыков разработки приложения с использование
      компонентов с ввода и отображения информации (Edit, Memo, MaskEdit, Bitbtn,
      Button, Label).
  3. Приобретение практических навыков разработки приложения с использование
      компонентов переключателей: RadioButton, GroupBox, CheckBox.

Теоретическая часть

   1) Работа с формами

Форма - это компонент Form класса TForm. На ее основе конструируется приложение.
Существуют 2 класса форм:
     1. Немодальные – те, которые позволяют переключаться в другую форму приложения
          без своего закрытия;
     2. Модальные – те, которые требуют обязательного закрытия перед обращением к
          другой форме. Премером модальных форм могут служить стандартные диалоги
          ShowMessage, MessageDlg, InputBox.
Каждое приложение имеет одну главную форму и, возможно, несколько второстепенных.
Главная форма загружается автоматически при запуске приложения. Чтобы сделать форму
главной надо в файле проекта оператор, отвечающий за создание данной формы поставить
на первое место.
Каждая форма имеет две области:
     1. Клиентская область – та часть формы, в которой размещаются визуальные
          компоненты;
     2. Неклиентская область – занята рамкой, заголовком формы и строкой главного меню.
Свойства и методы форм:
- visible – позволяет скрывать и отображать данную форму;
- left, top – задают координаты расположения формы на экране;
- width, height – задают размеры формы;
- active – определяет активность формы;
- clientwidth – возвращает ширину клиентской области;
- clientheight – возвращает высоту клиентской области;
- windowstate – определяет состояние отображаемой формы;
- show – отображает форму в немодальном режиме, при этом свойство visible автоматически
устанавливается в True;
- showmodal – отображает форму в модальном режиме;
- hide – скрывает форму;
- close – закрывает форму (форма делается невидимой но не уничтожается);
- destroy – уничтожает форму.
В приложении формы могут взаимодействовать друг с другом тремя способами:
     1. Если одна форма выполняет действия с другой формой, то в списке Uses раздела
          Implementation модуля первой формы должна быть ссылка на модуль второй формы;
     2. Delphi позволяет выполнить автоматизированную вставку ссылки. Для этого
          выбираем File/UseUnit и в появившемся диалоговом окне выбираем нужную форму;
3. Форма может выполнять различные действия с компонентами другой формы. В этом
      случае при обращении к нужному компоненту указывается форма, которой он
      принадлежит, и вставляется ссылка на модуль другой формы.

Задание к работе.
   1. Написать приложение, состоящее из 2-х форм. На первой расположить:
      − два текстовых поля, в которых задаются координаты вывода второй формы;
      − кнопку «Форма 2», при нажатии на которую открывается вторая форма и
         располагается в заданном месте экрана;
      − кнопку «Движение», при нажатии на которую Форма 2 осуществляет движение по
         горизонтали в одну и другую стороны до границ экрана.
   2. Написать приложение, состоящее из 2-х форм. На первой расположить:
      − два текстовых поля, в которых задаются координаты вывода второй формы;
      − кнопку «Форма 2», при нажатии на которую открывается вторая форма и
          располагается в заданном месте экрана;
      − кнопку «Движение», при нажатии на которую Форма 2 осуществляет движение по
          вертикали вверх и вниз до границ экрана
   3. Написать приложение, состоящее из 2-х форм. На первой расположить:
      − два текстовых поля, в которых задаются размеры второй формы;
      − кнопку «Форма 2», при нажатии на которую открывается вторая форма заданного
          размера;
      − кнопку «Изменить», при нажатии на которую Форма 2 то увеличивает, то
          уменьшает размеры до определенных пределов. Визуальные компоненты,
          расположенные на Форме2, закрепить на ней таким образом, чтобы они
          перемещались вместе с границами формы.
   4. Написать приложение, состоящее из 2-х форм. На первой расположить:
      − четыре текстовых поля, в которых задаются максимально и минимально
          возможные размеры второй формы;
      − кнопку «Форма 2», при нажатии на которую открывается вторая форма заданного
          размера;
      − На второй форме расположить кнопку «Изменить», при нажатии на которую
          Форма1 то увеличивает, то уменьшает размеры до заданных пределов.
   5. Написать приложение, состоящее из 2-х форм. На первой расположить:
      − кнопку «Форма 2», при нажатии на которую открывается вторая форма,
          размещается в центре экрана и не допускается изменение размеров Формы2;
      − кнопку «Закрыть», при нажатии на которую Форма 2 закрывается;
      − кнопку «Уничтожить», при нажатии на которую Форма2 уничтожается.

     Создать главную форму разместить на ней кнопки Button. Каждая кнопка соответствует
номеру лабораторной работы и одна кнопка является выходом из приложения. Все
компоненты Button должны иметь всплывающую подсказку, указывающую номер
лабораторной работы.
      Каждая лабораторная работа должна начинаться с загрузки формы, на которой в
соответствующих компонентах должны быть указаны тема, цель и задание к работе, а
также реализованы 2 кнопки: запускающая программу и осуществляющая возврат к
главной форме.

   2) Компоненты ввода и отображения информации
Однострочный редактор – это поле ввода информации, в котором можно отображать и
изменять текст.
   1. Edit – позволяет вводить с клавиатуры и редактировать различные символы и имеет
      следующие свойства:
      - Text- позволяет получить доступ к содержимому текстового редактора;
      - CharCase – служит для изменения регистра;
      - PasswordChar – задает символ для ввода пароля.

   2. MaskEdit – дополнительно к обычному редактору предоставляет возможность
      ограничения вводимой информации по шаблону и имеет дополнительное свойство
      EditMask, которое задает маску.
Многострочный редактор – это поле для ввода или отображения информации, которое
имеет несколько строк. К ним относится компонент Memo.
Для работы с ним рекомендуется использовать следующие свойства:
       − Text – используется для доступа ко всему содержимому редактора;
       − Lines – массив строк данного редактора с помощью которого можно получить
          доступ к любой строке;
       − ScroolBar – задает расположение полосы прокрутки;
       − Alignment- задает выравнивание;
Все компоненты редактирования имеют набор общих свойств, методов и событий.
       − MaxLength – максимальное количество символов, которые могут отображаться в
          редакторе;
       − AutoSelect – определяетбудет ли автоматически выделен текст в элементе
          редактирования;
       − SelText – выделенный фрагмент;
       − SelStar, SelLength – начальная позиция и длина выделенного фрагмента;
       − SelectAll – выделяет весь текст в элементе редактирования;
       − CopyToClipBoard – копирует в буфер обмена выделенный фрагмент;
       − PastFromClipBoard – вставляет текст из буфера обмена в место текущего
          расположения курсора;
       − Add – добавляет новую строку в многострочный редактор.

Задание к работе:
   1. Разработать интерфейс приложения с применением компонентов Edit, Memo,
       MaskEdit, Bitbtn, Button, Label.
   2. Разработать алгоритм решения задачи в соответствии с вариантом задания.
   3. Реализовать разработанный алгоритм в рамках ранее созданного интерфейса.
   4. Проверить работоспособность с помощью тестового набора данных.
   5.
      Даны две квадратные матрицы A(n,n) и B(n,n), где n
6                   5(B+3A)+AB
                       7                 (A+4B)(3A-B)-A
                       8                    AB-(3B+A)

3) Использование компонентов переключателей.

Переключатели позволяют выбирать какое-либо значение из определенного множества.
Checkbox – это переключатель с независимой фиксацией (или флажок)
   − Checked – определяет состояние флажка (истина или ложь)
   − Enabled – определяет активность флажка.
RadioButton – это переключатель с зависимой фиксацией. Выбор переключателей
взаимоисключающий. Каждый переключатель, помещенный на контейнер, включается в
группу. Контейнерами могут быть Form, Panel, GroupBox. Для работы с группой
переключателей можно использовать следующие свойства и методы:
   − Items – позволяет получить доступ к отдельным переключателям в группе;
   − Add – добавляет переключатель в группу;
   − Delete – удаляет переключатель из группы;
   − Itemindex – номер выбранного переключателя.
Контейнер – это визуальный компонент, который позволяет размещать на своей поверхности
другие компоненты, объединяет их и становится их владельцем.
GroupBox – рамка с заголовком. Может служить для объединения переключателей или
флажков по смыслу. Заголовок рамки задает свойство Caption.
Panel – панель, которая имеет край с двойной фаской.
   − BevelWidth – ширина каждой фаски в пикселах;
   − BevelInner – вид внутренней фаски;
   − BevelOuter – вид внешней фаски;
   − BorderWidth – промежуток между фасками в пикселах.
ScrollBox – окно с полосами прокрутки для просмотра информации.
   − Align – выравнивание области прокрутки внутри контейнера;
   − ScrollInView – автоматически изменяет позиции полос прокрутки, чтобы
       интересующий компонент появился в видимой области.
Frame – контейнер для других компонентов, который на этапе разработки создается как и
форма, но может быть размещен в другом контейнере. Ссылка на компоненты Frame
осуществляется через имя компонента Frame.

Задание к работе.
     Разработать приложение «Тест», в соответствии с вариантом задания. Тест должен
содержать 10 вопросов. На каждый вопрос должны быть предусмотрены 3 варианта ответов.
По результатам теста проставляется оценка и выводится в информационном окне.
     На форме расположить:
     - 1 компонент Memo,
     - 3 компонента RadioButton,
     - 2 компонента BitBtn;
     - 1 компонент GroupBox.
     Номер вопроса должен выводиться в заголовке GroupBox.Сообщение о полученной
оценке должно выводится с помощью функции ввода-вывода ShowMessage, в котором
находится сообщение и кнопка OK.
Вариант     Задание
1           Тест «Знаете ли Вы историю России?»
2           Тест «Знаете ли Вы Delphi?»
3           Тест «Знаете ли Вы русский язык?»
4           Тест «Любите ли Вы олимпийские игры?»
5           Тест «Хорошо ли Вы знаете новые компьютерные игры?»
6           Тест «Хорошо ли Вы знаете направления музыки?»
7           Тест «Знаете ли Вы названия картин?»
8           Тест «Знаете ли Вы города России?»

Содержание отчета:
   1. Номер, тема, цель лабораторной работы.
   2. Задание к работе.
   3. Описание входных, промежуточных и результирующих данных с указанием их типа.
   4. Математическая модель задачи.
   5. Схема алгоритма решения задачи по ГОСТу.
   6. Программа на языке программирования.
   7. Результат выполнения программы.
   8. Вывод о проделанной работе.
Лабораторная работа № 3

                      Тема: Обработка символьной информации

Цель: Приобретение практических навыков разработки приложения для обработки
символьной информации с использованием компонентов ListBox, ComboBox.

Теоретическая часть
Список – это прямоугольная область, в которой расположены его элементы. Для работы с
простым списком используется компонент ListBox. При необходимости в нем появляются
горизонтальные и вертикальные полосы прокрутки. Комбинированный список объединяет
поле редактирования и список. Для работы с ним используется компонент ComboBox. Для
него свойство Style определяет внешний вид и поведение списка. Свойство DropDounCount
определяет количество строк, которые отображаются в раскрывающемся списке. Для
простых и комбинированных списков применяют схожие свойства и методы:
   − Items – массив строк данного списка
   − ItemIndex – номер выбранного элемента списка
   − MultiSelect – предоставляет возможность множественного выбора
   − SelCount – возвращает число выбранных элементов
   − Selected – массив логических значений, каждый элемент которого соответствует
       состоянию выбора соответствующего элемента списка при множественном выборе
   − Count – число элементов в списке
   − Add – добавляет строку в конец списка
   − Insert – вставляет строку в список на позицию с указанным номером
   − Assign – копирует информацию из одного списка в другой с заменой его содержимого
   − Delete – удаляет элемент с заданным номером
   − Sorted – сортирует элементы списка
   − Clear – очищает весь список

Задание к работе:
   1. Разработать интерфейс приложения с применением компонентов ListBox, ComboBox,
      CheckBox, RadioButton и др.
   2. Разработать алгоритм решения задачи в соответствии с вариантом задания.
   3. Реализовать разработанный алгоритм в рамках ранее созданного интерфейса.
   4. Проверить работоспособность с помощью тестового набора данных.
   5. Оформить отчет.

Задание 1.
     По выбранному из списка СomboBox дню недели вывести в список ListBox расписание
занятий группы на выбранный день.
     На форме расположить:
     - 1 компонент ListBox,
     - 1 компонент ComboBox,
     - 2 компонента BitBtn.Выбор заданного параметра производится из компонента
ComboBox. Выбранные данные отображаются в компоненте ListBox.
Задание 2
  Вариант   Задание
  1, 8      Создать приложение, в котором организовано взаимодействие двух
            списков. При запуске первый список заполняется названиями месяцев, а
            второй список очищается. Оба списка допускают множественный выбор
            элементов. При нажатии кнопок «→» и «←» выбранные элементы одного
            списка перемещаются в другой.
  2, 9      Организовать программную прорисовку элементов списка. Для выделенных
            элементов отображается рисунок, загруженный из одного файла, а для
            невыделенных – из другого. Выделенные элементы дополнительно
            отмечаются желтым цветом символов на синем фоне.
  3, 10     Написать приложение, которое помогает получить любую информацию об
            успеваемости группы студентов. На первой форме расположено текстовое
            поле и список. В поле заносится фамилия студента и оценка, полученная на
            экзамене. Введенная информация добавляется в качестве очередной записи
            в список. На второй форме расположены два списка: комбинированный и
            простой. В комбинированном списке находятся оценки, полученные
            студентами на экзамене. При выборе оценки, во втором списке
            отображаются фамилии студентов, получивших данную оценку.
  4, 11     Написать приложение, которое помогает получить любую информацию о
            репертуаре кинотеатров. На первой форме расположено текстовое поле и
            список. В поле заносится название кинотеатра и фильм. Введенная
            информация добавляется в качестве очередной записи в список. На второй
            форме расположены два списка: комбинированный и простой. В
            комбинированном списке находятся названия кинотеатров. При выборе
            кинотеатра во втором списке отображаются фильмы, которые идут в нем.
  5, 12     Написать приложение, которое позволяет работать со списком товаров. На
            форме расположено текстовое поле, в которое вводится название товара.
            Введенный товар помещается в список всех товаров только в том случае,
            если там такого товара не существовало. Кнопка «Удалить» позволяет
            удалять выбранные товары из списка. Кнопка «Результат» помещает все
            выбранные товары на метку, расположенную на форме.
  6, 13     Написать приложение, которое позволяет работать со списком растений
            цветочного магазина. На форме расположено текстовое поле, в которое
            вводится название растения. Введенный цветок помещается в список всех
            растений только в том случае, если там такого растения не существовало.
            Кнопка «Удалить» позволяет удалять выбранные растения из списка.
            Кнопка «Результат» помещает все выбранные растения на метку,
            расположенную на форме.
  7, 14     Написать приложение, которое позволяет работать со списком
            музыкальных групп. На форме расположено текстовое поле, в которое
вводится название группы. Она помещается в список всех групп только в
              том случае, если там такой группы не существовало. Кнопка «Удалить»
              позволяет удалять выбранные группы из списка. Кнопка «Результат»
              помещает все выбранные группы на метку, расположенную на форме.

Содержание отчета:
   1. Номер, тема, цель лабораторной работы.
   2. Задание к работе.
   3. Описание входных, промежуточных и результирующих данных с указанием их типа.
   4. Математическая модель задачи.
   5. Схема алгоритма решения задачи по ГОСТу.
   6. Программа на языке программирования.
   7. Результат выполнения программы.
   8. Вывод о проделанной работе.
Лабораторная работа №4

                 Тема: Проектирование пользовательского интерфейса.

Цель:
  1) Приобретение практических навыков разработки приложения с использованием
      компонентов таблиц, а также главного и вспомогательного меню: (MainMenu,
      PopupMenu, StringGrid).
  2) Приобретение практических навыков разработки приложений с использованием
      компонентов OpenPictureDialog, FontDialog, ColorDialog, Open Dialog.

Часть 1. Использование компонентов MainMenu, PopupMenu, StringGrid

В Delphi есть два компонента, используемые для создания меню: MainMenu – главное меню
и PopupMenu – контекстное меню.
MainMenu - невизуальный компонент. Наиболее важным свойством этого компонерта
является свойство Items. Для его заполнения нужно вызвать Menu Designer, которое
появляется при двойном щелчке по компоненту MainMenu. Каждый элемент свойства Items –
это отдельный пункт меню, который обладает след. Свойствами:
    − Caption – заголовок пункта меню;
    − Count – указывает количество элементов;
    − Dafault – устанавливает данный пункт меню в качестве используемого по умолчанию;
    − MenuIndex – Вычисляет индекс указанного пункта меню;
    − ShortCut – позволяет указать «горячую» клавишу для данного пункта меню.
PopupMenu – невизуальный компонент, который в отличие от главного меню, которое
постоянно находится на экране, выводится в случае необходимости при нажатии правой
кнопки мыши на компонент, с которым оно связано.
Для того, чтобы связать это меню с определенным компонентом, используется свойство
PopupMenu визуальных компонентов.
StringGrid – позволяет хранить и автоматически отображать текстовую информацию.
Основные свойства
    − ColCount, RowCount – задают число строк и число столбцов таблицы (нумерация с
       нуля);
    − ColWidth, RowHeigth – задают высоту строк и ширину столбцов;
    − FixedCols,FixedRows – задают число фиксированных строк и столбцов(остаются
       недвижимыми при прокрутке);
    − Cells[aCol, aRow] – используется для доступа к отдельной ячейке, aCol – номер
       столбца, aRow – номер строки;
    − Cols[index], Row[index] – обеспечивает доступ к любому столбцу и строке таблицы.

Задание к работе:
   1) При выборе 1 пункта на экране должно раскрываться подменю, состоящее из 2
      пунктов: «Условие задачи 1», «Решение задачи 1».
      При выборе пункта «Условие задачи 1» должна появляться форма, на которой
      расположены условие и рисунок с соответствующим графиком. При щелчке мышью
      на рисунке должно появляться всплывающее меню, состоящее из двух пунктов:
      «Показать рисунок», «Скрыть рисунок». (Рисунок области создать в графическом
      редакторе Paint и вставить на форму как картинку ).
      При выборе пункта «Решение задачи 1» должна появляться форма, на которой
      производится ввод исходных данных, и вывод полученных результатов.
2) При выборе 2 пункта на экране должно раскрываться подменю, состоящее из 2
      пунктов: «Условие задачи 2», «Решение задачи 2».
      При выборе пункта «Условие задачи 2» должна появляться форма, на которой
      расположены условие задачи.
      При выборе пункта «Решение задачи 2» должна появляться форма, на которой
      должны выводиться таблица значений функции и график заданной функции. (График
      построить с помощью Excel и вставить на форму как картинку)
       При щелчке мышью на таблице должно появляться всплывающее меню, состоящее
      из 3 пунктов: «Очистить таблицу», «Скрыть таблицу», «Показать таблицу».
   3) При выборе 3 пункта, осуществляется выход на главную форму приложения.

Задание 1.
По заданным координатам точки M (x,y) определить попадает или нет точка М в
заштрихованную область.

                                                        1                              3
                               1
                                           3                                 -3
  2                                                              1
                          0                                                       0        -1
                               -1                           -1
                                                        0
  0          2

             1                                              3
                          -5                       -4
      -1                                                                      -2                2
                                   0
      0
             -1
                                   -5

Задание 2.
                   №                     Функция                     а   b            N

                   1, 9                 sin − cos                    0                20
                                                                         2
                  2, 10                  sin 2 − 3                   0                15

                  3, 11                    sin 3                 −                    20

                  4, 12                 cos 3 + sin                  0                15
                                                                         6
                  5, 13                  −5 +                    −                    15
                                                                     3   3
                  6, 14                    3 − cos                                    20
                                                                     6   2
7          |3 − 4| + 2         2      4    15

                     8           2    −4            -3     4    20

Часть 2. Использование стандартных диалоговых окон

В Delphi имеется ряд диалогов для операционной системы Windows.
OpenDialog – компонент представляет собой стандартное диалоговое окно выбора и
открытия файлов.
OpenPictureDialog – предназначен для открытия графических файлов.
Основные свойства:
   − FileName – содержит имя выбранного файла;
   − Files – содержит список имен выделенных файлов;
   − Filter – позволяет задавать фильтр для файлов, которые будут отображаться в
      диалоговом окне;
   − InitialDir – позволяет установить начальный каталог поиска в Инспекторе объектов.
FontDialog – предназначен для настройки шрифта и его характеристик.
Основные свойства
   − Font – результат изменения характеристик шрифта;
   − MaxFontSize – установка максимального размера шрифта;
   − MinFontSize – установка минимального размера шрифта.
ColorDialog – предоставляет возможность выбора определенного цвета из палитры.
Основным свойством является свойство Color -           содержит данные о выбранном
пользователем цвете.

Задание к работе:
       На форме расположить следующие компоненты: Panel, Image, RichEdit, ,
OpenPictureDialog, FontDialog, Open Dialog, ColorDialog, 3 PopupMenu, BitBtn.
       PopupMenu компонента Image должно содержать пункт вызова окна
OpenPictureDialog.
       PopupMenu компонента RichEdit должно содержать пункты вызова окна FontDialog и
Open Dialog.
       PopupMenu формы должно содержать пункт вызова окна ColorDialog
       При выборе изображения с помощью компонента OpenPictureDialog в компоненте
Image должно отображаться выбранное изображение, одновременно с этим в компоненте
RichEdit должна отображаться информация, соответствующая выбранному изображению. И
наоборот, при выборе информационного файла с помощью компонента OpenDialog в
компоненте RichEdit должна выводится информация из выбранного файла и одновременно в
Image загружаться изображение, соответствующее выбранному текстовому файлу. Кроме
того, с помощью ColorDialog должно быть предусмотрено смена цвета формы, а с помощью
FontDialog, изменение настроек RichEdit.
Каждый визуальный компонент должен быть снабжен всплывающей подсказкой
Напишите программу, использующую 7 изображений.
  Вариант                                         Задание
     1, 9      Картинная галерея
    2, 10      Автомобили
    3, 11      Компьютерные игры
    4, 12      Телефоны
    5, 13      Семь чудес света
6, 14     Семь чудес России
     7       Великие ученые
     8       Столицы мира

Содержание отчета:
   1. Номер, тема, цель лабораторной работы.
   2. Задание к работе.
   3. Описание входных, промежуточных и результирующих данных с указанием их типа.
   4. Математическая модель задачи.
   5. Схема алгоритма решения задачи по ГОСТу.
   6. Программа на языке программирования.
   7. Результат выполнения программы.
   8. Вывод о проделанной работе.
Лабораторная работа №5

                     Тема: «Обработка исключительных ситуаций».

Цель: Приобретение практических навыков обработки исключительных ситуаций.

Теоретическая часть
Исключительная ситуация – это нарушение условий выполнения программы, вызывающее
прерывание или полное прекращение ее работы. Обработка исключительных ситуаций
состоит в нейтрализации динамической ошибки, вызвавшей ее.
Базовым классом для всех исключений является класс Exception. Объекты данного класса
имеют следующие свойства и методы:
   − Message – описание исключительной ситуации;
   − HelpContext – номер идентификатора контекстной помощи для объекта исключения;
   − Create – метод, который служит для создания объекта исключительной ситуации.
Класс Exception имеет множество потомков, каждый из которых служит для обработки
определенный динамической ошибки.
Обработка исключительных ситуаций может происходить по двум направлениям:
   1. Глобальная обработка исключений. Механизм ее реализуется через объект
      Application. При получении от системы сообщения об исключении объект Application
      генерирует событие OnException. Программист может создать свой глобальный
      обработчик. С этой целью удобно использовать компонент ApplicationEvents, для
      которого пишется обработчик события OnException/
   2. Локальная обработка исключений. Для обеспечения возможности использования
      специализированных обработчиков исключений, в состав языка введены две
      конструкции try… finally и try…exept.

      Try
      //операторы, выполнение которых может вызвать ошибку
      Finally
      //операторы, которые должны быть выполнены в случае ошибки
      End;
Данная конструкция применяется для выполнения всех необходимых действий перед
передачей управления на следующий уровень обработки ошибки или глобальному
обработчику. Если в любом из операторов секции try возникает исключительная ситуация, то
управление передается первому оператору секции finally для выполнения всех операторов
секции. Если исключительная ситуация не возникла, то последовательно выполняются все
операторы обеих секций.

       Try
       //операторы, выполнение которых может вызвать ошибку
       Except
       //операторы, которые должны быть выполнены в случае ошибки
       End;
Эта конструкция применяется для перехвата исключительной ситуации и предоставляет
возможность ее обработки. Если в операторах секции try возникла исключительная ситуация,
то управление передается первому оператору секции except. Если исключительная ситуация
не возникла, то операторы секции Except не выполняются. Секция except может быть разбита
на несколько частей конструкциями on…do. Это позволяет анализировать класс
исключительной ситуации с целью ее обработки.
При необходимости исключительную ситуацию можно вызвать программно. Для этого
используется оператор Raise, выполнение которого приводит к созданию объекта
исключения класса Exception или одного из его потомков. Оператор имеет следующий
синтаксис:
Raise ClassException.Method;
Процесс отладки исключительных ситуаций в Delphi имеет некоторые особенности. По
умолчанию при возникновении динамической ошибки Delphi перехватывает
исключительную ситуацию и выдает соответствующее сообщение. Если работу приложения
надо продолжить, то необходимо выбрать из меню Run команду Run и возникшее
исключение будет обработано средствами приложения.
Исключительные ситуации:
           − EConvertError - происходит в случае возникновения ошибки при выполнении
функций StrToInt и StrToFloat, когда конвертация строки в соответствующий числовой тип
невозможна.
           − EIntError - предок исключений, случающихся при выполнении целочисленных
операций.
           − EDivByZero - вызывается в случае деления на ноль, как результат RunTime
Error 200.
           − EIntOverflow - вызывается при попытке выполнения операций, приводящих к
переполнению целых переменных, как результат RunTime Error 215 при включенной
директиве {$Q+}.
           − ERangeError - вызывается при попытке обращения к элементам массива по
индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной
директиве {$R+}.
           − EInvalidCast - происходит при попытке приведения переменных одного класса
к другому классу, не совместимому с первым (например, приведение переменной типа
TListBox к TMemo).
           − EListError - вызывается при обращении к элементу наследника TList по
индексу, выходящему за пределы допустимых значений (например, объект TStringList
содержит только 10 строк, а происходит обращение к одиннадцатому).
           − EMathError - предок исключений, случающихся при выполнении операций с
плавающей точкой.
           − EOverflow - происходит как результат переполнения операций с плавающей
точкой при слишком больших величинах. Соответствует RunTime Error 205.
           − Underflow - происходит как результат переполнения операций с плавающей
точкой при слишком малых величинах. Соответствует RunTime Error 206.
           − EZeroDivide - вызывается в результате деления на ноль.
           − EMenuError - вызывается в случае любых ошибок при работе с пунктами меню
для компонент TMenu, TMenuItem, TPopupMenu и их наследников.

Задание к работе:
Вариант Задание
1         Создать программу, позволяющую пользователю ввести два числа, которые
          программа разделит. Необходимо поместить на форму три объекта класса TEdit -
          два для операндов, один – для результата и кнопку (объект класса TButton),
          нажимая на которую пользователь выполняет деление. Исключить попытку
          деления на ноль а так же введения символов вместо цифр. Выдать сообщение о
          типе возникшей ошибки.
2         Создать программу, вычисляющую корни квадратного уравнения (ax2+bx+c=0).
          Необходимо поместить на форму четыре объекта класса TEdit - три для
          коэффициентов квадратного уравнения, один – для результата и кнопку (объект
класса TButton), нажимая на которую пользователь выполняет нахождение
         корней. Исключить ввод символов вместо цифр, получение отрицательного
         дискриминанта и ввод а = 0. Вывести при всех типах ошибок одно и то же
         сообщение.
3        Создать программу с “бесконечным” циклом типа while. В цикле увеличивать
         переменную I до значения, заданного пользователем. При достижении этого
         значения выходить из цикла с помощью возбуждения исключения EAbort.
         Выдать сообщение о выходе из цикла в блоке Except. Необходимо поместить на
         форму кнопку (объект класса TButton), которая запускает цикл; сообщение
         можно выдать с помощью функции ShowMessage, или поместить на форму метку
         (объект класса TLabel), в которую помещается сообщение.
4        Создать программу, вычисляющую тангенс угла. Необходимо поместить в форму
         два компонента TEdit для ввода значения и результата и кнопку TButton для
         вычисления значения тангенса. Исключить ввод символов вместо цифр и
         получение значения тангенса угла 90 градусов. Предусмотреть возможность
         ввода значений в радианах.
5        Создать программу, вычисляющую логарифм числа. Для этого необходимо
         поместить в форму два компонента TEdit для ввода значения и результата и
         кнопку TButton для вычисления значения логарифма. Исключить ввод символов
         вместо цифр и получение значения логарифма 0.
6        Создать программу обработки исключения при обращении к несуществующему
         элементу массива. В форму поместите поля редактирования для ввода – вывода
         значений и номеров элементов массива и кнопку для обработки события.
7        Разработать приложение для обработки результатов соревнований. Исходные
         данные: время старта, время финиша, контрольное время. Отметить те
         результаты, которые укладываются в контрольное время. Время старта и время
         финиша вводить в таблицу. Отметить спортсменов, уложившихся в контрольное
         время, специальным символом или сообщением «Норма выполнена» в свободном
         столбце таблицы. Использование механизма защищенного блока обязательно!
8        С помощью таблицы TStringGrid ввести элементы матрицы и подсчитать сумму
         квадратов его столбцов. Использование механизма защищенного блока
         обязательно!
9        Рассчитать средние параметры группы студентов. Исходные данные: количество
         баллов, набранных каждым студентом при тестировании; рост и вес каждого
         студента. Рассчитать средний балл, средний вес и средний рост студентов в
         группе. В приложении использовать таблицу TStringGrid для ввода и вывода
         информации. Использование механизма защищенного блока обязательно!
10       Представить в виде таблицы итоги деятельности четырех агентов фирмы по
         сбыту n-ой продукции. Исходной информацией считать объем продаж по
         кварталам. Рассчитать объем продаж каждого агента за год. Использование
         механизма защищенного блока обязательно!
11       Представить в виде таблицы ведомость сведений о пропусках занятий
         студентами. Исходной информацией является: количество часов, пропущенных
         по уважительной и неуважительной причине. Для ввода и хранения информации
         использовать таблицу TStringGrid. Студентов, пропустивших более XXX часов
         по неуважительной причине, отметить в свободном столбце таблицы
         специальным сообщением. XXX - вводимая величина. Использование механизма
         защищенного блока обязательно!

Содержание отчета:
   1. Номер, тема, цель лабораторной работы.
2.   Задание к работе.
3.   Описание входных, промежуточных и результирующих данных с указанием их типа.
4.   Математическая модель задачи.
5.   Схема алгоритма решения задачи по ГОСТу.
6.   Программа на языке программирования.
7.   Результат выполнения программы.
     Вывод о проделанной работе.
Лабораторная работа №6

                         Тема: Реализация механизма Drag & Drop.

Цель: Приобретение практических навыков разработки приложений с использованием
механизма перетаскивания данных Drag & Drop.

Теоретическая часть

Перетаскивание информации с помощью мыши стало стандартом для программ,
работающих в Windows. Часто это бывает удобно и позволяет добиться более быстрой
работы. Здесь приводится большое количество примеров использования данной технологии
при разработке приложений в среде Delphi. Конечно, результат может быть достигнут
различными путями, продемонстрированные приемы не являются единственными и,
возможно, не всегда самые оптимальные, но вполне работоспособны, и указывают
направление поиска. Надеюсь, что они побудят начинающих программистов к более
широкому использованию Drag & Drop в своих программах, тем более что пользователи,
особенно неопытные, быстро привыкают к перетаскивание и часто его применяют.

Проще всего делать Drag из тех компонентов, для которых однозначно ясно, что именно
перетаскивать. Для этого устанавливаем у источника DragMode = dmAutomatic, а у
приемника пишем обработчики событий OnDragOver - разрешение на прием, и OnDragDrop -
действия, производимые при окончании перетаскивания.

procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X,
 Y: Integer; State: TDragState; var Accept: Boolean);
begin
 Accept := Source = Edit1;
 // разрешено перетаскивание только из Edit1,
 // при работе программы меняется курсор
end;

procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X,
 Y: Integer);
var
 ACol, ARow: Integer;
begin
 StringGrid2.MouseToCell(X, Y, ACol, ARow);
 // находим, над какой ячейкой произвели Drop
 StringGrid2.Cells[Acol, Arow] := Edit1.Text;
 // записываем в нее содержимое Edit1
end;

Теперь рассмотрим копирование в упорядоченный список ListBox1 из другого списка. В
OnDragOver проверяем, выбран ли хоть один элемент в источнике:

Accept := (Source = ListBox2) and (ListBox2.ItemIndex >= 0);

В OnDragDrop ищем отмеченные в источнике строки (установлен множественный выбор) и
добавляем только те, которых еще нет в приемнике:
for i := 0 to ListBox2.Items.Count - 1 do
 if (ListBox2.Selected[i]) and (ListBox1.Items.IndexOf(ListBox2.Items[i]) < 0) then
   ListBox1.Items.Add(ListBox2.Items[i]);

Для ListBox2 реализуем перенос строк из ListBox1 и перестановку элементов в желаемом
порядке. В OnDragOver разрешаем Drag из любого ListBox:

Accept := (Source is TListBox) and ((Source as TListBox).ItemIndex >= 0);

А OnDragDrop будет выглядеть так:

var
 s: string;
begin
 if Source = ListBox1 then
 begin
   ListBox2.Items.Add(ListBox1.Items[ListBox1.ItemIndex]);
   ListBox1.Items.Delete(ListBox1.ItemIndex);
   //удаляем перенесенный элемент
 end
 else //внутренняя перестановка
 begin
   s := ListBox2.Items[ListBox2.ItemIndex];
   ListBox2.Items.Delete(ListBox2.ItemIndex);
   ListBox2.Items.Insert(ListBox2.ItemAtPos(Point(X, Y), False), s);
   //находим, в какую позицию переносить и вставляем
 end;
end;

Научимся переносить текст в Memo, вставляя его в нужное место. Поскольку в качестве
источника выбран любой из ListBox, подключим в Инспекторе Объектов для OnDragOver
уже написанный ранее обработчик ListBox2DragOver, а в OnDragDrop напишем

if not CheckBox1.Checked then // при включении добавляется в конец текста
begin
  Memo1.SelStart := LoWord(Memo1.Perform(EM_CHARFROMPOS, 0, MakeLParam(X, Y)));
  // устанавливаем позицию вставки согласно координатам мыши
  Memo1.SelText := TListBox(Source).Items[TListBox(Source).ItemIndex];
end
else
  memo1.lines.add(TListBox(Source).Items[TListBox(Source).ItemIndex]);

Замечу, что для RichEdit EM_CHARFROMPOS работает несколько иначе, что
продемонстрировано в следующем примере. Перенос из Memo реализован с помощью
правой кнопки мыши, для того, чтобы не изменять стандартное поведение Memo, и
поскольку нажатие левой кнопки снимает выделение. Для Memo1 установлено DragMode =
dmManual, а перетаскивание инициируется в OnMouseDown

if (Button = mbRight) and (Memo1.SelLength > 0) then
  Memo1.BeginDrag(True);

Обработчик RichEdit1DragOver очевиден, а в RichEdit1DragDrop пишем
Вы также можете почитать