МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


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

Задание 3 – закрепить знания об использовании диалогов работы с файлами в системе Delphi и их настройке.





Предыдущий пример, позволяет работать с файлами по адресу, жёстко записанному в тексте программы. Гораздо чаще пользователю необходимо иметь возможность открывать любые файлы и работать с файлами по своему выбору. Естественно, Delphi предоставляет такую возможность. Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов, а именно диалоги выбора файла, позволяющие указать программе с каким файлом мы хотим работать. На вкладке палитры компонентов Dialogs находятся компоненты OpenDialog и SaveDialog. Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги выбора файла, невизуальные, т.е. при переносе их на Форму в работающей программе их не видно, они видны только на этапе конструирования. Компонент OpenDialog позволяет открыть в нашей программе стандартное Windows-окно диалога открытия файла, компонент SaveDialog – окно диалога сохранения. Диалоги выбора файла сами по себе ничего не делают, а только предоставляют настройки, сделанные пользователем при выборе файла. Самый важный метод диалогов – Execute. Он срабатывает в момент нажатия кнопки "открыть" или "сохранить" в окне выбора файла. Для примера введём в программу возможность выбора файла для загрузки в редактор Memo, и сохранения после редактирования. Создадим новый проект и перенесем на Форму оба диалога работы с файлами, текстовый редактор Memo, и три кнопки Button. В свойство Caption одной из них записываем "Открыть...", другой – "Сохранить", третьей – "Сохранить как...". В обработчике OnClick кнопки "Открыть..." пишем: if OpenDialog1.Execute then Memo1.Lines.LoadFromFile('OpenDialog1.FileName'); В результате выбора файла свойство FileName компонента OpenDialog получает значение полного адреса выбранного файла, который мы и вставляем в функцию загрузки файла компонента Memo. Данный обработчик работает только тогда, когда сохраняемое выражение записывается в одну строку. Если программа использует несколько раз выражение OpenDialog1.FileName, то в Delphi для такого случая есть так называемый "оператор присоединения" with. Он используется для любых объектов, имеющих длинный "хвост" из свойств, которые приходится записывать многократно. Вот как он записывается:

with Объект do

begin

end;

Свойства объекта внутри логических скобок begin/end можно записывать непосредственно. Естественно, в случае, когда внутри скобок находится один оператор, они необязательны. Перепишем фрагмент загрузки файла с использованием оператора присоединения:

with OpenDialog1 do

if Execute then

Memo1.Lines.LoadFromFile('FileName');

Запись получается более компактной. Так как свойства компонентов OpenDialog и SaveDialog одинаковы, сохранение текста выглядит абсолютно аналогично. Создаём обработчик нажатия кнопки "Сохранить как..." и пишем:

with SaveDialog1 do

if Execute then

begin

Memo1.Lines.SaveToFile('FileName');

OpenDialog1.FileName:=FileName; // Чтобы исправленный текст

не затёр источник

end;

А для кнопки "Сохранить" пишем:

Memo1.Lines.SaveToFile('OpenDialog1.FileName'); // Сохраняем туда, откуда считали При работе этих фрагментов пользователю приходится выбирать нужный файл из всех файлов в директории. Удобнее видеть только, например, текстовые файлы, или другой тип файлов по выбору пользователя. Для этого используются фильтры, свойство Filter в наших компонентах. Настраивается оно в Инспекторе Объектов. При выборе его можно перейти в редактор фильтров. В колонке FilterName записываем имена фильтров, в колонке Filter – список масок файлов, разделённых точкой с запятой. Маска файла в данном случае выглядит так *.расширение_файла . Звёздочка означает, что выбираются файлы с любыми именами, подходящие по расширению. Свойство диалогов Title позволяет записать в заголовок нужную фразу, которую увидит пользователь при работе с диалогом. Если оставить его пустым, то в заголовке будут стандартные "открыть" или "сохранить" Свойство InitialDir позволяет в момент открытия переместить пользователя в нужную директорию. Оно доступно как на этапе конструирования Формы, так и программно.



Лабораторные задания

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

