Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Должно присутствовать

1)  Таблица спецификаций, включая структуру записи файла.

2)  Схема иерархии модулей.

3)  Блок-схемы основных модулей или словесное описание алгоритма по пунктам.

4)  Таблица тестов.

5)  Результаты тестирования (копии экранов).

6)  Листинг основных подпрограмм.

4.1. Общее условие

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

Для открытия/сохранения файлов использовать стандартные диалоговые окна (компоненты OpenDialog и SaveDialog со страницы Dialogs). Данные читать в переменную типа record, структура которой соответствует варианту задания (использовать типизированный файл). Для отображения данных использовать компонент StringGrid.

Также на форме следует разместить кнопки «Изменить», «Удалить», «Добавить» или использовать контекстное меню (PopupMenu). При выборе редактирования/добавления новой записи следует вызывать форму, на которой размещаются компоненты (Edit, MaskEdit, CheckBox, RadioGroup и др. в соответствии с заданием). Для запоминания выбранной строки в StringGrid для редактирования использовать событие onSelectCell (параметр ARow – номер выбранной строки).

НЕ нашли? Не то? Что вы ищете?

Следует учитывать, что в StringGrid для доступа к конкретной ячейке используется метод Cell[j, i], в котором сначала указывается столбец, а потом строка (счет с 0).

Все изменения, производимые во время выполнения приложения хранятся в StringGrid, при выборе пункта «Сохранить» – заносятся в файл.

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

4.2. ЗАДАНИЕ

В базе данных school. dat хранятся сведения о годовых оценках учеников школы: ФИО ученика, класс (4-11), индекс класса (А-Ж), оценки за год по литературе, русскому языку, математике, физкультуре, истории.

Обработка следующих запросов:

-  выдать список учеников-отличников определенного класса;

-  выдать названия классов, в которых учеников больше 20;

-  подсчитать неуспевающих учеников в школе;

-  подсчитать число медалистов.

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

5.1. Система программирования Delphi

Среда разработчика Delphi позволяет визуально строить приложение. После запуска системы на экране размещается пустая форма – главное окно приложения. На данной форме можно размещать различные компоненты, а также добавлять в проект новые формы приложения – дочерние.

Проект имеет расширение *.dpr, формы – *.dfm, исходные тексты модулей – *.pas, *.dcu – откомпилированные модули.

В верхней части располагается главное меню Delphi, ниже представлены страницы палитры компонент, в левой части отображается окно инспектора объектов (Object Inspector), с помощью которого можно на этапе проектирования изменять различные свойства компонентов (закладка Properties) и описывать реакцию на события (Events).

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

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

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

Приложение – основной связующий объект проекта, организующий цикл по обработке поступающих сообщений.

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

Компоненты – объекты, размещаемые на формах и предназначенные для выполнения тех или иных операций по отображению, получению и преобразованию информации.

5.2. Основные свойства компонентов

Свойство – важный атрибут любого компонента. Изменение свойства в инспекторе объектов сразу отражается на визуальной компоненте. Например, если выделить главную форму и в инспекторе объектов поменять свойства Width, то незамедлительно изменится ширина окна формы. Значение свойств можно менять и программно, в ходе выполнения приложения.

Рассмотрим основные свойства, присущие большинству компонентов.

Name – имя компоненты.

Height – длина компоненты.

Width – ширина компоненты.

Top – положение левого верхнего угла компоненты по оси Y.

Left – положение левого верхнего угла компоненты по оси X.

Caption – заголовок.

Font – шрифт текста компоненты.

Style – стиль.

Text – отображаемый текст (например, для компоненты ввода Edit).

и др.

Для программного изменения свойства следует указать имя компонента и свойство. Например,

Form1.Caption:=’Мое первое Windows-приложение’;

If CheckBox1.Checked=true then ….

5.3. События компонентов

Обработка событий заключается в написании кода – обработчика реакции на какое-либо событие. Например, при активном главном окне найдем в инспекторе объектов на закладке Events событие OnClose, которое возникает при закрытии окна. Дважды щелкнув на пустое поле справа от имении события, Delphi автоматически построит каркас обработчика – создаст процедуру:

procedure TИмяФормы. FormClose(Sender: TObject; var Action: TCloseAction);

begin

{Тело процедуры}

end;,

в теле которой можно написать, например, код для отображения окна сообщения:

