выбору. Естественно, Delphi предоставляет такую возможность. Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов, а именно диалоги выбора файла, позволяющие указать программе с каким файлом мы хотим работать.
На вкладке палитры компонентов Dialogs находятся компоненты OpenDialog и SaveDialog (рис. 5). Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги выбора файла, невизуальные, т.е. при переносе их на Форму в работающей программе их не видно, они видны только на этапе конструирования. Компонент OpenDialog позволяет открыть в нашей программе стандартное Windows-окно диалога открытия файла, компонент SaveDialog – окно диалога сохранения.
Рис. 5 – Компоненты вкладки Dialogs
Диалоги выбора файла сами по себе ничего не делают, а только предоставляют настройки, сделанные пользователем при выборе файла. Самый важный метод диалогов – Execute. Он срабатывает в момент нажатия кнопки "открыть" или "сохранить" в окне выбора файла. Для примера введём в
программу возможность выбора файла для загрузки в редактор Memo, и сохранения после редактирования.
Создадим новый проект и перенесем на Форму оба диалога работы с файлами, текстовый редактор Memo, и три кнопки Button. В свойство Caption одной из них записываем "Открыть...", другой – "Сохранить", третьей – "Сохранить как...". В итоге должна получиться Форма представленная на рис. 6.
В обработчике OnClick кнопки "Открыть..." пишем:
if OpenDialog1.Execute then Memo1.Lines.LoadFromFile('OpenDialog1.FileName');
В результате выбора файла свойство FileName компонента OpenDialog получает значение полного адреса выбранного файла, который мы и вставляем в функцию загрузки файла компонента Memo.
9
Рис. 6 – Пример формы для демонстрации компонентов OpenDialog и
SaveDialog
Данный обработчик работает только тогда, когда сохраняемое выражение записывается в одну строку. Если программа использует несколько раз выражение OpenDialog1.FileName, то в Delphi для такого случая есть так называемый "оператор присоединения" with. Он используется для любых объектов, имеющих длинный "хвост" из свойств, которые приходится записывать многократно. Вот как он записывается:
with Объект do begin
end;
Свойства объекта внутри логических скобок begin/end можно записывать непосредственно. Естественно, в случае, когда внутри скобок находится один оператор, они необязательны. Перепишем фрагмент загрузки файла с использованием оператора присоединения:
with OpenDialog1 do if Execute then
Memo1.Lines.LoadFromFile('FileName');
Запись получается более компактной.
Так как свойства компонентов OpenDialog и SaveDialog одинаковы,
10
сохранение текста выглядит абсолютно аналогично. Создаём обработчик нажатия кнопки "Сохранить как..." и пишем:
with SaveDialog1 do if Execute then begin
Memo1.Lines.SaveToFile('FileName'); OpenDialog1.FileName:=FileName; // Чтобы исправленный текст не затёр источник
end;
А для кнопки "Сохранить" пишем:
Memo1.Lines.SaveToFile('OpenDialog1.FileName'); // Сохраняем туда,
откуда считали
При работе этих фрагментов пользователю приходится выбирать нужный файл из всех файлов в директории. Удобнее видеть только, например, текстовые файлы, или другой тип файлов по выбору пользователя. Для этого используются фильтры, свойство Filter в наших компонентах. Настраивается оно в Инспекторе Объектов. При выборе его можно перейти в редактор фильтров, представленный на рис. 7.
В колонке FilterName записываем имена фильтров, в колонке Filter – список масок файлов, разделённых точкой с запятой. Маска файла в данном случае выглядит так *.расширение_файла . Звёздочка означает, что выбираются файлы с любыми именами, подходящие по расширению.
Рис. 7 – Окно фильтров файлов по расширению
Свойство диалогов Title позволяет записать в заголовок нужную фразу, 11
которую увидит пользователь при работе с диалогом. Если оставить его пустым, то в заголовке будут стандартные "открыть" или "сохранить"
Свойство InitialDir позволяет в момент открытия переместить пользователя в нужную директорию. Оно доступно как на этапе конструирования Формы, так и программно.
2.2. Лабораторные задания
Задание 1 – Разработать приложение, которое по нажатию кнопки будет обрабатывать двухмерный массив и выводить результат. Предусмотреть возможность ввода данных самостоятельно пользователем, при помощи генератора случайных чисел или чтением из файла. Результат расчета должен по указанию пользователя выводится на экране или записываться в файл (отдельно или одновременно).
Один из вариантов интерфейса приложения представлен на рис. 8.
Рис. 8 – Вариант интерфейса приложения
Для этого на форме разместите два компонента класса TLabel, два компонента класса TEdit и кнопку TBitBtn. Они будут использоваться для
12
ввода элементов массива с клавиатуры и вывода результатов на экран. Среда 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, элементы массива отделять пробелами, а строки символом ; . Количество элементов в строках определяется количеством элементов в первой строке, а количество
13