51247

Программирование в системе Delphi. Методические указания

Книга

Информатика, кибернетика и программирование

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

Русский

2014-02-08

294.5 KB

27 чел.

БЕЛОРУССКИЙ    ГОСУДАРСТВЕННЫЙ   УНИВЕРСИТЕТ

ФИЗИЧЕСКИЙ ФАКУЛЬТЕТ

Кафедра методики преподавания физики и информатики

ПРОГРАММИРОВАНИЕ  
в  системе  Delphi

Методические указания
к лабораторным работам по курсу

ПРОГРАММИРОВАНИЕ  И  МАТЕМАТИЧЕСКОЕ  МОДЕЛИРОВАНИЕ

1 курс, 2 семестр

для студентов физическго факультета

 

Минск

2005

УДК 681.3.06

Рекомендовано Ученым советом

Физического факультета

    апреля 2004 г., протокол №

Авторы-составители:

Гневко С.В., Крылов Г.Г., Шапочкина И.В.

Рецензенты

канд физ.-мат. Н.Н. Дорожкин

канд физ.-мат. А.И. Слободянюк

Программирование в системе Delphi : Методические указания к лабораторным работам для студентов физического факультета
/ Авторы : Гневко С.В., Крылов Г.Г., Шапочкина И.В.. – Мн. : БГУ, 2005. – 47 с.

Приведены заготовки проектов  для выполнения лабораторных работ по курсу «Программирование и математическое моделирование: Программирование в системе Delphi», указаны связанные с выполнением лаботарорных работ необходимые компоненты, приведены индивидуальные задания по лабораторным работам.

.

Предназначено для студентов 1 курса всех специальностей физического факультета.

© БГУ, 2005

Введение

Курс программирования и математического моделирования для студентов, обучающихся по специальности физика должен включать обучение с использованием современных технологий программирования  для современных операционных систем. В этой связи выбор в качестве языка программирования – языка Object Pascal и инструментальной системы быстрой разработки приложений Delphi является оптимальным, так как она строится на интуитивно понятном интерфейсе, сочетает всю полноту использования библиотек стандартных компонентов системы Microsoft Windows с возможностью визуальных средств быстрой разработки приложений.

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

Возможность изучения документации при подготовке к работе обеспечивается при этом имеющимися в электронном виде двумя учебниками по языку Object Pascal и среде разработки Dephi (в дальнейшем мы будем ссылаться на них как на Уч. Д1, Уч. Д2), которые размещаются на каждом рабочем месте.

Каждая рассмотренная лабораторная работа представлена следующим образом:

  •  цель работы;
  •  перечень основных компонент, необходимых для выполнения работы;
  •  пример разработки приложения с минимальной функциональностью;
  •  примерный перечень заданий для выполнения студентами.

Задания для разработки различаются по уровню сложности, что позволяет преподавателю дифференцированно подойти к обучению каждого студента.


ЛАБОРАТОРНАЯ  РАБОТА    Л-2.1

Работа в интегрированной среде разработки Delphi.
Приложение с простым меню и реакцией на клавиатуру
и мышь.

Основной целью первой лабораторной работы является изучение возможностей работы в среде разработки, получение навыков работы с массивами, свойствами объектов, написание кода обработки стандартных событий.

Материал Уч. Д1, необходимый для написания работы, -

LES01.htm – LES03.htm, LES07.htm,LES10.htm

Перечень основных компонент, необходимых для выполнения работы

TFORM, TCANVAS, MessageDlg

Пример разработки приложения с минимальной функциональностью

Ниже приведена программа, обладающая следующей функциональностью.

Имеется меню, содержащее пункты – Выход и О программе, нажатие на любую клавишу выдает сообшение «Клавиша=>», нажатие на клавишу мыши выдает сообщение – «правая/левая (x,y)»

unit L2_1; {Основной модуль работы № 1 }

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Menus;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   N1: TMenuItem;

   N2: TMenuItem;

  public

   procedure N1Click(Sender: TObject);

   procedure N2Click(Sender: TObject);

   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

             Shift: TShiftState; X, Y: Integer);

   procedure FormKeyPress(Sender: TObject; var Key: Char);

 end;{class}

var

 Form1: TForm1;

implementation

{$R *.dfm}

{Реакция на событие – пункт меню «Выход»}

procedure TForm1.N1Click(Sender: TObject);

begin

 Close;

end;

{Реакция на событие – пункт меню «О программе»}

procedure TForm1.N2Click(Sender: TObject);

begin

 MessageDlg('Мини Лаб №1', mtInformation, [mbOk], 0);

end; {Proc}

{Реакция на событие – мышь}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

 Shift: TShiftState; X, Y: Integer);

begin

case Button of

 mbLeft: begin

          Canvas.TextOut(X, Y, 'Левая('+IntToStr(X)+','+ IntToStr(Y)+')');

         end;

 mbRight:begin

          Canvas.TextOut(X, Y,  'Правая('+IntToStr(X)+','+ IntToStr(Y)+')');

         end;

end;

end; {proc}

{Реакция на событие – клавиатура}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

var

st: string;

begin

 st:='Клавиша=> '+Key;  MessageDlg(st, mtInformation, [mbOk], 0);

end; {Proc}

end.{Unit}

Примерный перечень заданий для выполнения

  1.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Определить номера точек с минимальной / максимальной координатами по X и по Y. Начало работы алгоритма - по нажатию правой кнопки мыши, результат выдать в окно диалога.
  2.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой / правой  кнопок мыши и имеет номер 1..N). Определить номера точек с минимальной / максимальной координатами по X и по Y. Задачу решить отдельно для групп точек, созданных по левой и по правой кнопке мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре.
  3.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Упорядочить точки по возрастанию / убыванию координаты X. Начало работы алгоритма - по нажатию правой кнопки мыши, результат выдать в окно функцией TextOut.
  4.  На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Упорядочить точки по возрастанию / убыванию координаты Y. Начало работы алгоритма - по нажатию левой кнопки мыши, результат выдать, написав номер в позициях (x,y) каждой точки.
  5.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния всех точек до точки, помещенной на форму первой. Начало работы алгоритма - по нажатию правой кнопки мыши, результат выдать в окно диалога.
  6.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния всех точек до точки, помещенной на форму последней по нажатию правой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать в окно диалога.
  7.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Найти точку, максимально удаленную от точки, первой помещенной на форму по нажатию правой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать в окно функцией TextOut.
  8.  На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Найти точку, минимально удаленную от точки, последней помещенной на форму по нажатию левой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать в окно диалога.
  9.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния между всеми парами точек. Начало работы алгоритма - по нажатию правой кнопки мыши, результат подписать функцией TextOut в серединах отрезка, соединяющих пары точек.
  10.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить расстояния между всеми парами точек с нечетными номерами. Начало работы алгоритма - по нажатию правой кнопки мыши, результат подписать функцией TextOut в серединах отрезка, соединяющих пары точек.
  11.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой / правой кнопок мыши и имеет номер 1..N). Вычислить сумму расстояний между всеми парами точек с четными номерами. Задачу решить отдельно для групп точек, созданных по левой и по правой кнопке мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать функцией TextOut в середине окна.
  12.  На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Упорядочить точки по возрастанию / убыванию расстояния до точки, заданной последним нажатием левой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдать функцией TextOut, подписав номера каждой точки.
  13.  На форму поместить 2 точки нажатием левой кнопки мыши. Определить координаты точки, лежащей в середине отрезка, соединяющего данные точки. Вычислить расстояние от найденной точки до правого нижнего угла формы и до точек, заданных нажатием правой кнопки мыши. Начало работы алгоритма - по нажатию определенной клавиши на клавиатуре, результат выдается в окне диалога.
  14.  * На форму поместить N точек (каждая точка помещается на форму по нажатию правой кнопки мыши и имеет номер 1..N). Определить порядок соединения точек незамкнутой непересекающейся ломанной. Начало работы алгоритма - по нажатию левой кнопки мыши. Точки подписать их номерами, порядок соединения выдать парами номеров точек у правой границы окна.
  15.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Определить порядок соединения точек замкнутой ломанной, проводимой в порядке возрастания координат (x,y) . Начало работы алгоритма - по нажатию правой кнопки мыши. Точки подписать их номерами, порядок соединения выдать парами номеров точек у правой границы окна.
  16.  На форму поместить N точек (каждая точка помещается на форму по нажатию левой кнопки мыши и имеет номер 1..N). Вычислить сумму расстояний от точки с номером (N div 2) до всех остальных. Результат выдать в диалог.