Для этого на форме разместите два компонента класса TLabel, два компонента класса TEdit и кнопку TBitBtn. Они будут использоваться для ввода элементов массива с клавиатуры и вывода результатов на экран. Среда Delphi по умолчанию присвоила этим компонентам имена Label1, Label2, Edit1 и т. д. Так как в программе может использоваться большое количество одинаковых компонентов, а наличие у них однотипных имен затруднит понимание и написание программы, рекомендуется изменять названия на более информативные, например, edMassIn и edResult. Имена в Delphi должны состоять из латинских букв, цифр и знака подчеркивания, причем имя не должно начинаться цифрой и содержать пробелов. Измените свойства Формы следующим образом: в Инспекторе Объектов в Caption впишите Лабораторная работа №11, и установите следующие параметры BorderStyle - bsSingle, в BorderIcons: biSystemMenu = True, biMinimize = True, biMaximize = False, biHelp = False. В результате этого разрабатываемая форма будет иметь заголовок Лабораторная работа №11, ее размеры неизменяемы, ее можно закрыть нажав, на крестик в верхнем правом углу, и минимизировать. С помощью TLabel создадим заголовки для полей ввода. Разместив их соответствующим образом, перейдите в Инспектор Объектов, и в их свойствах Caption напишите, например, следующее: Исходный массив и Результат. Для изменения шрифта в Инспекторе Объектов два раза щелкните на свойстве Font, установите высоту шрифта 10 и стиль fsBold. Присвойте полям ввода имена edMassIn и edResult. и удалите текст, содержащийся в свойстве Text. Редактор edResult будет использоваться только для вывода результатов, поэтому можно запретить изменение в нем текста, для этого установите свойство ReadOnly в True. Кнопка TBitBtn используется для выхода из программы, присвойте ей имя BtBnClose. В Caption запишите текст, который будет отображаться на кнопке, например, Закрыть. Для того чтобы при нажатии кнопки завершалась работа программы необходимо сделать следующее: в Инспекторе Объектов перейдите на закладку Events и выберите пункт OnClick. В автоматически созданном обработчике впишите Close. Таким образом, при нажатии кнопки возникает событие OnClick, оно обрабатывается написанной процедурой, метод формы Close закрывает окно и завершает работу программы.

procedure TForm1.BtBnCloseClick (Sender: TObject);

begin

Close;

end;

Ввод массива будем осуществляться в поле ввода edMassIn, элементы массива отделять пробелами, а строки символом ; . Количество элементов в строках определяется количеством элементов в первой строке, а количество строк - количеством разделителей + 1. Опишите в программе двумерный массив, например, mas_a размером 5х5, при этом необходимо обеспечить программный запрет на ввод более 5 строк и 5 столбцов. После завершения ввода элементов необходимо нажать клавишу Tab или мышью выбрать поле ввода edResult. При этом возникает событие OnExit. Для создания обработчика этого события перейдите в Инспекторе Объектов на закладку Events и выберите OnExit. В окне кода программы появится заготовка процедуры в которую необходимо ввести

procedure TForm1.edMassInExit (Sender: TObject);

var

i, j, len, sum1: integer;

b_st_i, e_st_i: integer; // начало и конец подстроки

n: integer; // номер строки

x: integer; // количество элементов в строке

first: boolean; // используем для определения кол-ва элементов // первой подстроки

n_sim: integer;

begin

len:= Length(edMassIn.Text);

b_st_i:= 1;

n:= 1;

first:= True;

for i:=1 to len do

begin

if (edMassIn.Text[i] = ';') or (i = len) then

begin

e_st_i:= i; // конец подстроки

n_sim:= e_st_i - b_st_i; // количество символов в подстроке if first then

begin // первая подстрока

x:= Conv(copy(edMassIn.Text, b_st_i, n_sim), n);

first:= False;

b_st_i:= e_st_i ; // определим начало новой подстроки

Inc(n); // переходим на новую строку

end

else // работаем не с первой подстрокой

begin

if x <> Conv(copy(edMassIn.Text, b_st_i+1, n_sim), n) then

begin

ShowMessage('Введенные строки имеют разное количество элементов. Строка: ' + IntToStr(n));

edMassIn.SetFocus; // возвращаемся в редактор

Exit;

end;

b_st_i:= e_st_i ; // определим начало новой подстроки

Inc(n); // переходим на новую строку

end;

end;

end; // конец цикла ввода

edResult.Text:= '';

sum1:= 0;

for i:= 1 to n-1 do // цикл по строкам

begin

for j:= 1 to x do // цикл по элементам строки

sum1:= sum1 + Mas_a[i, j];

edResult.Text:= edResult.Text + ' sum(' +IntToStr(i) + ') = '

+ IntToStr(sum1);

sum1:= 0;

end;

end;

