- •Тема 1. Разработка линейных программ
- •Этапы разработки программы
- •Переменные и константы
- •Оператор присваивания
- •Структура программы на языке Object Pascal
- •Некоторые функции преобразования типов
- •Среда программирования Delphi Главные составные части среды программирования
- •Структура модуля
- •Компиляция и выполнение проекта
- •Состав проекта
- •Сохранение проекта
- •Тема 2. Стандартные и библиотечные функции в линейных программах в данной теме рассматриваются следующие вопросы:
- •Некоторые стандартные библиотечные функции
- •Некоторые функции и процедуры даты
- •Ввод из окна ввода
- •Вывод в окно сообщения
- •Тема 3. Программы с разветвлениями
- •Логические выражения
- •Условный оператор
- •Оператор выбора
- •Оператор перехода
- •Компонент ListBox
- •Компонент ComboBox
- •Некоторые приемы работы с отладчиком
- •Тема 4. Циклы
- •Операторы цикла
- •Оператор цикла с параметром
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Компонент Memo
- •Тема 5. Использование массивов в программах, компонента Memo для ввода данных в массив в данной теме рассматриваются следующие вопросы:
- •Массивы
- •Компонент Memo для ввода и вывода массивов
- •Тема 6. Разработка многооконных проектов. Двумерные массивы. Компонента StringGrid
- •Компонент StringGrid
- •Технология создания многооконных проектов
- •Ввод и вывод двумерных массивов c помощью компонента StringGrid
- •Тема 7. Внешние файлы
- •Процедуры работы с файлами
- •Главное меню
- •Тема 8. Разработка внутренних процедур и функций в данной теме рассматриваются следующие вопросы:
- •Процедуры
- •Функции
- •Литература
- •Оглавление
Главное меню
Находится на вкладке Standard.
T Чтобы создать процедуру, обрабатывающую действия, связанные с выбранным пунктом меню, произвести два щелчка по пункту на форме и в редакторе кода будет подготовлена заготовка процедуры, подобная этой: procedure TForm1.N1Click(Sender: TObject); begin
end; |
Использование стандартных диалогов
На странице Dialogs представлены компоненты для вызова стандартных диалогов Windows. Внешний вид диалогов зависит от используемой версии Windows. Объекты, представленные на данной странице невидимы во время выполнения и вызов диалогов происходит программно.
OpenDialogs находится на странице Dialogs (диалоги).
if not od1.Execute then Exit; NameFile := od1.FileName; В этом примере, стандартное имя компонента OpenDialogs1 в инспекторе объектов было заменено на od1, для краткости. Программисты очень часто заменяют стандартные имена компонентов на свои( свойство Name). |
if not SaveDialog1.Execute then Exit; NameFile:=SaveDialog1.FileName; |
Организация вывода на принтер
Для вывода на принтер нужно воспользоваться рядом процедур, определенных в модуле Printers. Т.е. в разделе Uses модуля программы нужно обязательно подключить модуль Printers:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Grids, DateUtils, Printers;
Далее в программном модуле нужно ассоциировать значение тестовой переменной с принтером с помощью процедуры AssignPrn и открыть файл для записи. Например,
Var
TextToPrint: System.Text;
……………………….
AssignPrn(TextToPrint); //ассоциировать с принтером
Rewrite(TextToPrint); //открыть файл
После этого вызов стандартных процедур Write и Writeln приведет к выводу теста на устройство печати. Например, вывод содержимого компонента Memo на принтер можно осуществить с помощью следующих инструкций:
For Line:=0 to Memo1.Lines.Count-1 do
Writeln(TextToPrint, Memo1.Lines[Line]);
После того как вывод информации завершен, необходимо вызвать стандартную процедуру Close:
System.Close(TextToPrint);
Практика
Задача
Дана информация об индивидуальных домах в некотором регионе в виде: номер кадастрового дела, Фамилия И.О. собственника, адрес дома, общая площадь (кв.м), дата последней уплаты налога на недвижимость. Составить программу, которая: 1) находит собственников, не уплативших налог за предыдущий год; 2) выводит информацию о домах площадью более 100 кв.м. Предусмотреть возможности ввода исходных данных с клавиатуры и файла на диске. Вывод предусмотреть в двух вариантах: файл либо принтер.
Для решения задачи предлагается создать три окна
|
|||||
|
|||||
Компоненты |
|||||
|
Имя компонента |
Свойства компонентов |
Значение |
Назначение |
|
|
Form1 |
Caption |
Учет индивидуальных домов |
Заголовок главной формы |
|
|
Label1 |
Caption
Visible |
Для перехода в новую ячейку таблицы использовать клавишу ENTER. При вводе данных в последнюю ячейку строки нажать ENTER и клавишу СТЕЛКА ВНИЗ для перехода в другую строку False |
Справочная информация для пользователя программы
Строка подсказки невидима |
|
|
Form1.StringGrid1 |
ColCount
FixedCol
FixedRow
Options: goFixedVertLine
goFixedHorzLine
goVertLine
goHorzLine
goEditing
goTabs
goAlwaysShowEditor
ScrollBars |
6
1
1
True
True
True
True
True
True
True
ssBoth |
Количество столбцов по умолчанию
Количество фиксированных слева столбцов
Количество фиксированных сверху строк
Опции: Разметка зафиксированных вертикальных линий Разметка зафиксированных горизонтальных линий Разметка вертикальных линий внутри таблицы Разметка горизонтальных линий внутри таблицы Признак допустимости редактирования содержимого ячеек таблицы.True ― редактирование разрешено. False ― запрещено Разрешает использование клавиши Tab для перемещения в другую ячейку
Признак нахождения компонента в режиме редактирования Выводятся обе полосы прокрутки |
|
|
Form1.MainMenu |
N1 N2 N3 N4 N5
N6 N7 N8 N10
N1001
N11 N1003
N9 N1002 |
Ввод данных Клавиатура Файл Расчет Вывод результатов Файл Принтер Вывод Найти собственников, не уплативших налог за предыдущие годы Вывести информацию о домах, площадь которых превышает 100 кв. м Список должников Площадь больше 100 кв.м Список должников Площадь больше 100 кв.м |
Названия пунктов меню |
|
|
OpenDialogs1 |
Name |
Od1 |
Имя компонента |
|
|
SaveDialog1 |
Name |
SaveDialog1 |
Имя компонента |
|
|
Form2 |
Caption |
Дома с площадью более 100 кв.м |
Заголовок формы |
|
|
Form2.StringGrid1 |
Свойства аналогичны свойствам Form1.StringGrid1 (см. выше) |
|
||
|
Label1 |
Caption |
|
Поле вывода результата |
|
|
Form2.Button1 |
Caption |
Закрыть |
Кнопка для закрытия окна “ Дома с площадью более 100 кв.м ” |
|
|
Form3 |
Caption |
Должники |
Заголовок формы |
|
|
Form3.StringGrid1 |
Свойства аналогичны свойствам Form1.StringGrid1 (см. выше) |
|
||
|
Label1 |
Caption |
Список собственников, не уплативших налог на недвижимость в предыдущие годы, включая прошлый |
Справочная информация для пользователя программы |
|
|
Label2 |
Caption |
|
Поле для вывода результата |
|
|
Form3.Button1 |
Caption |
Закрыть |
Кнопка для закрытия окна “Должники” |
|
|
Для наглядности приведем структуру, создаваемого главного меню: |
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
Переменные и массивы
Обозначение в программе |
Содержание |
Тип |
L |
количество домов с площадью более 100 кв.м |
целый |
M |
количество должников |
целый |
Delo_N |
массив номеров кадастровых дел
|
строковый длиной 4 |
Famil |
массив собственников индивидуальных домов |
строковый длиной 20 |
Adres |
массив адресов индивидуальных домов |
строковый длиной 30 |
S |
массив площадей индивидуальных домов |
вещественный |
D |
массив дат последней уплаты налога на недвижимость |
Объект типа дата |
n |
Счетчик объектов в файле или таблице |
целый |
F |
Файловая переменная |
текстовый |
NameFile |
Имя файла |
строковый длиной 20 |
DA |
День уплаты налога |
Целый беззнаковый |
M |
Месяц уплаты налога |
Целый беззнаковый |
Y |
Год уплаты налога |
Целый беззнаковый |
i |
Счетчик строк, управляющая переменная в цикле |
Целый |
TextToPrint |
Файловая переменная для вывода на принтер |
Системный текс |
Текст модуля
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, Grids, DateUtils, StdCtrls,Unit2,Unit3, Printers;
// подключаются модули, связанные с 2-ой и 3-ей формами,
// библиотека функций и процедур работы с принтером
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N10: TMenuItem;
N1001: TMenuItem;
StringGrid1: TStringGrid;
od1: TOpenDialog;
SaveDialog1: TSaveDialog;
N9: TMenuItem;
N1002: TMenuItem;
N11: TMenuItem;
N1003: TMenuItem;
Label1: TLabel;
procedure N8Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure N10Click(Sender: TObject);
procedure N1001Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N1003Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N1002Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
L:Integer;//количество домов с площадью более 100 кв.м
M:Integer;//количество должников
Delo_N:Array[1..1000] of String[4];//массив номеров кадастровых дел
Famil :Array[1..1000] of String[20]; ];{массив собственников
индивидуальных домов}
Adres :Array[1..1000] of String[30];{массив адресов индивидуальных домов}
S:Array[1..1000] of Real;//массив площадей индивидуальных домов
D:Array[1..1000] of TDate;{массив дат последней уплаты налога на недвижимость}
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//процедура закрывает главное окно — ВЫХОД
procedure TForm1.N8Click(Sender: TObject);
begin
Form1.Close;
end;
//активизация ввода с клавиатуры
procedure TForm1.N2Click(Sender: TObject);
begin
N2.Checked := True;//ставится галочка напротив пункта Клавиатура
Label1.Visible:=True;// поле с подсказкой становится видимым
StringGrid1.SetFocus;//фокус переносится в таблицу StringGrid
StringGrid1.Options := StringGrid1.Options + [goEditing];
//в StringGrid добавляется свойство,
// разрешающее редактирование ячеек
end;
//процедура ввода исходных данных из файла на диске
procedure TForm1.N3Click(Sender: TObject);
Var
n:integer;// счетчик объектов в файле
F:TextFile;// файловая переменная текстового типа
NameFile:String[20];//имя файла
DA,M,Y:Word;{день, месяц, год последней уплаты
налога на недвижимость, в файле эти числа вводятся через пробел }
begin
N3.Checked:=True;//ставится галочка напротив пункта Файл
if not od1.Execute then Exit;//если в открывшемся списке
//не выбрано имя файла, то прекращается выполнение процедуры
NameFile := od1.FileName;{переменной имя_файла присваивается
имя, выбранное из списка}
AssignFile(F,NameFile);//процедура связывает файловую переменную
// и конкретный файл
Reset(F);// процедура открывает файл для чтения
//счетчик объектов инициализируется единицей
n:=1;
{пока не достигнут конец файла, из файла читаются построчно:
номер кадастрового дела, фамилия собственника, адрес дома, площадь, дата в виде трех чисел на одной строке. Данные одновременно выводятся в таблицу в главном диалоговом окне}
While Not(EoF(F)) Do // пока не достигнут конец файла делать
Begin
Readln(F,Delo_N[n]); // читается из файла номер кадастрового дела
StringGrid1.Cells[1,n]:=Delo_N[n]; {номер кадастрового дела выводится в таблицу на 1 форме}
Readln(F,Famil[n]); // читается из файла фамилия собственника
StringGrid1.Cells[2,n]:=Famil[n];// фамилия выводится в форму на экран
Readln(F,Adres[n]); // читается адрес
StringGrid1.Cells[3,n]:=Adres[n];// адрес выводится в форму на экран
Readln(F,S[n]);// читается площадь
StringGrid1.Cells[4,n]:=FloatToStr(S[n]); {площадь выводится в таблицу на экране}
Readln(F,DA,M,Y);D[n]:=EncodeDate(Y,M,DA);{преобразование трех чисел в объект типа дата – массив дат}
StringGrid1.Cells[5,n]:=DateToStr(D[n]);// дата выводится в таблицу
n:=n+1;// счетчик объектов увеличивается на 1
{если количество строк в таблице на форме меньше n, то ему присваивается значение счетчика объектов }
if StringGrid1.RowCount < n then
StringGrid1.RowCount := n;
End;
{после того как достигнут конец файла, файл закрывается}
CloseFile(F);
end;
{процедура выполняется при появлении диалогового окна (формы) на экране, связана с событием — создание формы}
procedure TForm1.FormCreate(Sender: TObject);
Var
n:Integer; // счетчик объектов в таблице
begin
// заполнение шапки таблицы нулевой строки
StringGrid1.Cells[0,0]:='Номер п/п';
StringGrid1.Cells[1,0]:='Номер кадастрового дела';
StringGrid1.Cells[2,0]:='Фамилия И.О. собственника';
StringGrid1.Cells[3,0]:='Адрес';
StringGrid1.Cells[4,0]:='Общая площадь (кв.м)';
StringGrid1.Cells[5,0]:='Дата последней уплаты налога на недвижимость';
// цикл нумерации строк таблицы
For n:=1 to 1000 Do
StringGrid1.Cells[0,n]:=IntToStr(n);
end;
{Процедура, связанная с событием — нажатие клавиши в ячейке таблицы.
Проверяется правильность нажатия клавиш при вводе — ENTER(для перехода в ячейку справа и последовательно клавиш ENTER и СТРЕЛКА ВНИЗ (для перехода на следующую строку).Здесь же происходит считывание данных из ячеек таблицы в массивы. Такая технология ввода позволила организовать ввод для заранее неизвестного количества данных.}
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Begin
// если нажата клавиша СТРЕЛКА ВНИЗ
if Key = VK_DOWN then begin
//то если текущий номер строки таблицы меньше предыдущего
//значения количества строк в таблице, тогда ВЫХОД
if StringGrid1.Row < pred(StringGrid1.RowCount) then Exit;
//количество строк в таблице увеличивается на единицу
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Col := 1; // переход в начало строки
//если в первую ячейку текущей строки ничего не введено,
//то добавленная строка убирается
if (Length(StringGrid1.Cells[1,StringGrid1.Row]) = 0) then begin
StringGrid1.RowCount:=pred(StringGrid1.RowCount);Exit;
end;
end;
//если нажата клавиша ENTER, то
if (Key = VK_RETURN) then begin
case StringGrid1.Col of
//если номер столбца таблицы равен 1 и если ячейка не пуста
1 : if (Length(StringGrid1.Cells[1,StringGrid1.Row]) > 0)
//тогда содержимое ячейки с индексом равным номеру текущей строки
// помещается в массив Номер кадастрового дела
then
Delo_N[StringGrid1.Row] := StringGrid1.Cells[1,StringGrid1.Row]
//иначе количеству строк в таблице
//присваивается предыдущее значение и выход, т.е. программа будет
//ждать заполнения первой колонки в этой строке
else begin
StringGrid1.RowCount:=pred(StringGrid1.RowCount);Exit;
end;
//если текущий номер колонки таблице равен 2, то
//в массив собственников под номером равным номеру текущей строки //таблицы помещается содержимое ячейки, стоящей на пересечении
//второго столбца и текущей строки
2 : Famil[StringGrid1.Row] := StringGrid1.Cells[2,StringGrid1.Row];
// аналогично предыдущему вводится адрес
3 : Adres[StringGrid1.Row] := StringGrid1.Cells[3,StringGrid1.Row];
//если четвертая колонка не пуста, то строка символов преобразуется
//в вещественное число и помещается в массив площадей домов
4 : if Length(StringGrid1.Cells[4,StringGrid1.Row]) > 0 then
S[StringGrid1.Row]:=StrToFloat(StringGrid1.Cells[4,StringGrid1.Row])
//иначе в массив вводится число 0.00
else
S[StringGrid1.Row] := 0.00;
//если пятая колонка не пуста, то строка символов преобразуется в дату
//и помещается в массив дат
5 : if Length(StringGrid1.Cells[5,StringGrid1.Row]) > 0 then
D[StringGrid1.Row] := StrToDate(StringGrid1.Cells[5,StringGrid1.Row])
//иначе в массив дат помещается 0
else
D[StringGrid1.Row] := 0;
end;
//если текущий номер колонки меньше 5, то он увеличивается на 1
if StringGrid1.Col < 5 then
StringGrid1.Col := StringGrid1.Col +1
end;
end;
{процедура, связанная с пунктом меню — Найти собственников, не уплативших налог за предыдущие годы}
procedure TForm1.N10Click(Sender: TObject);
Var
i,n:integer;
begin
// ставится галочка напротив пункта меню
// — Найти собственников, не уплативших налог за предыдущие годы
N10.Checked:=True;
//подписывается шапка таблицы
Form3.StringGrid1.Cells[0,0]:='Номер по п/п';
Form3.StringGrid1.Cells[1,0]:='Фамилия И.О. собственника';
Form3.StringGrid1.Cells[2,0]:='Дата последней уплаты налога на недвижимость';
i:=0;// — номер строки в таблице
{ В цикле последняя дата уплаты налога собственником дома сравнивается
с текущей датой, установленной на компьютере. Если разница превышает 1 год — собственник является должником. Фамилии должников выводятся в таблицу в третьей форме. Если дата неизвестна, то выводится сообщение: “нет сведений”}
For n := 1 to pred(StringGrid1.RowCount) Do
// функция YearsBetween(D1,D2) находит разницу между двумя датами
IF YearsBetween(Date,d[n]) >= 1 then Begin
Inc(i); // i:=i+1;
Form3.StringGrid1.Cells[0,i]:=IntToStr(i);
Form3.StringGrid1.Cells[1,i]:=Famil[n];
if D[n]=0 then Form3.StringGrid1.Cells[2,i]:='нет сведений'
else
Form3.StringGrid1.Cells[2,i]:=DateToStr(D[n]);
Form3.StringGrid1.RowCount:=Form3.StringGrid1.RowCount+1
end;
// вывод количества должников
M:=i;
Form3.Label2.Caption:='Всего: '+ IntToStr(M)+' должников';
//показать форму 3
Form3.Show;
end;
{процедура, связанная с пунктом меню — Вывести информацию о домах, площадь которых превышает 100 кв.м}
procedure TForm1.N1001Click(Sender: TObject);
Var n,i:Integer;
Begin
//поставить галочку напротив выбранного пункта меню
N1001.Checked:=True;
Form2.StringGrid1.Cells[0,0]:='Номер по п/п';
Form2.StringGrid1.Cells[1,0]:='Номер кадастрового дела';
Form2.StringGrid1.Cells[2,0]:='Фамилия И.О. собственника';
Form2.StringGrid1.Cells[3,0]:='Адрес';
Form2.StringGrid1.Cells[4,0]:='Общая площадь (кв.м)';
Form2.StringGrid1.Cells[5,0]:='Дата последней уплаты налога на недвижимость';
i:=0;
{ В цикле производится сравнение площадей всех домов со 100 кв.м. Если площадь дома превышает 100, то вся информация о нем выводится в таблицу на форме 2}
For n:=1 to pred(Form1.StringGrid1.RowCount) Do
IF S[n]>100 Then Begin
Inc(i); // i:=i+1;
Form2.StringGrid1.Cells[0,i]:=IntToStr(i);
Form2.StringGrid1.Cells[1,i]:=Delo_N[n];
Form2.StringGrid1.Cells[2,i]:=Famil[n];
Form2.StringGrid1.Cells[3,i]:=Adres[n];
Form2.StringGrid1.Cells[4,i]:=FloatToStrF(S[n],ffFixed,10,2)+' кв.м';
if D[n]=0 then Form2.StringGrid1.Cells[5,i]:='нет сведений'
else
Form2.StringGrid1.Cells[5,i]:=DateToStr(D[n]);
Form2.StringGrid1.RowCount:=Form2.StringGrid1.RowCount+1
end;
L:=i;
Form2.Label1.Caption:='Всего домов площадью более 100 кв.м:'+IntToStr(L);
Form2.Show;
end;
{процедура, связанная с пунктом меню — Вывод в файл — список должников}
procedure TForm1.N11Click(Sender: TObject);
Var f:TextFile;
NameFile:String;
i:Integer;
begin
N11.Checked:=True;
{если из панели диалога не выбрано или не задано имя файла сохранения, то выход. Т.е. панель диалога будет находится на экране, пока пользователь не задаст имя файла.}
if not SaveDialog1.Execute then Exit;
//переменной ИмяФайла присваивается имя файла,
//заданное в панели диалога
NameFile:=SaveDialog1.FileName;
//устанавливается физическая связь между файловой переменной
// и конкретным файлом на внешнем носителе
AssignFile(f,NameFile);
//открыть файл для записи
Rewrite(f);
//в следующем фрагменте программы информация о должниках
// из формы 3 записывается в файл
Writeln (f,'список должников:');
Writeln (f,'Номер п/п ','Фамилия И.О. собственника',
' Дата последней уплаты налога на недвижимость');
For i:=1 To M do
Writeln (f,Form3.StringGrid1.Cells[0,i]:4,Form3.StringGrid1.Cells[1,i]:30,' ',
Form3.StringGrid1.Cells[2,i]:30);
//закрытие файла
CloseFile(f);
end;
{процедура, связанная с пунктом меню — Вывод в файл — список домов с площадью более 100 кв.м}
procedure TForm1.N1003Click(Sender: TObject);
Var f:TextFile;
NameFile:String;
i:Integer;
begin
N1003.Checked:=True;
// если не задано имя файла в панели диалога,
//панель диалога остается на экране
if not SaveDialog1.Execute then Exit;
//переменной ИмяФайла присваивается имя файла,
//заданное в панели диалога
NameFile:=SaveDialog1.FileName;
//устанавливается физическая связь между файловой переменной
// и конкретным файлом на внешнем носителе
AssignFile(f,NameFile);
//открыть файл для записи
Rewrite(f);
//в следующем фрагменте программы информация о домах с площадью
// более 100 кв.м из формы 2 записывается в файл
Writeln (f,'Дома с площадью более 100 кв. м:');
Writeln (f,'Номер п/п ','Номер кадастрового дела ',
'Фамилия И.О. собственника ', ' Адрес ',
'Общая площадь (кв.м) ', 'Дата последней уплаты налога на недвижимость');
For i:=1 To L do
Writeln (f,Form2.StringGrid1.Cells[0,i]:4,Form2.StringGrid1.Cells[1,i]:20,' ',
Form2.StringGrid1.Cells[2,i]:30,' ',Form2.StringGrid1.Cells[3,i]:30,
Form2.StringGrid1.Cells[4,i]:16,' ',Form2.StringGrid1.Cells[5,i]:20 );
CloseFile(f);
end;
{процедура, связанная с пунктом меню — Вывод на принтер — список должников}
procedure TForm1.N9Click(Sender: TObject);
Var TextToPrint:System.Text;
i:integer;
begin
N9.Checked:=True;
//устанавливается физическая связь с печатающим устройством
AssignPrn(TextToPrint);
// открытие для вывода
Rewrite(TextToPrint);
// в следующем фрагменте осуществляется вывод списка должников
// из формы 3 на принтер
Writeln (TextToPrint,'список должников:');
Writeln (TextToPrint,'Номер п/п ','Фамилия И.О.',
' Дата последней уплаты ');
Writeln (TextToPrint,' ','собсвенника',
' налога на недвижимость ');
For i:=1 To M do
Writeln (TextToPrint,Form3.StringGrid1.Cells[0,i]:4,
Form3.StringGrid1.Cells[1,i]:30,' ',Form3.StringGrid1.Cells[2,i]:30);
System.Close(TextToPrint);
end;
{процедура, связанная с пунктом меню — Вывод на принтер— список домов с площадью более 100 кв.м}
procedure TForm1.N1002Click(Sender: TObject);
Var TextToPrint:System.Text;
i:integer;
begin
N1002.Checked:=True;
// ассоциация с принтером
AssignPrn(TextToPrint);
//открытие для вывода
Rewrite(TextToPrint);
// в следующем фрагменте осуществляется вывод списка
// домов с площадью более 100 кв.м из формы 2 на принтер
Writeln (TextToPrint,'Дома с площадью более 100 кв. м:');
Writeln (TextToPrint,'N п/п','Номер кад. дела ',
'Фамилия И.О.собств.',' Адрес ',
'Общ. площ.(кв.м)','Дата посл. Уплаты налога на недвижимость');
For i:=1 To L do
begin
Writeln (TextToPrint,Form2.StringGrid1.Cells[0,i]:4,
Form2.StringGrid1.Cells[1,i]:20,' ',Form2.StringGrid1.Cells[2,i]:20,' ',
Form2.StringGrid1.Cells[3,i]:40,Form2.StringGrid1.Cells[4,i]:16,' ',
Form2.StringGrid1.Cells[5,i]:20 );
end;
System.Close(TextToPrint);
end;
end.
{модуль Unit2 связан с формой Form2, куда выводится список домов с площадью превышающей 100 кв.м}
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm2 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Close
end;
end.
{модуль Unit3 связан с формой Form3, куда выводится список должников по уплате налога на недвижимость}
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm3 = class(TForm)
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
Form3.Close
end;
end.
Вид некоторых диалоговых окон во время работы программы
|
|
|
|
|
|
Файл с исходной информацией удобнее подготовить с помощью стандартной программы блокнот. Каждое поле записи набирается на отдельной строке. Десятичный разделитель — точка. Дата уплаты налога в файле набирается в виде трех чисел на одной строке через пробел. Для приведенного выше примера файл с исходными данными выглядит так:
|
Задачи для самостоятельного решения
№ 7.1 Подсчитать значение Q, вычисляемой по формуле:
N
Yi
i=1
Q = ,
N!
где Yi — элементы массива Y с размерностью N. Массив Y ввести из файла на диске. Вывод обеспечить в трех вариантах:1)на экран; 2)на печатающее устройство; 3)в файл на диске.
№ 7.2 Дан массив X, содержащий вещественные числа. Найти и записать на место X(1) — наибольший элемент массива X, а на место X(N) — наименьший элемент массива (X1,X2,...,XN). Ввод исходного массива X осуществить из файла на диске. Вывод обеспечить в трех вариантах:1)на экран; 2)на печатающее устройство; 3)в файл на диске.
№ 7.3 Дан массив Q(N),состоящий из отрицательных и положительных чисел. Составить из Q два массива: A, содержащий только положительные числа; B, содержащий только отрицательные. Массив Q вводится из файла на диске. Вывести исходный массив и массивы, полученные в процессе преобразования. Вывод обеспечить в трех вариантах:1)на экран; 2)на печатающее устройство; 3)в файл на диске.
№ 7.4 Даны натуральное число N, действительные числа
X1,X2,..., Xn. Получить (1+r)/(1+s),где r — сумма всех тех членов последовательности X1,X2,...,Xn, которые не превосходят 1,a s — сумма членов, больших. Вывести сначала массив X. Затем r,s. Ввод исходных данных осуществить из файла на диске. Вывод — по желанию пользователя программы либо на экран, либо на печать или в файл на диске.
№ 7.5 Дана последовательность из N различных чисел. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами ( в сумму включить и оба этих числа). Последовательность ввести из файла на диске. Вывести исходную последовательность в виде таблицы с указанием порядкового номера числа в последовательности и самого числа и саму сумму чисел. Вывод предусмотреть в трех вариантах:1) в файл на диске; 2)на экран; 3) на печатающее устройство.
№ 7.6 Даны: n — целое число (n>=2),последовательности действительных чисел : a1,a2,...,an. Получить:
min(a1+a2,a2+a3,...,an-1+an);
max(a1,a1a2,a1a2a3,...,a1...an-1an).
Ввод исходных данных осуществить из файла на диске. Вывод — по желанию пользователя программы либо на экран, либо на печать или в файл на диске.
№ 7.7 Дан файл f1, который содержит номера телефонов сотрудников учреждения: указывается фамилия сотрудника, его инициалы и номер телефона. Найти телефон сотрудника по его фамилии и инициалам. Вывод по желанию пользователя либо на экран, либо в файл на диске, либо на печать.
№ 7.8 Дан файл f, содержащий сведения о кубиках, размер каждого кубика (длина ребра в см), его цвет (красный, желтый, зеленый или синий) и материал (деревянный, металлический, картонный). Найти: а) количество кубиков каждого из перечисленных цветов и их суммарный объем;
б) количество деревянных кубиков с ребром 3 см и количество металлических кубиков с ребром, большим 5 см. Вывод по желанию пользователя либо на экран, либо в файл на диске, либо на печать.
№ 7.9 Сведения об автомобиле состоят из его марки, номера и фамилии владельца. Дан файл f, содержащий сведения о нескольких автомобилях. Найти:
а) фамилии владельцев и номера автомобилей данной марки;
б) количество автомобилей каждой марки. Вывод по желанию пользователя либо на экран, либо в файл на диске, либо на печать.
№ 7.10 Дан файл f, содержащий сведения о книгах. Сведения о каждой из книг — это фамилия автора, название и год издания.
а) Найти названия книг данного автора, изданных до 2002 года.
б) Определить, имеется ли книга с названием “Информатика”. Если да, то сообщить фамилию автора и год издания, Если таких книг несколько, то сообщить имеющиеся сведения обо всех этих книгах. Вывод по желанию пользователя либо на экран, либо в файл на диске, либо на печать.