ЛАБОРАТОРНАЯ  РАБОТА    Л-2.2

Пользовательские типы данных, ввод и вывод.

Основной целью второй лабораторной работы является изучение базовых структурных типов данных – строк, записей, массивов и их использование, а также элементарные приемы ввода-вывода данных в Delphi.

Материал Уч. Д1, необходимый для написания работы,

LES01.htm – LES03.htm, LES07.htm,LES08.htm, LES10.htm

Материал Уч. Д2, необходимый для написания работы,

Глава3, пп.1-3, Глава4, п.1-2

Перечень основных компонент, необходимых для выполнения работы

TFORM, TLABEL, TEDIT, TSCROLLBAR, MessageDlg, MessageBox

Пример разработки приложения с минимальной функциональностью.

Ниже приведена программа, обладающая следующей функциональностью. Имеется меню, содержащее пункты – Выход, Ввод/Вывод и О программе,

Продемонстрированы методы работы со следующими элементами контроля – метками, полями ввода и полосой прокрутки. Данные элементы являются базовыми для организации интерфейса в  собственной программе студента.

unit L2_2;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Menus;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   N1: TMenuItem;

   N2: TMenuItem;

   N3: TMenuItem;

   Labl1: TMenuItem;

   Edt1: TMenuItem;

   ScrollBar1: TMenuItem;

   Label1: TLabel;

   ScrBr1: TMenuItem;

   Edit1: TEdit;

   Label2: TLabel;

   ScrollBar2: TScrollBar;

   Label3: TLabel;

   public

   procedure N2Click(Sender: TObject);

   procedure Labl1Click(Sender: TObject);

   procedure Label1Click(Sender: TObject);

   procedure Edt1Click(Sender: TObject);

   procedure Edit1KeyPress(Sender: TObject; var Key: Char);

   procedure ScrollBar2Change(Sender: TObject);

   procedure ScrollBar1Click(Sender: TObject);

   procedure ScrollBar2Exit(Sender: TObject);

   procedure Edit1Exit(Sender: TObject);

   procedure ScrBr1Click(Sender: TObject);

 end;{class}

var

 Form1: TForm1;

implementation

{$R *.dfm}

{Реакция на событие – пункт меню «Выход»}

procedure TForm1.N2Click(Sender: TObject);

begin

Close;

end; {Proc}

{Реакция на событие – пункт меню «Ввод-вывод-Label»}

procedure TForm1.MenuLablClick(Sender: TObject);

begin

Label1.Visible:=True;

end; {Proc}

{Реакция на событие – клик на метку «Label»}

procedure TForm1.Label1Click(Sender: TObject);

begin

Label1.Visible:=False;

end; {Proc}

{Реакция на событие – пункт меню «Ввод-вывод-Edit»}

procedure TForm1.Edt1Click(Sender: TObject);

begin

Label2.Visible:=true;  Edit1.visible:=true;

end; {Proc}

{Реакция на событие – ввод с клавиатуры в Edit}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

var

v:real;

code:integer;

begin

if(key=#13) then begin {Конец ввода}

val(Edit1.Text,v,code);

if(code<>0) then begin

 MessageDlg('Введено не число !!!',  mtInformation, [mbOk], 0);

 Edit1.Text:='1';

end else begin

 if(v<=0) then begin

  MessageDlg('Плохое число !!!', mtInformation, [mbOk], 0);

   Edit1.Text:='1';

 end else begin

  Edit1.Visible:=false;    Label2.Visible:=false

 end;

end;

end;

inherited;

end; {Proc}

{Реакция на событие – изменение ScrollBar}

procedure TForm1.ScrollBar2Change(Sender: TObject);

var

s:string;

begin

 Str(Scrollbar2.Position,s);  Label3.Caption:='Текущее значение  '+ s;

end; {Proc}

{Реакция на событие – щелчок по ScrollBar }

procedure TForm1.ScrollBar1Click(Sender: TObject);

begin

Label3.Visible:=true;  Scrollbar2.Visible:=true;

end; {Proc}

{Реакция на событие – ScrollBar, потеря фокуса ввода}

procedure TForm1.ScrollBar2Exit(Sender: TObject);

begin

Scrollbar2.Visible:=false;  Label3.Visible:=false;

end; {Proc}

{Реакция на событие – Edit, потеря фокуса ввода}

procedure TForm1.Edit1Exit(Sender: TObject);

begin

Edit1.Visible:=false;  Label2.Visible:=false;

end; {Proc}

{Реакция на событие – пункт меню «О программе»}

procedure TForm1.MenuAbout(Sender: TObject);

var

st: string;

begin

st:='Мини. Лаб. № 2';

with Application do begin

 MessageBox(Pchar(st), 'О программе', MB_OK);

end;

end; {Proc}

end.{Unit}

Примерный перечень заданий для выполнения студентами

  1.  Числа a и b – длины катетов одного прямоугольного треугольника, c и d – другого. Разработать программу, определяющую, являются ли треугольники подобными.
  2.  Разработать программу, которая представляет исходную строку в обратном  порядке и при этом удаляет в строке результата указанную группу символов.
  3.  Разработать программу, которая заменяет в исходной строке одну указанную группу символов на другую.
  4.  Вычислить сумму

    с заданной точностью ε  для различных значений параметров a, b.

  1.  Вычислить значения функции на отрезке  с шагом h>0

  1.  Вычислить значения функции на отрезке  с шагом h>0

  1.  Вычислить сумму

    с заданной точностью ε  для различных значений параметров a, b.

  1.  Вычислить сумму

    с заданной точностью ε для различных значений параметров a, b.

  1.  Вычислить сумму

    с заданной точностью ε для различных значений параметров a, b.

  1.  Разработать программу, которая удаляет из строки все повторно встречающиеся символы.
  2.  Разработать программу, которая из строки, содержащей некоторый текст, выделяет все слова и печатает их в алфавитном порядке (по первой букве).
  3.  Разработать программу, которая определяет, является ли данная строка палиндромом (пример: «А роза упала на лапу Азора»).
  4.  Разработать программу, которая исключает из данной строки группы символов, расположенные между скобками [ … ]. Сами скобки тоже должны быть исключены.
  5.  Дана строка символов, состоящая из нулей, единиц и пробелов. Группы единиц и нулей, разделенные пробелами и не содержащие пробелов внутри себя, называются словами. Разработать программу, подсчитывающую число слов в строке. Рассматривая слова как числа (двоичные), определить количество слов, делящихся на 5 без остатка. Найти максимальное и минимальное такое слово.
  6.  Разработать программу, реализующую основные арифметические операции с комплексными числами.

Вопросы  для  самопроверки

  1.  Когда и почему исчезает элемент управления Edit при нажатии клавиши «ввод»?
  2.  Каковы условия исчезновения с формы элементов управления?
  3.  Где в программе сохраняется численное значение введенного числа в Edit?
  4.  Как изменить свойства метки Label1, чтобы она не исчезала с формы при нажатии, а изменяла цвет фона?
  5.  Какова реакция ScrollBar на щелчок мыши?


ЛАБОРАТОРНАЯ  РАБОТА    Л-2.3

Работа с файлами

Основной целью третьей лабораторной работы является изучение приемов работы с файлами, а также использование стандартных диалогов в системе Delphi.

Материал Уч. Д1, необходимый для написания работы, -

LES01.htm – LES04.htm, LES07.htm,LES08.htm, LES10.htm

Материал Уч.Д2, необходимый для написания работы –

Глава3, пп.1-3, Глава 4, п.1-2

Перечень основных компонент, необходимых для выполнения работы

TFORM, TLABEL, TEDIT, TMEMO, TUPDOWN, TOPENDIALOG, TSAVEDIALOG, TDIALOG

Пример разработки приложения с минимальной функциональностью.

Ниже приведена программа, обладающая следующей функциональностью. Имеется меню, содержащее пункты – Файл и О программе

 

Подпункты меню Файл позволяют прочитать и записать короткий текстовый файл. Прочитанный файл помещается в объект TMemo и может построчно редактироваться. Диалоговое окно О программе реализовано как отдельный модуль (диалог) и (вследствие его простоты) в методичке не показано, но доступно на диске.

 

unit L2_3;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Menus, ExtCtrls,StdCtrls, ComCtrls;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   N1, N2, N3, N4, N5, N6, N7: TMenuItem;

   OpenDialog1: TOpenDialog;

   SaveDialog1: TSaveDialog;

   Memo1: TMemo;

   Label1: TLabel;

   UpDown1: TUpDown;

   Edit1: TEdit;

   Label2: TLabel;

   public

   { Public declarations }

   procedure N2Click(Sender: TObject);

   procedure N5Click(Sender: TObject);

   procedure N3Click(Sender: TObject);

   procedure Label1Click(Sender: TObject);

   procedure Edit1KeyPress(Sender: TObject; var Key: Char);

   procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);

   procedure N7Click(Sender: TObject);

 end;{class}