Процедуру TForm1.edMassInExit можно разделить на две части. В первой части выполняется ввод массива, а во второй – находятся суммы элементов для каждой строки. Рассмотрим первую часть процедуры. Определяем длину введенного текста и сохраняем ее в переменной len. В переменных b_st_i и e_st_i будем хранить соответственно начало и конец подстроки, в n - номер строки, x - количество элементов в строке. Переменная first используется как "флаг" для определения по первой строке количества элементов. Организуем цикл с первого по последний символ введенного текста, содержащегося в свойстве edMassIn.Text, и ищем символ-разделитель строк ; . Если символ найден в переменную e_st_i записываем конец подстроки, т. е. номер символа-разделителя, и определяем длину подстроки (n_sim). Если это первая строка, т. е. first = True, то вызываем функцию Conv (она подробно будет рассмотрена ниже). В нее передается текст подстроки и номер строки массива, а она возвращает количество элементов в строке. При обработке первой подстроки количество элементов в ней сохраняется в переменной x. Флагу first присваиваем значение False, конец первой подстроки делаем началом второй и переходим на новую строку массива. Если first = False, то вызываем функцию Conv и сравниваем ее значение с количеством элементов в первой строке массива. При равенстве определяем начало следующей подстроки и переходим на новую строку массива. При неравенстве выдаем сообщение о различном количестве элементов в строках, указываем номер строки, методом SetFocus возвращаемся в редактор и выходим из процедуры. Во второй части процедуры представлен пример обработки массива и вывода результатов в поле ввода TEdit. Обработка массива сводится к нахождению сумм элементов каждой строки. После нахождения сумма преобразуется в строку символов и записывается в свойство Text поля ввода edResult. Работа функции Conv состоит в преобразовании символов переданной ей подстроки в последовательность чисел и последующей их записи в указанную строку массива. Переменная i_int - счетчик элементов строки массива, element - последовательность символов элемента строки массива.

function Conv (st: string; n: integer):integer;

var // st - текст подстроки; n - номер строки массива

i_st, i_int: integer;

element: string;

begin

element:= '';

i_int:= 1;

for i_st:=1 to Length(st) do

begin

if (st[i_st] <= '9') and (st[i_st] >= '0') then

element:= element + st[i_st]

if ((st[i_st] = ' ') or (i_st=Length(st))) and (element <> '') then

begin

Mas_a[n, i_int]:= StrToInt(element);

element:= '';

Inc(i_int);

end;

end;

Result:= i_int-1; // количество элементов

end;

{Выполняем преобразование не пустой переменной element в число при наличии разделительного пробела или обработке последнего символа подстроки} Следует отметить, что String - это цепочка следующих друг за другом символов Char. Каждый символ пронумерован, причем первый символ имеет номер 1. Программист может обращаться к любому символу строки, указывая его порядковый номер в квадратных скобках сразу за именем переменной. Определяем длину подстроки и организуем цикл с первого до последнего символа. Если символ - цифра, то записываем его в element. Если символ - пробел и element непустой, то element преобразуем в число и записываем его в строку n и номером в строке i_int массива mas_a. Затем очищаем element и увеличиваем i_int на 1. Номер последнего преобразованного элемента строки массива записываем в результат функции. Поместите на форму два компонента TGroupBox, с именами GrBoxIn и GrBoxOut. На GrBoxIn установите три зависимых переключателя TRadioButton, а на GrBoxOut - два независимых переключателя TCheckBox. Переключателями TRadioButton можно будет выбрать источник данных (клавиатура, генератор случайных чисел или файл), а TCheckBox - вывод данных. Установите шрифт для GrBoxIn и GrBoxOut 10 размер, жирный; для TRadioButton и TCheckBox - 8 размер, обычный. Зависимые переключатели назовите RdBnKey, RdBnGen, RdBnFile и запишите в их свойства Caption соответственно Ввод с клавиатуры, Генератор случайных чисел и Получить данные из файла. Имена независимых переключателей укажите CkBoxEdit и CkBoxFile, а Caption соответственно Вывод данных на экран и Вывод данных в файл. Для RdBnKey и CkBoxEdit в Инспекторе Объектов свойство Checked установите в True. Т.о., при запуске программы эти переключатели окажутся выбранными по умолчанию. Поместите на форму кнопку TBitBtn, и назовите ее BtBnOpen, свойству Caption пропишите Открыть файл. Эту кнопку сделайте доступной при условии выбора зависимого переключателя в Получить данные из файла и недоступной при выборе другого варианта получения данных. Для этого в процедуре, обрабатывающей событие OnClick от RdBnFile, установите свойство Enabled кнопки BtBnOpen в True, а в Инспекторе Объектов и обработчиках события OnClick от RdBnKey и RdBnGen свойство Enabled=False. Для того, чтобы поле ввода элементов массива и вывода результатов очищались при выборе другого источника данных в соответствующих обработчиках OnClick вставте следующие строки edMassIn.Text:= '' и edResult.Text:= ''.

procedure TForm1.RdBnFileClick(Sender: TObject);

begin

edMassIn.Text:= ''; // очистим редактор ввода

edResult.Text:= ''; // очистим редактор вывода

lbMassIn.Caption:= 'Данные из файла';

BtBnOpen.Enabled:= True;

end;