ShowMessage('Форма закрывается!');

Событие OnCreate возникает при создании компонента, OnClick – при щелчке мышкой по компоненте, OnDblClick – для двойном щелчке мышкой по компоненте, OnMouseMove – при движении курсора мыши над компонентом и т. п.

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

5.4. Компоненты Delphi

Палитра компонентов содержит несколько страниц (Standard, Additional, Dialog, Sample и др.)

Рассмотрим некоторые компоненты страницы Standard (стандартные компоненты).

1) MainMenu – главное окно программы. Служит для создания сложных иерархических меню.

2) PopupMenu – вспомогательное меню, обычно появляется в виде отдельного окна после нажатия правой кнопки мыши. Привязывается к конкретному компоненту.

3) Label – метка. Используется для размещения на форме не очень длинных однострочных надписей.

4) Edit – строка ввода. Предназначена для ввода и/или отображения одной текстовой строки.

5) Memo – многострочный текстовый редактор. Используется для ввода и/или отображения многострочного текста.

6) Button – командная кнопка. Обработчик события OnClick обычно используется для реализации некоторой команды.

7) CheckBox – независимый переключатель. Щелчок мышью по компоненту в работающей программе изменяет логическое свойство Checked.

8) RadioButton – зависимый переключатель. Обычно объединяется как минимум еще с одним таким же компонентом в группу. Щелчок по переключателю приводит к автоматическому освобождению ранее выбранного переключателя в той же группе.

9) ListBox – список выбора. Содержит список предлагаемых вариантов (опций) и дает возможность проконтролировать текущий выбор.

10) ComboBox – комбинированный список выбора. Представляет собой комбинацию списка выбора и текстового редактора.

11) GroupBox – группа элементов. Используется для группировки нескольких связанных по смыслу компонентов.

12) RadioGroup – группа зависимых переключателей. Содержит специальные свойства для обслуживания нескольких связанных зависимых переключателей.

13) Panel – Панель. Используется для визуального объединения нескольких компонентов.

Некоторые компоненты страницы Additional:

1) BitBtn – командная кнопка с надписью и пиктограммой.

2) SpeedButton – пиктографическая кнопка. Обычно используется для быстрого доступа к тем или иным опциям главного меню.

3) MaskEdit – специальный текстовый редактор. Способен фильтровать вводимый текст, например, для правильного ввода даты (задается маска).

4) StringGrid – таблица строк. Обладает мощными возможностями для представления текстовой информации в табличном виде.

5) DrawGrid – произвольная таблица. Строки этого компонента могут содержать произвольную информацию, в том числе и рисунки.

6) Image – рисунок. Предназначен для отображения рисунков.

7) Shape – фигура. Помогает вставить правильную графическую фигуру – прямоугольник, эллипс, окружность и т. п.

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

5.5. Работа с формами

Как известно, существуют информационные окна (формы) и диалоговые. Информационное окно предназначено в основном для вывода информации пользователю. Диалоговые окна – специальные формы, предназначенные для организации диалога пользователя с программой посредством этого окна. Здесь возможна двусторонняя передача информации – как программе, так и пользователю.

Окна могут быть также модальными и немодальными. При открытии окна в немодальном режиме, возможен переход на окно, его вызвавшее, и на другие. При вызове окна в модальном режиме невозможен переход на другие окна до тех пор, пока не закроется модальное окно.

Вызов модального окна осуществляется с помощью метода ShowModal:

Имя_формы. ShowModal;

Немодальное окно вызывается методом Show.

Метод Close закрывает окно (при этом возникает событие закрытия окна OnClose), Hide – делает скрытым (для его отображения используется метод Show).

С каждой формой связан модуль (*.pas). Определив глобальные переменные, например, в главной форме, их можно сделать доступными в дочерних окнах с помощью пункта меню File – Use unit и указать модуль, содержащий описание глобальных переменных.

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

If Form2.Edit1.Text = '' {Если не введено значение} then

Begin

// Выдаем сообщение об ошибке

ShowMessage('Пустое поле!');

// Устанавливаем курсор на Edit1 для ввода

Form2.Edit1.SetFocus;

End;

5.6. Пример обработки исключительных ситуаций.

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

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

EError = class(Exception)

end;

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

A: array[0..4,0..4] of integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

i, j:integer;

begin