var

 Form1: TForm1;

 fin,fout: Text; {текстовый файл для записи эксперимента}

 lines:integer;

implementation

uses Unit1;

{$R *.dfm}

{Реакция на событие – пункт меню “Файл-Открыть”}

procedure TForm1.N2Click(Sender: TObject);

var

fn,st,st1:string;

begin

if OpenDialog1.Execute then begin {успешно закончен}

  fn:=OpenDialog1.FileName;

  AssignFile(fin,fn);    reset(fin);    lines:=0;

  Label1.Visible:=true;

  while NOT (EOF(fin)) do begin

   readln(fin,st);     Memo1.Lines.Add(st);     lines:=lines+1;

  end;

  closefile(fin);    str(lines,st1);

  Label1.Caption:='Прочитан файл '+fn+ ' длиной'+st1;

  st:='';     Memo1.Visible:=true;   lines:=0;    Edit1.visible:=true;

  Label2.Visible:=true;   Edit1.Text:=Memo1.Lines[lines];

  UpDown1.Visible:=true;

end else begin {отменен}

  st:='';

end;

end; {Proc}

{Реакция на событие – пункт меню “Файл-выход”}

procedure TForm1.N5Click(Sender: TObject);

begin

 Close;

end; {Proc}

{Реакция на событие – пункт меню “Файл-Записать”}

procedure TForm1.N3Click(Sender: TObject);

var

st:string;

i:integer;

begin

if SaveDialog1.Execute then begin {успешно закончен}

  st:=SaveDialog1.FileName;

  AssignFile(fout,st);    rewrite(fout);

  for i:=0 to memo1.lines.capacity do begin

   writeln(fout,Memo1.lines[i]);

  end;

  closefile(fout);    Memo1.Visible:=false;    

  Label1.Visible:=false;    Label2.Visible:=false;    

  Edit1.Visible:=false;      UpDown1.Visible:=false;

end else begin {отменен}   st:='';

end;

end; {Proc}

{Реакция на событие - «клик на метку 1»}

procedure TForm1.Label1Click(Sender: TObject);

begin

Memo1.Visible:=false; Label1.Visible:=false;

Label1.Caption:= 'Прочитан файл длиной'

end; {Proc}

{Реакция на событие – клавиатура для Edit1}

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if(key=#13) then begin

 Memo1.Lines[lines]:=Edit1.Text;

end;

end; {Proc}

{Реакция на событие – бегунок текущей позиции}

procedure TForm1.UpDown1Changing(Sender: TObject;

 var AllowChange: Boolean);

var

st:string;

begin

str(UpDown1.position+1,st);  

lines:=UpDown1.position;

Label2.Caption:='Текущая строка файла '+ st;

Edit1.Text:=Memo1.Lines[UpDown1.position];

Label2.Show;

end; {Proc}

{Реакция на событие – диалог «О программе»}

procedure TForm1.N7Click(Sender: TObject);

begin

OkBottomDlg.ShowModal;

end; {Proc}

end.{unit}

Примерный перечень заданий для выполнения студентами

  1.  Задан текстовый файл. Разработать программу поиска в файле заданного слова. Подсчитать количество таких вхождений. Программа должна позволять сформировать исходный файл.
  2.  Задан текстовый файл. Разработать программу замены/удаления в файле заданного слова. Подсчитать количество произведенных операций. Результат помещается в отдельный файл. Программа должна позволять сформировать исходный файл.
  3.  Разработать программу, определяющую, является ли содержимое тектового файла полиндромом, то есть  словом, одинаковым при чтении справа-налево и наоборот.
  4.  Разработать программу вычисления длины вектора. Координаты вектора находятся в файле. Программа должна позволять сформировать исходный вектор.
  5.  Разработать программу вычисления скалярного произведения векторов. Координаты векторов находятся в файле. Программа должна позволять сформировать исходные векторы.
  6.  Разработать программу нахождения максимального и минимального элементов вектора. Координаты вектора находятся в файле. Программа должна позволять сформировать исходный вектор.
  7.  Разработать программу сортировки одномерного массива по возрастанию/убыванию. Элементы массива находятся в файле. Программа должна позволять сформировать исходный массив. Результат помещается в отдельный файл.
  8.  Разработать программу вычисления произведения двух матриц. Матрицы располагаются в отдельных файлах. Программа должна позволять сформировать исходные матрицы. Результат помещается в отдельный файл.
  9.  Разработать программу вычисления суммы двух матриц. Матрицы располагаются в отдельных файлах. Программа должна позволять сформировать исходные матрицы. Результат помещается в отдельный файл.
  10.  Разработать программу, удаляющую из матрицы строку и столбец, содержащие максимальный/минимальный элементы. Матрица располагается в отдельном файле. Программа должна позволять сформировать исходную матрицу. Результат помещается в отдельный файл.
  11.  Разработать программу учета книг в библиотеке. Данные должны располагаться в файле. Программа должна позволять формировать файл. Предусмотреть возможность поиска книги по различным критериям (автор, название, издательство).
  12.  Разработать программу учета успеваимости студентов группы за сессию. Данные должны располагаться в файле. Программа должна позволять формировать файл. Предусмотреть возможность поиска студента по фамилии. Вычислять средний балл конкретного студента и всей группы.
  13.  Разработать программу учета товаров на складе. Данные должны располагаться в файле. Программа должна позволять формировать файл. Предусмотреть возможность поиска товара по наименованию. Вычислять суммарную стоимость имеющихся товаров с учетом их количества и стоимости единицы товара.
  14.  Разработать программу учета автомобилей на станции ТО. Данные должны располагаться в файле. Программа должна позволять формировать файл. Предусмотреть возможность поиска автомобиля по марке. Вычислять суммарную стоимость стоимость произведенных работ.
  15.  Разработать программу учета коммунальных платежей жильцов дома за некоторый период. Данные должны располагаться в файле. Программа должна позволять формировать файл. Предусмотреть возможность поиска информации о жильцах. Вычислять суммарную величину произведенных платежей.

Вопросы для самопроверки

  1.  Когда изменяется текст метки Label1
  2.  Зачем используется элемент контроля – бегунок UpDown?
  3.  Насколько маленьким должен быть считываемый файл?
  4.  Как добавить в меню пункт «Новый файл»?
  5.  Как в меню «Файл» была проведена черта, отделяющая пункт «Выход»?


ЛАБОРАТОРНАЯ  РАБОТА    Л-2.4

Работа с элементарной  2D графикой

Основной целью четвертой лабораторной работы является изучение основных графических примитивов и объектов системы Delphi для работы с графикой.

Материал Уч. Д1, необходимый для написания работы, –

LES01.htm – LES07.htm, LES10.htm

Материал Уч .Д2, необходимый для написания работы, –

Глава 3, пп. 1-3, Глава 4, пп. 1-2

Перечень основных компонент, необходимых для выполнения работы

TFORM, TLABEL, TEDIT, TSCROLLBAR, MessageDlg, MessageBox

Пример разработки приложения с минимальной функциональностью.

Ниже приведена программа, обладающая следующей функциональностью. Имеется меню, содержащее пункты – Моделирование и О программе

Подпункты меню Моделирование позволяют построить ряд стандартных графических примитивов, нарисовать траекторию камня, брошенного под углом к горизонту. Диалоговое окно О программе реализовано как отдельный модуль (диалог) и (вследствие его простоты) в методичке не показано, но доступно на диске.

 

unit L2_4;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Menus, StdCtrls, ComCtrls, ExtCtrls;

const

SizeN=50;

dt=0.05;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   N1,N2,N3,N4,N5,N6,N7,N8: TMenuItem;

   Timer1: TTimer;

   Button1,Button2 ,Button3:: TButton;

   Image1,Image2, Image3: TImage;

 public

   procedure N8Click(Sender: TObject);

   procedure N6Click(Sender: TObject);

   procedure N2Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   procedure N3Click(Sender: TObject);

   procedure Button3Click(Sender: TObject);

   procedure N4Click(Sender: TObject);

   procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);

   procedure Timer1Timer(Sender: TObject);

   procedure Button1Click(Sender: TObject);

 end;{class}