Для того чтобы поле для вывода результата edResult и его заголовок (метка lbResult) были доступны или нет в зависимости от переключателя CkBoxEdit в обработчике события OnClick выполните проверку свойства Checked. Если оно равно True, то установите свойство Enabled редактора и метки в True, иначе в False.

procedure TForm1.CkBoxEditClick(Sender: TObject);

begin

if CkBoxEdit.Checked then

begin

lbResult.Enabled:= True;

edResult.Enabled:= True;

end

else

begin

lbResult.Enabled:= False;

edResult.Enabled:= False;

end;

end;

Поместите на форму компонент TOpenDialog из страницы Dialogs. Вызов этого компонента будет происходить при нажатии на кнопку BtBnOpen. Установите фильтр файлов в свойстве Filter компонента OpenDialog. Далее необходимо реализовать следующий алгоритм – выполнить и проверить выполнение (Execute возвратит True или False) выбора файла. Затем функцией FileExists проверить существование файла, это необходимо сделать, чтобы избежать критической ошибки программы в случае ввода имени несуществующего файла. После успешного определения, имя файла связать с файловой переменной стандартной процедурой AssignFile и открыть файл для чтения процедурой Reset. Исходные данные должны быть записаны в файл построчно, это позволит читать из файла сразу строку и после ее преобразования функцией Conv, описанной ранее, записать строкой в массив mas_a.

procedure TForm1.BtBnOpenClick(Sender: TObject);

var

F: TextFile;

i, st_i: integer;

s: string;

begin

i:= 1;

OpenDialog1.Filter:= 'Текстовые файлы|*.txt'; if not OpenDialog1.Execute then Exit;

if FileExists(OpenDialog1.FileName) then

begin

AssignFile(F, OpenDialog1.FileName);

Reset(F);

While not Eof(F) do

begin

Readln(F, s); // читаем строку

st_i:= Conv(s, i); // записываем строку в массив

Inc(i); // номер строки

end;

CloseFile(F);

end;

Look_Mas(st_i, i-1);

end;

Процедура Look_Mas используется для просмотра в поле ввода edMassIn исходного массива. Поле ввода доступно только для чтения. Массив отображается в таком же виде, как и при вводе с клавиатуры (строки отделены ";"). В Look_Mas передается количество строк (x) и элементов в строке (n).

procedure Look_Mas(x, n: integer);

var

i, j: integer;

begin

Form1.edMassIn.ReadOnly:= True; // установим только чтение

for i:= 1 to n do // цикл по строкам

begin

for j:= 1 to x do // цикл по элементам строки

if j <> x then // отделяем числа пробелами

Form1.edMassIn.Text:= Form1.edMassIn.Text +

IntToStr(Mas_a[i, j])+ ' '

else // после последнего элемента строки пробел не ставим

Form1.edMassIn.Text:= Form1.edMassIn.Text +

IntToStr(Mas_a[i, j]);

if i <> n then

Form1.edMassIn.Text:= Form1.edMassIn.Text + '; '

else

Form1.edMassIn.Text:= Form1.edMassIn.Text + ';';

end;

Form1.edMassIn.SetFocus; // устанавливаем фокус ввода end;

Задание 2 – На основании приведенной заготовки приложения, необходимо самостоятельно реализовать: а) написать процедуру проверки количества элементов в строках массива, полученного при чтении файла. б) написать процедуру генератора случайных чисел, создать компонент GroupBox с двумя полями ввода TEdit для ввода размера массива и кнопки BitBtn для записи чисел в массив. GroupBox сделать доступным при выборе соответствующего переключателя. в) написать процедуру на обработку массива и исходных данных и процедуры для вывода в файл результатов работы приложения. г) обработать ситуации открывания несуществующего файла и перезаписи существующего.

 

 

Контрольные вопросы для отчета работы

1. Опишите компоненты ListBox, ComboBox и Memo. Для чего они используются? Какие основные свойства и методы используются при работе с ними?

2. Каким образом можно организовать работу с файлами при помощи компонентов ListBox, ComboBox и Memo?

3. Каков основной порядок действия с файлами в системе Delphi?

4. Что такое файловая переменная, для чего она используется и как описывается в системе Delphi?

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

6. Какими операторами в системе Delphi можно открыть файл? В чем разница между этими операторами?

7. Какими операторами в системе Delphi происходит чтение из файла и запись в файл?

8. Какие компоненты в системе Delphi позволяют организовать диалоги чтения и запись в файл?

9. Каким образом происходит работа с диалогами чтения и запись в файл в системе Delphi?

10. Каким образом происходит проверки выбора файла при работе с диалогами чтения и запись в файл

 

ЛАБОРАТОРНАЯ РАБОТА №12





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.