//Заполняем матрицуA введенными в StringGrid1 значениями

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

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

begin

try //начало опасного блока

A[i, j]:=StrToInt(StringGrid1.cells[i, j]);

if abs(A[i, j])>1000 then

//создаем собственное исключение

raise EError.Create('Число должно быть в диапазоне [-1000,1000]!');

except // обработка исключительных ситуаций

on E: EError do ShowMessage(E. Message);

on EConvertError do begin

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

ShowMessage('Ошибка в записи числа!');

end;

end;

end;

end;

end.

Для исключения возможных ошибок ввода следует использовать компоненты MaskEdit – ввод с маской, SpinEdit, ComboBox, ListBox, RadioGroup, CheckBox, позволяющие выбрать возможные значения из фиксированного набора.

5.7. Пример реализации приложения

Пусть требуется хранить следующую информацию о лицах: Фамилия, Имя, Возраст. Запрос: подсчитать средний возраст всех лиц.

Создадим новый проект приложения. На главной форме (назовем ее Main – в свойстве Name) разместим компонент MainMenu с пунктами: «Файл» (Открыть, Сохранить, Сохранить как…, Выход), и «Поиск». Также разместим StringGrid и кнопки «Добавить», «Удалить», «Изменить».

Настроим компонент StringGrid. Свойство FixedRow = 1 (фиксированное число строк для заголовков), FixedCols = 0, ColCount = 4 (Количество столбцов - Фамилия, Имя, Пол, Возраст). В составном свойстве Options установим goEditing = False (запретим ручное редактирование в таблице), goRowSelect = True (разрешим выделение всей строки).

Кнопки «Изменить» и «Удалить» первоначально сделаем недоступными (свойство Enabled = False).

Главная форма на этапе проектирования приложения представлена на рис. 5.1.

Рис. 5.1. Главная форма на этапе проектирования

С событием OnShow для формы свяжем следующий код:

procedure TMain. FormShow(Sender: TObject);

begin

//Задаем заголовки столбцов

StringGrid1.Cells[0,0]:='Фамилия';

StringGrid1.Cells[1,0]:='Имя';

StringGrid1.Cells[2,0]:='Пол';

StringGrid1.Cells[3,0]:='Возраст';

Kol:=0;

Nomer:=1;

end;

После запуска приложения (F9) форма примет следующий вид (рис. 5.2):

Рис. 5.2. Главная форма на этапе выполнения приложения

Опишем необходимые переменные в модуле главной форме (Unit1).

Type

Zap = Record //описание записи

Fam: String[20];

Name: String[15];

Pol: Char;

Age: 18..60;

End;

Var

F: File of Zap; //описание типизированного файла

Rec: Zap;

Nomer: Integer; //номер редактируемой строки

I: integer;

Kol: integer; // количество записей

S: integer; // сумма всех возрастов

Sr: Real; //средний возраст

add: boolean;//признак нажатия кнопки «Добавить»

Для доступа к конкретному элементу записи используется следующая конструкция:

Zap. Fam:=’Иванов’;

Или с оператором присоединения (With):

With Zap do

begin

Fam:=’Сидоров’;

Name:=’Сидор’;

Pol:=’м’;

Age:=20;

end;

При нажатии кнопок «Добавить» и «Изменить» должно открываться окно для добавления/редактирования записи (назовем его EditRecord). Свойство FormStyle (стиль формы) желательно установить равным bsDialog.

Компоненты ввода связываются с конкретными полями записи. Разместим на форме Label, Edit, SpinEdit (страница Samples) RadioGroup, две кнопки.

Пример формы ввода/корректировки (рис. 5.3):

Рис. 5.3. Форма редактирования на этапе проектирования приложения

Для компоненты SpinEdit, содержащего информацию о возрасте, установим максимальное (MaxValue=60) и минимальное значение (MinValue=18), Value = 18 (текущее значение), EditorEnabled = False (значение будет только выбираться).

Для компоненты RadioGroup зададим свойства Caption, Items («мужской» и «женский» – должны располагаться в разных строках), ItemIndex = 0 (включенный переключатель. Нумерация с нуля. Значение «-1» означает, что никакой переключатель не выбран). Можно также использовать компонент ComboBox.

Если в главной форме была нажата кнопка «Добавить», то все элементы ввода должны очиститься, если «Изменить» - заполниться значениями изменяемой записи.