var

 Form1: TForm1;

 PointsArray: array[1..SizeN] of TPoint;

 fi:real;

 vx,vy:real;

 xx,yy,SizeYY:integer;

 t:real;

implementation

uses Unit2_4_2;

{$R *.dfm}

{Обработка события «О программе»}

procedure TForm1.N8Click(Sender: TObject);

begin

 OKRightDlg.ShowModal;

end; {Proc}

{Обработка события «пункт меню Выход»}

procedure TForm1.N6Click(Sender: TObject);

begin

 close;

end;{Proc}

{Обработка события «Моделирование-прямые»}

procedure TForm1.N2Click(Sender: TObject);

var

i:integer; sizeX,sizeY:integer;

begin

Image1.visible:=true;

sizeX:=Image1.BoundsRect.Right-Image1.BoundsRect.Left;

sizeY:=Image1.BoundsRect.Bottom – Image1.BoundsRect.Top;

 randomize;

for i:=1 to SizeN do begin

  PointsArray[i].X:=random(sizeX);   PointsArray[i].Y:=random(sizeY);

end;

Image1.Canvas.MoveTo(PointsArray[1].X,PointsArray[1].Y);

for i:=2 to SizeN do begin

 Image1.Canvas.Lineto(PointsArray[i].X,PointsArray[i].Y);

end;

Button2.Visible:=true;

end; {Proc}

{Обработка события «Закончить рисование линий»}

procedure TForm1.Button2Click(Sender: TObject);

begin

Image1.visible:=false;  Button2.Visible:=false;

end; {Proc}

{Обработка события «Моделирование - эллипсы»}

procedure TForm1.N3Click(Sender: TObject);

var

i:integer;

sizeX,sizeY:integer;

begin

Image2.visible:=true;

sizeX:=Image2.BoundsRect.Right-Image2.BoundsRect.Left;

sizeY:=Image2.BoundsRect.Bottom-Image2.BoundsRect.Top;

 randomize;

for i:=1 to SizeN do begin

  PointsArray[i].X:=random(sizeX);   PointsArray[i].Y:=random(sizeY);

end;

for i:=1 to SizeN do begin

 Image2.Canvas. Ellipse(PointsArray[i].X,PointsArray[i].Y,

                        PointsArray[i].Y,PointsArray[i].X);

end;

Button3.Visible:=true;

end; {Proc}

{Обработка события «Закончить рисование эллипсов»}

procedure TForm1.Button3Click(Sender: TObject);

begin

Image2.visible:=false;  Button3.Visible:=false;

end; {Proc}

{Обработка события пункт меню «Камень»}

procedure TForm1.N4Click(Sender: TObject);

var

i:integer;

sizeX,sizeY:integer;

begin

Image3.visible:=true;  Button1.visible:=true;

sizeX:=Image3.BoundsRect.Right-Image3.BoundsRect.Left;

sizeY:=Image3.BoundsRect.Bottom-Image3.BoundsRect.Top;

sizeYY:=Image3.BoundsRect.Bottom – Image3.BoundsRect.Top;

vx:=round(50/1.4);  vy:=round(50/1.4);  fi:=arctan(vy/vx);

xx:=0; yy:=sizeY; t:=0;

Image3.Canvas.MoveTo(0,SizeY);

Image3.Canvas.Lineto(0+round(50*Cos(fi)), SizeY-round(50*Sin(fi)));

Image3.Canvas.MoveTo(0,SizeY);

Image3.Canvas.Pen.Color:=clBlue;

end; {Proc}

{Обработка события «Угол наклона»}

procedure TForm1.UpDown1Changing(Sender: TObject;

 var AllowChange: Boolean);

 begin

  fi:=arctan(vy/vx);

end; {Proc}

{Обработка события «Таймер»}

procedure TForm1.Timer1Timer(Sender: TObject);

begin

t:=t+dt;

xx:=round(xx+vx*dt);  vy:=vy-10*dt;  yy:=round(yy-vy*dt);

Image3.Canvas.LineTo(xx,yy);

if(yy>sizeYY) then begin

 Timer1.enabled:=false;   button1.Caption:='STOP';

end;

end; {Proc}

procedure TForm1.Button1Click(Sender: TObject);

begin

if(button1.caption='START') then begin

 Timer1.Enabled:=true;

end else begin

 button1.Caption:='START';   button1.Visible:=false;

 Timer1.enabled:=false;   Image3.Hide;

end;

end; {Proc}

end{Unit}.

Примерный перечень заданий для выполнения студентами

Построить графики и численно найти нули следующих функций (координатные оси должны быть нарисованы и подписаны)

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  Найти численное значение числа π, используя следующий алгоритм: строится круг единичного радиусас центром в начале координат, вокруг него описывается квадрат. В пределах построенного квадрата случайным образом ставятся точки. При этом

,

где N – общее число точек, m – число точек, попавших в круг, Skp – площадь круга, Skb –  площадь квадрата. Изобразить решение графически.

Вопросы для самопроверки

  1.  Элемент управления UpDown для выбора угла бросания не работает, как его настроить?
  2.  Камень в примере летит «как то не так…», что надо сделать, чтобы действительно нарисовать параболу?
  3.  Почему затирается текст «Рисуем линии» при действиях с окном формы, а область Image - нет?
  4.  На каких еще видимых элементах можно рисовать?
  5.  Как правильно выводить на форму массивы точек, чтобы они не затирались при перерисовке окна?


ЛАБОРАТОРНАЯ  РАБОТА    Л-2.5

ООП, классы, методы, наследование

Целью пятой лабораторной работы является освоение концепций наследования, полиморфизма и виртуальных правил на базе простых иерархий графических объектов. При этом используются процедуры работы с графикой стандартных классов системы Delphi, порожденных от TСontrol, осваивается материал, связанный со сложными (векторными свойствами) и обработка клавиатурных событий.

Материал Уч. Д1, необходимый для написания работы, –

LES01.htm – LES07.htm, LES10.htm

Материал Уч. Д2, необходимый для написания работы –

Глава 3, пп. 1-3, Глава 4, пп. 1-2

Перечень основных компонент, необходимых для выполнения работы

TFORM, TLABEL,  MessageDlg, MessageBox

Пример разработки приложения с минимальной функциональностью.

Ниже приведена программа, обладающая следующей функциональностью. Имеется меню, содержащее пункты – Работа и О программе,

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

Диалоговое окно О программе  реализовано как отдельный модуль (немодальный диалог) и (вследствие его простоты) в методичке не показан, но доступен на диске.

unit Unit1;    // Работа с формой главного окна приложения

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Menus,Unit2,Unit3,ExtCtrls, ComCtrls, StdCtrls;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   N1: TMenuItem;

   N2: TMenuItem;

   point: TMenuItem;

   circle: TMenuItem;

   N_angle: TMenuItem;

   N6: TMenuItem;

   exit: TMenuItem;

  public

   procedure exitClick(Sender: TObject);

   procedure N2Click(Sender: TObject);

   procedure pointClick(Sender: TObject);

   procedure FormKeyDown(Sender: TObject; var Key: Word;

     Shift: TShiftState);

   procedure circleClick(Sender: TObject);

   procedure N_angleClick(Sender: TObject);

   procedure FormPaint(Sender: TObject);

 end;{class}

var

 Form1:        TForm1;

 Point1:       TMyPoint;

 FlagPoint:    Boolean; //Активность

 ObjectType:integer;

implementation

{$R *.dfm}

{Обработка пункта меню «Выход»}

procedure TForm1.exitClick(Sender: TObject);

begin

Close; {Окончание работы}

end; {proc}

{Обработка пункта меню «О программе»}

procedure TForm1.N2Click(Sender: TObject);

begin

Form2.Show;

end; {proc}

{Обработка пункта меню «Точка»}

procedure TForm1.pointClick(Sender: TObject);

begin

ObjectType:=1;

Point1:=TMyPoint.Create(100,100,clRed);// создана красная точка

Point1.Show;          // показать

FlagPoint:=True;     // сделать активной для клавиатуры

end; {proc}

{Обработка события на форме  – нажатие на клавиатуре }

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

 Shift: TShiftState);

var

i:integer;

begin

 if(FlagPoint) then begin

  // Если точка активна, то клавиатурные нажатия

  // изменяют ее поля так

  // пробел - изменение цвета по модулю 16

  // управление курсором - перемещение точки

  case Key of

   VK_Space:   begin

                         Point1.Hide;  Point1.Color:=Point1.Color+255;  Point1.Show;

                       end;

   Vk_Right:   begin

                        Point1.Hide; Point1.X:= (Point1.X+1) mod Form1.Width;  Point1.Show;

                      end;

   Vk_Left:    begin

                       Point1.Hide;  Point1.X:= (Point1.X-1) mod Form1.Width;

                       if(Point1.X<0) then Point1.X:= Point1.X+Form1.Width;

                       Point1.Show;

                    end;

   Vk_Up:     begin

                      Point1.Hide;    Point1.Y:= (Point1.Y-1) mod Form1.Height;

                      if(Point1.Y<0) then Point1.Y:= Point1.X+Form1.Height;

                      Point1.Show;

                    end;

   VK_Down:begin

                      Point1.Hide;  Point1.Y:= (Point1.Y+1) mod Form1.Height;   Point1.Show;

                     end;

   VK_Escape:begin

                         Point1.Hide; Point1.Free;      // Деструктор

                         FlagPoint:=False; // неактивна

                         ObjectType:=0;

                      end;

 end;{case}

 if ObjectType>1 then begin

   // доступны рястяжения - сжатия

   case Key of

    VK_F1:   begin

                    (Point1 as Tcircle).Expand(5);

                  end;

    VK_F2:  begin

                    (Point1 as Tcircle).Contract(5);

                  end;

 end;//case

end;

if ObjectType>2 then begin

  // доступны вращения

  case Key of

   VK_F3:   begin

                   (Point1 as TPoligon).Rotate(Pi/20);

                  end;

   VK_F4:   begin

                    (Point1 as TPoligon).Rotate(-Pi/20);

                  end;

 end;//case

end;

end; {if}

end;{proc}

{Обработка пункта меню «Окружность»}

procedure TForm1.circleClick(Sender: TObject);

begin

Point1:=TCircle.Create(100,100,50,clGreen);// создан зеленый круг

ObjectType:=2;      

Point1.Show;          // показать

FlagPoint:=True;     // сделать активной для клавиатуры

end; {proc}

{Обработка пункта меню «Многоугольник»}

procedure TForm1.N_angleClick(Sender: TObject);

begin

Point1:=TPoligon.Create(100,100,50,6,clBlue);// создан синий шестиугольник

ObjectType:=3;

Point1.Show;          // показать

FlagPoint:=True;     // сделать активной для клавиатуры

end; {proc}

{Обработка события формы - перерисовка}

procedure TForm1.FormPaint(Sender: TObject);

begin

if (FlagPoint=True) and (ObjectType=3) then begin

 (Point1 as TPoligon).Show;

end;

end; {proc}

end. {Unit1}

// ============ Второй модуль программы ========================

unit Unit3;  // Пользовательская иерархия графических объектов

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Menus,ExtCtrls;

type

// Наша декларация точки

// Основное - использование массива TForm.Canvas.Pixels[x,y]

//

 TMyPoint = class  {Объект}

  public

  X,Y:         Integer;

  Visible:     Boolean;       {свойство  - Видимость !!!}

  Color:       TColor;

 public

 function GetX: Integer;                {Получить координату Х}

  function GetY: Integer;                {Получить координату Х}

  constructor Create(InitX, InitY: Integer;IColor:TColor);

  destructor Free;virtual;

  procedure Show;virtual;                    {Показать объект на экране}

  procedure Hide;virtual;                    {Убрать объект с экрана }

  function  IsVisible: Boolean;               {Проверить видимость объекта }

  procedure MoveTo(NewX, NewY: Integer);     { Переместить объект}

 end;{class}

// Наша декларация круга

// Основное - использование виртуальных правил в модуле 1

//

 TCircle = class (TMyPoint) {Объект круг - наследник точки}

   R: Integer;      { Его новое качество - радиус }

  public

   constructor Create(InitX, InitY: Integer;  InitRadius: Integer;IColor:TColor);

   destructor Free;override;

   procedure Show; override;

   procedure Hide; override;    { Новое правило перекроет правило точки !!! }

   procedure Expand(ExpandBy: Integer);      {Правило Расшириться }

   procedure Contract(ContractBy: Integer);  {Правило Сжаться }

 end; ;{class}

// Наша декларация правильного многоугольника

// Основное – использование массива TStrings для хранения точек и

// корректной перерисовки фигуры при смещении окна

 TPoligon = class (TCircle) {Объект правильный многоугольник - наследник точки}

  Points: array of TPoint;

  NumOfVertex: integer; //число вершин

  Phi: double;  // начальный угол для одной из вершин (1)

 public

  constructor Create(InitX, InitY, IR,INum: Integer;IColor:TColor);

  destructor Free;override;

  procedure Recalculate;

  procedure Show;override; { Новое правило перекроет правило точки !!! }

  procedure Hide;override; { Новое правило перекроет правило точки !!! }

  procedure Rotate(phi1: double);  { Вращать}

 end;{class}

implementation

uses unit1;

// Реализация класса Point

constructor TMyPoint.Create(InitX, InitY: Integer;

                         IColor:TColor);

begin

X:=InitX;  Y:=InitY;  Visible := False;{ Первоначально точка невидима }

Color:=Icolor;

end; {proc}

destructor TMyPoint.Free;

begin

end; {proc}

function TMyPoint.GetX: Integer;

begin  GetX := X; end; {proc}

function TMyPoint.GetY: Integer;

begin  GetY := Y; end; {proc}

procedure TMyPoint.Show;

begin

Visible := True;          { Делаем атрибут точки - видимая }

with Form1.Canvas do begin

 { Прорисовываем ее цветом }

 // Когда "толстая" точка приведет к ошибке?

 Pixels[X,Y]:=Color;   Pixels[X+1,Y]:=Color;

 Pixels[X-1,Y]:=Color;  Pixels[X,Y+1]:=Color;   Pixels[X,Y-1]:=Color;

end;

end; {proc}

procedure TMyPoint.Hide;

begin

Visible := False;           { Атрибут точки - невидимая }

with Form1.Canvas do begin

 { Прорисовываем ее цветом фона окна }

 Pixels[X,Y]:=clBtnFace;   Pixels[X+1,Y]:=clBtnFace;

 Pixels[X-1,Y]:=clBtnFace;   Pixels[X,Y+1]:=clBtnFace;   Pixels[X,Y-1]:=clBtnFace;

end;

end; {proc}

function TMyPoint.IsVisible: Boolean;

begin

IsVisible := Visible;

end; {proc}

procedure TMyPoint.MoveTo(NewX, NewY: Integer);

begin

Hide;         { Спрятать объект. Заметьте, что это верно и для потомков!}

X := NewX;  Y := NewY;

Show;        { Показать объект. Заметьте, что это верно и для потомков!}

end; {proc}

//Реализация методов объекта Circle:

constructor TCircle.Create(InitX, InitY: Integer; InitRadius: Integer;IColor:TColor);

begin

 inherited Create(InitX, InitY,IColor); { Вызвать конструктор родителя }

R := InitRadius;     { Установить начальный радиус  }

end; {proc}

destructor TCircle.Free;

begin

 inherited Free;

end; {proc}

procedure TCircle.Show;

var

tmpcolor:TColor;

begin

tmpColor:=Form1.Canvas.Pen.Color;  Form1.Canvas.Pen.Color:=Color;

Form1.Canvas.Ellipse(X-(R div 2),Y-(R div 2),X+(R div 2),Y+(R div 2));

Form1.Canvas.Pen.Color:=tmpColor;

Visible := True;             { Атрибут объекта - видимый }

end; {proc}

procedure TCircle.Hide;

var

TmpColor: TColor;

begin

tmpColor:=Form1.Canvas.Pen.Color;   Form1.Canvas.Pen.Color:=clBtnFace;

Form1.Canvas.Ellipse(X-(R div 2),Y-(R div 2),X+(R div 2),Y+(R div 2));

Form1.Canvas.Pen.Color:=tmpColor;

Visible := False;            { Атрибут объекта - невидимый }

end; {proc}

procedure TCircle.Expand(ExpandBy: Integer);

begin

Hide;                               { Спрятать объект }

R := R + ExpandBy;        { Увеличить радиус }

if R < 0 then R := 0;

Show;                               { Прорисовать с новым радиусом}

end; {proc}