Реакция на нажатие кнопки «Добавить»:

procedure TMain. Button1Click(Sender: TObject);

begin

Edit_Record. Caption:='Добавление записи';//Меняем заголовок

add:=true;

Edit_Record. ShowModal;//Вызываем форму Edit_Record

end;

Реакция на нажатие кнопки «Изменить»:

procedure TMain. Button2Click(Sender: TObject);

begin

Edit_Record. Caption:='Изменение записи';//Меняем заголовок

add:=false;

Edit_Record. ShowModal;//Вызываем форму Edit_Record

end;

При отображении формы Edit_Record сделаем необходимые действия (для события OnShow):

procedure TEdit_Record. FormShow(Sender: TObject);

begin

if add=true then //была нажата кнопка "Добавить"

begin

//Очищаем поля ввода

Edit_Record. Edit1.Text:='';

Edit_Record. Edit2.Text:='';

//Задаем значения по умолчанию

Edit_Record. SpinEdit1.Value:=18;

Edit_Record. RadioGroup1.ItemIndex:=0;

end else //нажали кнопку "Изменить"

begin

//необходимо занести поля выделенной записи в элементы ввода

Edit1.Text:=Main. StringGrid1.Cells[0,Nomer];

Edit2.Text:=Main. StringGrid1.Cells[1,Nomer];

SpinEdit1.Value:=StrToInt(Main. StringGrid1.Cells[3,Nomer]);

//StrToInt - преобразует строковый аргумент в целое число

if Main. StringGrid1.Cells[2,Nomer]='м' then

RadioGroup1.ItemIndex:=0 else RadioGroup1.ItemIndex:=1;

end;

end;

Реакция на нажатие кнопки «ОК» на форме редактирования Edit_Record:

procedure TEdit_Record. Button1Click(Sender: TObject);

var d:integer;

begin

//добавляем в таблицу строку, если была нажата кнопка "Добавить"

if add then

begin

Kol:=Kol+1;

Main. StringGrid1.RowCount:= Kol+1;

d:=Kol;

if kol>0 then begin

//Делаем доступными кнопки "Изменить" и "Удалить"

Main. Button2.Enabled:=True;

Main. Button3.Enabled:=True;

end;

end else d:=Nomer;

//Заносим введенные значения в таблицу

Main. StringGrid1.Cells[0,d]:=Edit1.Text;

Main. StringGrid1.Cells[1,d]:=Edit2.Text;

Main. StringGrid1.Cells[3,d]:=IntToStr(SpinEdit1.Value);

//IntToStr - преобразует целое значение в строковое

if RadioGroup1.ItemIndex=0 then Main. StringGrid1.Cells[2,d]:='м'

else Main. StringGrid1.Cells[2,Kol]:='ж';

Close;//Закрываем форму редактирования

end;

Реакция на нажатие кнопки «Отмена» на форме редактирования Edit_Record:

procedure TEdit_Record. Button2Click(Sender: TObject);

begin

Close;//закрываем форму

end;

В событии OnSelectCell для StringGrid, которое возникает при выборе строки таблицы, сохранить номер строки:

procedure TMain. StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;

var CanSelect: Boolean);

begin

Nomer:=Arow; {сохраняем номер выделенной строки}

end;

Реакция на нажатие кнопки «Удалить»:

procedure TMain. Button3Click(Sender: TObject);

begin

if Kol<>0 then

BEGIN

for i:=Nomer to StringGrid1.RowCount-1 do

with StringGrid1 do begin

//сдвигаем строки

cells[0,i]:= cells[0,i+1];

cells[1,i]:= cells[1,i+1];

cells[2,i]:= cells[2,i+1];

cells[3,i]:= cells[3,i+1];

end;

Kol:=Kol-1;

if Kol<>0 then StringGrid1.RowCount:= Kol+1 else

begin

//Делаем недоступными кнопки "Изменить" и "Удалить"

Button2.Enabled:=False;

Button3.Enabled:=False;

end;

end;

end;

Теперь опишем сохранение и открытие файла записей. Для отображения стандартных диалоговых окон сохранения/открытия будем использовать компоненты SaveDialog и OpenDialog со страницы Dialogs, которые разместим на главной форме. В свойство Filter установим «Файл данных|*.dat». Умалчиваемое расширение файлов (DefaultExt) – «dat». В свойстве InitialDir можно задать начальный диск/каталог для открытия/сохранения файла.