procedure TCircle.Contract(ContractBy: Integer);

begin

 Expand(-ContractBy);  { Использовать расширение со знаком минус }

end; {proc}

//Реализация методов объекта Poligon

constructor TPoligon.Create(InitX, InitY, IR,INum: Integer;IColor:TColor);

var

 i:integer;

begin

{ Вызвать конструктор родителя, черный круг}

 inherited Create(InitX, InitY,IR, clBlack);

NumofVertex:=INum;   // число вершин

Phi:=0;              // начальный угол

 SetLength(Points, NumofVertex); //установить размер массива

 Recalculate;

end; {proc}

destructor TPoligon.Free;

begin

 inherited Free;

Points:=nil;

end; {proc}

procedure TPoligon.Recalculate; // Пересчет координат вершин

var

i:integer;

begin

for i:=0 to NumofVertex do begin

 Points[i].X:=trunc(X+R*Cos(phi+i*2*Pi/NumofVertex));

 Points[i].Y:=trunc(Y+R*Sin(phi+i*2*Pi/NumofVertex));

end;

end; {proc}

procedure TPoligon.Show;

var

tmpcolor:TColor;  i:integer;

begin

 Recalculate;

tmpColor:=Form1.Canvas.Pen.Color;  Form1.Canvas.Pen.Color:=Color;

Form1.Canvas.MoveTo(Points[0].x,Points[0].Y);

for i:=Low(Points)+1 to High(Points)  do begin

  Form1.Canvas.LineTo(Points[i].x,Points[i].Y);

end;

Form1.Canvas.LineTo(Points[0].x,Points[0].Y);

Form1.Canvas.Pen.Color:=tmpColor;

Visible := True;                  { Атрибут объекта - видимый }

end; {proc}

procedure TPoligon.Hide;

var

TmpColor: TColor;

i:integer;

begin

 Recalculate;

tmpColor:=Form1.Canvas.Pen.Color;  Form1.Canvas.Pen.Color:=clBtnFace;

Form1.Canvas.MoveTo(Points[0].x,Points[0].Y);

for i:=Low(Points)+1 to High(Points)  do begin

 Form1.Canvas.LineTo(Points[i].x,Points[i].Y);

end;

Form1.Canvas.LineTo(Points[0].x,Points[0].Y);

Form1.Canvas.Pen.Color:=tmpColor;

Visible := False;            {Атрибут объекта - невидимый}

end; {proc}

procedure TPoligon.Rotate(phi1:double);

begin

Hide;                               {Спрятать объект}

phi:=phi+phi1;

Show;                               {Прорисовать с новым радиусом}

end; {proc}

end. {Unit3}

Примерный перечень заданий для выполнения студентами.

Реализовать следующие иерархии объектов и заданные методы для них. На примере этих объектов продемонстрировать позднее связывание и полиморфизм

  1.  Точка – дуга окружности – сектор.
    Методы: движение, растяжение, сжатие.
  2.  Отрезок –
                     квадрат – закрашенный квадрат,
                     равносторонний треугольник
    Методы: сжатие, растяжение, поворот, движение.
  3.  Точка – окружность – вписанный n-угольник
                                      – описанный n-угольник
    Методы: движение, растяжение, сжатие.
  4.  Список телефонов – отсортирован по номеру
                                    – отсортирован по имени
    Методы: вывод списка, поиск телефона, поиск абонента, добавление списка.
  5.  Коллекция графических объектов.
    Методы: добавление элемента в колекцию, вывод на экран, запись в файл, чтение из файла.
  6.  Точка – единичные вектор – ортонормированный репер – 3-х мерный репер.
    Методы  – сдвиг, повороты, растяжение-сжатие.
  7.  Точка, окружность, эллипс:
    Методы – рисование, стирание, движение, растяжение, сжатие, вращение.
  8.  Точка, окружность, правильный n-угольник вписанный в окружность.
    Методы: движение, растяжение, сжатие, вращение.
  9.  Точка, окружность, Правильный n-угольник описанный около окружности: Методы: движение, растяжение, сжатие, вращение
  10.  Точка, окружность, Правильный звездный n-угольник вписанный в окружности: Методы: движение, растяжение, сжатие, вращение, изменение числа сторон
  11.  Функция одного аргумента (y=f(x))
    Методы: табулирование, построение графика на отрезке [a,b], вычисление интеграла на отрезке [a,b],  вычисление производной в точке x.
  12.  Комплексное число
    Методы: вывод на экран (текстовый и графический), сложение, вычитание, умножение, деление.
  13.  Нелинейное уравнение: F(x) = 0, a =< x =< b.
    Методы: Нахождение нулей, построение графика и табулирование функции F(x).
  14.  Дифференциальное уравнение: dx/dt = F(x,t), x(0) = x0, 0 <= t <= T
    Методы: численное решение, построение графика функции x(t), вывод численных значений функции x(t) на экран и в файл.
  15.  Система линейных алгебраических уравнений (СЛАУ):
    ввод исходных данных из текстового файла и с клавиатуры, решение, выдача решения на экран и в текстовый файл.

Вопросы для самопроверки

  1.  Какой толщины рисуется точка?
  2.  Чем отличается окно «О программе» в данной лабораторной работе от предыдущих?
  3.  Как вращается многоугольник?
  4.  Как исправить затирание объектов при наезде на них других объектов?
  5.  При каких действиях многоугольник показывается правильно, и когда затирается?


ЛАБОРАТОРНАЯ   РАБОТА    Л-2.6

Работа со стандартными компонентами Delphi.

Целью шестой лабораторной работы является приобретение опыта работы с рядом стандартных компонент системы Delphi, взаимодействия между ними и разработка простой системы контекстной помощи. Последняя строится с использованием подготавливаемого студентом файла MSWord в формате *.rtf, и инструментального средства Microsoft Help Workshop. Описание основных этапов подготовки файла справки доступно студенту в электронном виде.

 

Материал Уч. Д1, необходимый для написания работы, –

LES01.htm – LES07.htm, LES10.htm

Материал Уч. Д2, необходимый для написания работы, –

Глава 3, пп. 1-3, Глава 4, пп. 1-2

Перечень основных компонент, необходимых для выполнения работы

TForm, TLabel,  TButton, TRadioButton, TListBox, TComboBox, TGroupBox, Ttimer,TOKRightDlg, Timage, TOpenPictureDialog, TFontDialog, TColorDialog, TPagesDlg, TPageControl, TMediaPlayer, TstringGrid, MessageDlg, MessageBox

Пример разработки приложения с минимальной функциональностью.

Ниже приведена программа, обладающая следующей функциональностью. Имеется меню, содержащее пункты – Работа с компонентами и О программе,

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

// Главная форма приложения

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Menus, Unit2, StdCtrls, ExtCtrls, Unit5, MPlayer;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   N1: TMenuItem;

   N2: TMenuItem;

   N3: TMenuItem;

   N4: TMenuItem;

   N5: TMenuItem;

   N6: TMenuItem;

   N7: TMenuItem;

   N8: TMenuItem;

   N9: TMenuItem;

   N10: TMenuItem;

   N11: TMenuItem;

   N12: TMenuItem;

   ListBox1: TListBox;

   ComboBox1: TComboBox;

   Label1: TLabel;

   Label2: TLabel;

   GroupBox1: TGroupBox;

   CheckBox1: TCheckBox;

   CheckBox2: TCheckBox;

   GroupBox2: TGroupBox;

   RadioButton1: TRadioButton;

   RadioButton2: TRadioButton;

   Button1: TButton;

   Button2: TButton;

   CheckBox3: TCheckBox;

   Timer1: TTimer;

   procedure N11Click(Sender: TObject);

   procedure N10Click(Sender: TObject);

   procedure N2Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   procedure N4Click(Sender: TObject);

   procedure N5Click(Sender: TObject);

   procedure RadioButton1Click(Sender: TObject);

   procedure RadioButton2Click(Sender: TObject);

   procedure Timer1Timer(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure N6Click(Sender: TObject);

   procedure N8Click(Sender: TObject);

   procedure N7Click(Sender: TObject);

   procedure N12Click(Sender: TObject);

 end;{class}

var

 Form1: TForm1;

implementation

uses Unit4;

{$R *.dfm}

// Показать элементы формы

procedure ShowChoices;

begin

with Form1 do begin

  Label1.Visible:=true;   Label2.Visible:=true;

  ComboBox1.Visible:=true;   ListBox1.Visible:=true;

  GroupBox2.Visible:=true;   GroupBox1.Visible:=true;

  Button1.Visible:=true;   Button2.Visible:=true;

end;

end;{proc}

// Спрятать элементы формы

procedure HideChoices;

begin

with Form1 do begin

  Label1.Visible:=false;    Label2.Visible:=false;

  ComboBox1.Visible:=false;    ListBox1.Visible:=false;

  GroupBox2.Visible:=false;    GroupBox1.Visible:=false;

  Button1.Visible:=false;    Button2.Visible:=false;

end;

end;{proc}

// Запомнить комбинированный список в соответствии с выбором типа процессора

procedure FillComboBox;

begin

with Form1 do begin

 if RadioButton1.Checked then begin

  // Intel Platform

  ComboBox1.Clear;

  ComboBox1.AddItem('Pentium II   600Mz',nil);

  ComboBox1.AddItem('Celeron      900Mz',nil);

  ComboBox1.AddItem('Pentium III 1100Mz',nil);

 end else begin

  ComboBox1.Clear;

  ComboBox1.AddItem('AMD K6  600Mz',nil);

  ComboBox1.AddItem('AMD K7  900Mz',nil);

  ComboBox1.AddItem('AMD K7 1500Mz',nil);

  // AMD platform

 end;

end;

end;{proc}

// Выбор пункта меню  «О программе»

procedure TForm1.N11Click(Sender: TObject);

begin

Form2:=TForm2.Create(self);

end;{proc}

// Выбор пункта меню «Выход»

procedure TForm1.N10Click(Sender: TObject);

begin

Close;

end; {proc}

// Выбор пункта меню “Cписки”

procedure TForm1.N2Click(Sender: TObject);

begin

ShowChoices;

Label1.Visible:=true;

Label2.Visible:=true;

ListBox1.Enabled:=true;

if(GroupBox2.Enabled) then begin

 ComboBox1.Enabled:=true;

end;

Button2.Enabled:=true;

end; {proc}

//Выбор кнопки Cancel на форме  

procedure TForm1.Button2Click(Sender: TObject);

var

i:integer;

begin

MessageDlg('Вы отказались от выбора',

             mtInformation, [mbOK], 0);

HideChoices;

ListBox1.Enabled:=false;

ComboBox1.Enabled:=false;

Button1.Enabled:=false;

Label1.Visible:=false;

Label2.Visible:=false;

Button2.Enabled:=false;

GroupBox1.Enabled:=false;

GroupBox2.Enabled:=false;

end; {proc}

//Выбор пункта меню “Кнопки”

procedure TForm1.N4Click(Sender: TObject);

begin

ShowChoices;

Button2.Enabled:=true;

GroupBox1.Enabled:=true;

end; {proc}

// Выбор пункта меню “Радиокнопки”

procedure TForm1.N5Click(Sender: TObject);

begin

ShowChoices;

Button2.Enabled:=true;

if(ListBox1.Enabled) then begin

 // пункт меню Списки был выбран ранее

 GroupBox2.Enabled:=true;

 ComboBox1.Enabled:=true;

end;

RadioButton1.Checked:=true;

FillComboBox;

end; {proc}

// нажатие на радиокнопку Intel

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

FillComboBox;

Form1.ComboBox1.ItemIndex:=0;

end; {proc}

// нажатие на радиокнопку AMD

procedure TForm1.RadioButton2Click(Sender: TObject);

begin

FillComboBox;

Form1.ComboBox1.ItemIndex:=0;

end; {proc}

// проверка готовности заполнения формы

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if ((ComboBox1.ItemIndex<>-1) AND

   (ListBox1.ItemIndex<>-1) AND

   (GroupBox1.Enabled) AND

    (GroupBox2.Enabled))

then begin

 Button1.Enabled:=True;

end;

end; {proc}

// Обработка нажатия кнопки  «Готово»

procedure TForm1.Button1Click(Sender: TObject);

var st: string;

begin

st:= 'Ваш выбор'+#13+#13+

' Процессор '+ComboBox1.Items[ListBox1.ItemIndex]+ #13+

' жесткий диск '+ListBox1.Items[ListBox1.ItemIndex] + #13;

if(CheckBox1.Checked) then begin

 st:=st+' Модем'+#13;

end;

if(CheckBox2.Checked) then begin

 st:=st+' '+CheckBox2.Caption+#13;

end;

if(CheckBox3.Checked) then begin

 st:=st+' '+CheckBox3.Caption+#13;

end;

ShowMessage(st);

HideChoices;

ListBox1.Enabled:=false;

Label1.Visible:=false;

Label2.Visible:=false;

ComboBox1.Enabled:=false;

Button1.Enabled:=false;

Button2.Enabled:=false;

GroupBox1.Enabled:=false;

GroupBox2.Enabled:=false;

end; {proc}

// Пункт меню   «Диалоги»

procedure TForm1.N6Click(Sender: TObject);

begin

 if OKRightDlg.ShowModal= mrCancel then begin

   Beep;

 end else begin

 end;

end; {proc}

// Пункт меню   «Мультимедиа»

procedure TForm1.N8Click(Sender: TObject);

begin

 // открыт для работы с плэйером

 Timer1.Enabled:=false; //таймер был нужен для синхронизации в части 1

 PagesDlg.PageControl1.TabIndex:=0;

 PagesDlg.Label1.Visible:=True;

 PagesDlg.Label2.Visible:=false;

 PagesDlg.Button1.Visible:=false;

 PagesDlg.OKBtn.enabled:=true;

 if(PagesDlg.ShowModal=1) then begin

  // закончился по кнопко ОК

  PagesDlg.Label1.Visible:=false;

 end else begin

  PagesDlg.OKBtn.enabled:=false;

  PagesDlg.Label1.Visible:=false;

  beep;

  // закончился через Cancel или закрытие окна

 end;

end; {proc}

// Пункт меню  «Таблица»

procedure TForm1.N7Click(Sender: TObject);

begin

 // открыт для работы с таблицей

 Timer1.Enabled:=false; //таймер был нужен для синхронизации в части 1

 PagesDlg.Timer1.Enabled:=True; //таймер нужен для оценки готовности таблицы 1

 PagesDlg.PageControl1.TabIndex:=1;

 PagesDlg.StringGrid1.Enabled:=true;

 PagesDlg.TableClear;

 if(PagesDlg.ShowModal=1) then begin

  // закончился по кнопко ОК

 end else begin

  beep;

  // закончился через Cancel или закрытие окна

 end;

 PagesDlg.OKBtn.enabled:=false;

 PagesDlg.Timer1.Enabled:=false; //таймер нужен для оценки готовности таблицы 1

end; {proc}

// Выбор пункта меню «Мини Помощь»

procedure TForm1.N12Click(Sender: TObject);

begin

winhelp(Form1.Handle,'project_l2_6.hlp',HELP_CONTEXT,1);

end; {proc}

end. //unit1

// Диалоговая (модальная) форма для стандартных диалогов

unit Unit4;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,

 Buttons, ExtCtrls, Dialogs, ExtDlgs;

type

 TOKRightDlg = class(TForm)

   OKBtn: TButton;

   CancelBtn: TButton;

   Bevel1: TBevel;

   OpenPictureDialog1: TOpenPictureDialog;

   FontDialog1: TFontDialog;

   ColorDialog1: TColorDialog;

   Image1: TImage;

   BitBtn1: TBitBtn;

   BitBtn2: TBitBtn;

   BitBtn3: TBitBtn;

   procedure BitBtn1Click(Sender: TObject);

   procedure BitBtn2Click(Sender: TObject);

   procedure BitBtn3Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;{class}

var

 OKRightDlg: TOKRightDlg;

implementation

{$R *.dfm}

// Обработка нажатия кнопки   диалога выбора картинки

procedure TOKRightDlg.BitBtn1Click(Sender: TObject);

begin

if (OpenPictureDialog1.Execute)then begin

  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

end; {proc}

// Обработка нажатия кнопки   диалога выбора фонта

procedure TOKRightDlg.BitBtn2Click(Sender: TObject);

begin

if (FontDialog1.Execute)then begin

 BitBtn2.Font:=FontDialog1.Font;

end;

end; {proc}

// Обработка нажатия кнопки   диалога выбора цвета

procedure TOKRightDlg.BitBtn3Click(Sender: TObject);

begin

if(ColorDialog1.Execute)then begin

 OKRightDlg.Color:=ColorDialog1.Color;

end;

end; {proc}

end. // unit4;

// Диалоговая форма для демонстрации страничного доступа, работы с таблицей и использования медиапроигрывателя.

unit Unit5;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,

 Buttons, ComCtrls, ExtCtrls, MPlayer, Grids,QDialogs;

type

 TPagesDlg = class(TForm)

   Panel1: TPanel;

   Panel2: TPanel;

   PageControl1: TPageControl;

   TabSheet1: TTabSheet;

   TabSheet2: TTabSheet;

   OKBtn: TButton;

   CancelBtn: TButton;

   StringGrid1: TStringGrid;

   MediaPlayer1: TMediaPlayer;

   Label1: TLabel;

   Label2: TLabel;

   Button1: TButton;

   Label3: TLabel;

   Timer1: TTimer;

   procedure FormActivate(Sender: TObject);

   procedure FormDeactivate(Sender: TObject);

   procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);

   procedure Button1Click(Sender: TObject);

   procedure TableClear;

   procedure Timer1Timer(Sender: TObject); //очистка таблицы

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 PagesDlg: TPagesDlg;