Данные компоненты являются невизуальными (т. е. не отображаются при запуске приложения).

Для работы с файлами используются следующие стандартные подпрограммы:

AssignFile(F, FileName) – связывает файл FileName с файловой переменной F.

Reset(F) – открывает файл F для чтения.

RewriteFile(F) – создает новый файл F. Если создаваемый файл уже имеется, перезаписывает его.

Read(F, V1, V2, …) – чтение данных из файла F в переменные.

Write(F, V1, V2, ...) – запись значений переменных в файл F.

Seek(F, N:LongInt) – передвигает указатель файла на N-ю компоненту (N-целое выражение). Первая компонента имеет номер 0. Для того, чтобы расширить файл, следует передвинуть указатель в конец файла функцией Seek.

Seek (F, FileSize(F)) – возвращает число записей в файле F, то есть указывает номер следующей компоненты после последней.

CloseFile(F) – закрывает файл F.

DeleteFile(F) – удаляет файл F.

RenameFile(OldName, NewName) – переименовывает файл OldName на NewName.

Реакция на выбор пункта меню «Открыть»:

procedure TMain. N3Click(Sender: TObject);

var i:integer;

begin

if Opendialog1.Execute //если диалог выполнился

and FileExists(OpenDialog1.FileName) then //выбранный файл существует

begin

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

AssignFile(f, OpenDialog1.FileName);

Reset(f); //открываем файл

i:=0; //номер строки

while not eof(f) do begin //пока не конец файла

read(f, Rec); //читаем очередную запись

inc(i);

stringgrid1.cells[0,i]:=Rec. Fam;

stringgrid1.cells[1,i]:=Rec. Name;

stringgrid1.cells[2,i]:=Rec. Pol;

stringgrid1.cells[3,i]:=IntToStr(Rec. Age);

stringgrid1.RowCount:=i+1; //Увеличиваем количество строк

end;

kol:=i; //сохраняем прочитанное количество строк

closefile(f);//закрываем файл

end else ShowMessage('Файл не существует!')

end;

Реакция на выбор пункта меню «Сохранить»:

procedure TMain. N5Click(Sender: TObject);

var i:integer;

begin

if SaveDialog1.Execute then //если диалог выполнился

begin

assignfile(f, savedialog1.FileName);//связь файла с переменной

if FileExists(SaveDialog1.FileName) then

begin

if MessageDlg('Файл с таким именем уже существует. Перезаписать?', mtConfirmation,[mbYes, mbNo],0)=mrNo then exit; //Выход

end;

rewrite(f, savedialog1.FileName); //создание файла

i:=0;

while i<>StringGrid1.rowCount-1 do begin //пока I <>кол-ву строк

inc(i);//увеличиваем счетчик прочитанных строк

Rec. Fam:=stringgrid1.cells[0,i];

Rec. Name:=stringgrid1.cells[1,i];

Rec. Pol:=stringgrid1.cells[2,i][1];

Rec. Age:=StrToInt(stringgrid1.cells[3,i]);

write(f, Rec); //сохраняем строку в файл

end;

closefile(f); //закрываем строку

end;

end;

Для реализации запроса последовательно просмотрим все строки записей в таблице, суммируя возраст и подсчитывая количество строк. После деления суммы на количество получим средний возраст. Результат можно выдать в сообщении при помощи функции ShowMessage.

procedure TMain. N8Click(Sender: TObject);

begin

S:=0;

i:=0;

if Kol<>0 then

while i<>StringGrid1.RowCount-1 do

begin //пока I <>количеству строк

inc(i);//увеличиваем счетчик прочитанных строк

S:=S+StrToInt(stringgrid1.cells[3,i]);//суммируем возраст

end;

Sr:=S/I;

ShowMessage('Средний возраст='+FloatToStrF(Sr, ffGeneral,10,3));

end;

Если запрос должен возвращать несколько строк результата, то их можно отобразить на отдельной форме в StringGrid или заносить в ListBox/Memo (методы Clear – очищает список, Lines. Add (строка) – добавляет новую строку)

Рис. 5.4. отображает пример работающего приложения.

Рис. 5.4. Окно работающего приложения

На рис. 5.5 представлен результат запроса.

Рис. 5.5. Выдача сообщения с результатом запроса