implementation

uses

unit1;

{$R *.dfm}

// Обработка входа в диалоговую форму

procedure TPagesDlg.FormActivate(Sender: TObject);

begin

if (PageControl1.TabIndex=0) then begin

 // работа с плеером

 StringGrid1.Enabled:=false;

 StringGrid1.Visible:=false;

 MediaPlayer1.Enabled:=true;

 MediaPlayer1.Visible:=true;

 MediaPlayer1.Open;

 MediaPlayer1.Play;

end else begin

 // работа с таблицей

 MediaPlayer1.Enabled:=false;

end;

end; {proc}

// Обработка выхода их диалоговой формы

procedure TPagesDlg.FormDeactivate(Sender: TObject);

begin

if (PageControl1.TabIndex=0) then begin

 // работа с плеером

 MediaPlayer1.Stop;

 StringGrid1.Enabled:=true;

 StringGrid1.Visible:=true;

end else begin

 // работа с таблицей

 MediaPlayer1.Enabled:=true;

end;

end; {proc}

// разрешает ввод только цифр и знака минус    в поле Таблицы

procedure TPagesDlg.StringGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case key of

     #8,'0'..'9': ;   //Допустимые коды

     #13: begin

          // клавиша ввода, переход в следующую колонку

           if StringGrid1.Col<StringGrid1.ColCount-1 then begin

            StringGrid1.Col:=StringGrid1.Col+1

           end else begin

            StringGrid1.Col:=0;

            StringGrid1.Row:=(StringGrid1.Row+1) mod StringGrid1.RowCount;

// или строку, если последний столбец

           end;

          end; //#13

     '-' :begin

           if Length(StringGrid1.Cells[

            StringGrid1.Col,StringGrid1.Row])<>0

           then Key:=Chr(0);  //Игнорируем ввод, если символ не первый

          end;

else key:=chr(0); // остальные символы запрещены

end; //case

end; {proc}

// Расчет суммы по нажатию на кнопку

procedure TPagesDlg.Button1Click(Sender: TObject);

var

i,j,summa:integer;

begin

summa:=0;

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// !!! Обработка исключений корректно работает !!!

// !!! только вне среды разработки Delphi              !!!

// !!! В среде разработки исключение первым      !!!

// !!! перехватывает обработчик среды          !!!

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

try

 for i:=0 to StringGrid1.ColCount-1 do begin

  for j:=0 to StringGrid1.RowCount-1 do begin

    summa:=summa+StrToInt(StringGrid1.Cells[i,j]);

  end;

 end;

 Label3.Caption:=IntToStr(summa);

except

 on EConvertError do

    ShowMessage('Не сформирована матрица');

 end;

end; {proc}

procedure TPagesDlg.TableClear; //очистка таблицы

var

i,j:integer;

begin

for j:=0 to StringGrid1.RowCount-1 do begin

 for i:=0 to StringGrid1.ColCount-1  do begin

  StringGrid1.Cells[i,j]:='';

 end;

end;

end; {proc}

// таймер используется для выставления флага готовности данных в таблице

( включения доступности кнопки ОК)

procedure TPagesDlg.Timer1Timer(Sender: TObject);

var

i,j:integer;

 flag:Boolean;

begin

flag:=False;

for i:=0 to StringGrid1.RowCount-1 do begin

 for j:=0 to StringGrid1.ColCount-1  do begin

  if StringGrid1.Cells[i,j]='' then begin

   // есть незаполненный элемент, запретить кнопку ОК;

   flag:=True;

  end; //if

 end;  //j

end;   //i

if flag then

 OKBtn.Enabled:=false

else OKBtn.Enabled:=true;

end; {proc}

end. //unit5


З
адание для выполнения студентами

1. Разберитесь с демонстрационной программой, представленной выше.

2. Создайте систему контекстной пмощи для одной из своих ранее выполненных лабораторных работ

ЛИТЕРАТУРА

1. Уч. Д1 Справочная система по DELPHI,  каталог  /D1

2. Уч. Д2   Учебник по Дельфи,    каталог /D2


Учебное издание

«Программирование  в  системе  Delphi»

Методические указания к лабораторным работам для студентов
1 курса физического факультета

Авторы

Гневко Сергей Владимирович

Крылов Георгий Геннадьевич

Шапочкина Ирина Викторовна

В авторской редакции

Ответственный за выпуск Г.Г. Крылов

Белорусский государственный университет.

Лицензия на осуществление издательской деятельности
№ 02330/0056804 от 02.03.2004.

220050, Минск, проспект Независимости, 4.

Отпечатано с оригинала-макета заказчика.


 

А также другие работы, которые могут Вас заинтересовать

8688. Феноменологія. Проблема свідомості у філософії 158 KB
  Феноменологія. Проблема свідомості у філософії Філософське розуміння проблеми свідомості. Свідомість. Самосвідомість. Мова. Суспільна та індивідуальна свідомість. Свідоме і несвідоме. Що могутніше розуму? Йому - влад...
8689. Гносеологія. Проблема пізнання. Чи можливо пізнати світ 85 KB
  Гносеологія. Проблема пізнання. Чи можливо пізнати світ. Теорія пізнання, її предмет і метод. Чуттєве і раціональне пізнання. Проблема розуміння в пізнанні. Наукове пізнання. Проблема істини. Істина, хиба, помилка...
8690. Природа як об’єкт вивчення філософії 111 KB
  Природа як об’єкт вивчення філософії. Природа як предмет філософського дослідження. Історичні взаємодії природи і суспільства. Взаємодія природи і суспільства. Екологічна проблема, її філософський смисл. Обніми цю ...
8691. Суспільство як об’єкт вивчення філософії 84 KB
  Суспільство як об’єкт вивчення філософії. Суспільство, його сутність. Суспільство як самоорганізуюча і саморозвиваюча система. Відмінність законів природи і суспільства. Роль географічного природного середовища в житті суспіль...
8692. Філософія науки і техніки 94 KB
  Філософія науки і техніки. Техніка та історія людства. Філософія техніки: історія становлення та предмет вивчення. Головні проблеми досліджень у філософії техніки. Проблема комп’ютеризації та штучного інтелекту. Пр...
8693. Аксіологія. цінності в житті людини і суспільства 118 KB
  Аксіологія. цінності в житті людини і суспільства. Поняття «аксіологія». Місце аксіології в системі культури. Природа цінностей. Цінність і сенс життя людини. Ієрархія цінностей буття людини. Сучасна культурна криза і проблем...
8694. Релігієзнавство як наука. Свобода совісті як елемент демократичних свобод 90 KB
  Релігієзнавство як наука.Свобода совісті як елемент демократичних свобод Богословсько-теологічний, філософський та науковий методи пізнання релігії. Соціології та психологія релігії. Релігійний світогляд. Релігія, її со...
8695. Структура сучасних релігій. Походження та ранні форми релігій 123.5 KB
  Структура сучасних релігій. Походження та ранні форми релігій Особливості віри. Релігійна свідомість: раціональний та емоційно-вольовий аспект. Релігійний культ: зміст і форми. Релігійні організації. Проблема походження релігії...
8696. Національні релігії. Іудаїзм, індуїзм, конфуціанство, даосизм, синтоїзм 207.5 KB
  Національні релігії. Ранні національні релігії: Стародавній Єгипет, Месопотамія, Індія, Китай, античний світ. Пізні національні релігії: іудаїзм, індуїзм, конфуціанство, даосизм, синтоїзм. Ранні національні релігії - це такі реліг...