Lazarus диалог выбора файла
Аннотация: Лекция посвящена изучению работы с диалогами. Приводятся многочисленные примеры, а также рассматриваются принципы работы с графическими файлами.
Цель лекции
Изучение стандартных диалогов и компонента-контейнера изображений TImage .
Диалоги
В любой большой программе есть диалоги.
Диалоги - это стандартные системные окна, предназначенные для получения информации от пользователя. В Lazarus диалоги - невизуальные (невидимые пользователю) компоненты, работа которых приводит к выводу на экран стандартных диалоговых окон операционной системы.
Информация , которую требуется получить от пользователя, может быть самой разной: какой файл открыть, какой файл создать, куда сохранить, какой выбрать шрифт , цвет, картинку… Можно, конечно, создавать все эти диалоги вручную, но гораздо удобней пользоваться стандартными диалогами - это проще, и эти диалоги используют язык установленной операционной системы. Тем более что от каждого диалога нам с вами потребуется всего пару-тройку свойств, и один метод - легче некуда! Все диалоги находятся на вкладке Dialogs Палитры компонентов.
TOpenDialog и TSaveDialog
Диалоги TOpenDialog и TSaveDialog предназначены, как нетрудно догадаться из их названия, для открытия и сохранения файлов:
Изучать работу диалогов мы с вами будем сразу на конкретных примерах. Чтобы не делать лишней работы, воспользуемся проектом MyNotebook из прошлой лекции, который вы должны были сохранить в папку 14-01. Если вы помните, в том проекте для хранения текста мы использовали файл MyText.txt, что не очень удобно - а вдруг пользователю захочется работать со многими файлами, а не только с одним? Вот как раз для этого нам и понадобятся два этих диалога.
Итак, откройте Lazarus. Если у вас открылся новый проект (или предыдущий), закройте его командой Файл -> Закрыть. Далее, командой Файл -> Открыть найдем и откроем проект MyNotebook (для этого нужно указать файл MyNotebook.lpi или MyNotebook.lpr). Обратите внимание: только что мы воспользовались стандартным диалогом открытия файла!
Когда проект с редактором текста откроется, установите в любое место формы по одному компоненту TOpenDialog и TSaveDialog . Эти компоненты будут невидимы для пользователя, поэтому их можно установить в любое место формы, например, прямо поверх Memo1 . Выделите компонент TOpenDialog , разберемся с его свойствами. Как видите, их не очень много, да и нужны нам будут не все.
Со свойствами разобрались, остался метод. Метод этот - Execute .
Execute вызывает стандартное диалоговое окно , и дает пользователю сделать выбор. Если пользователь сделал свой выбор, то Execute вернет True . Если пользователь отказался делать выбор и закрыл окно, не указав файла, метод вернет False .
Настроим наш TOpenDialog :
Теперь займемся фильтром. Выделите свойство Filter и щелкните по кнопке "…" справа от него. Откроется редактор фильтров, который мы заполним следующим образом:
Когда вы нажмете "ОК", Lazarus в свойстве Filter сгенерирует следующий фильтр:
Эту строку можно было бы написать и вручную, но воспользоваться Редактором фильтров все же удобней.
Теперь, когда мы настроили наш диалог открытия файлов OD, займемся кодом. Если вы помните, то загрузка текста из файла у нас происходила при нажатии кнопки "Читать", то есть, bRead . Щелкните дважды по этой кнопке, и вы попадете на код её события OnClick . Приведу текст этого события:
Помните, мы вначале проверяли, существует ли этот файл , и затем, в зависимости от результата, предпринимали либо одно, либо другое действие. Так вот, с диалогами этого делать не нужно! Если пользователь выбрал файл , то нет смысла проверять - существует ли он. Конечно, существует, иначе пользователь не смог бы его выбрать. Чувствуете разницу? Новый код события будет таков:
А теперь разница видна? Мы проверяем - если диалог сработал, то мы вызываем метод LoadFromFile , передавая ему в качестве параметра выбранный пользователем файл . Не забывайте, что в свойстве FileName диалога содержится имя выбранного файла вместе с его адресом и расширением. Если же диалог не сработал, то и делать ничего не нужно.
Теперь займемся диалогом сохранения файла TSaveDialog . А тут нам все уже известно - все свойства и метод Execute у него в точности такие, как и у TOpenDialog , разве что текст в свойстве Title другой. Именно поэтому я и дал эти диалоги парой.
Измените имя компонента на SD . Свойства DefaultExt и Filter настройте так же, как в OD. Все остальное остается без изменений. Теперь нам нужно вписать код сохранения файла. Делается это в событии OnClick кнопки "Сохранить". Новый код события такой:
Код простой, и должен уже быть вам понятен без всяких комментариев. Сохраните проект и запустите его на выполнение. Посмотрите, как работает сохранение и загрузка файлов. Здесь есть один недостаток, если вы заметили: при сохранении уже открытого файла программа все равно запрашивает, куда сохранять текст. Этот недостаток мы исправим в ближайшей лабораторной работе.
TColorDialog
TColorDialog - диалог выбора цвета. Он очень прост. Все, что нам от него нужно, это свойство Color и метод Execute . Если диалог состоялся, то сложное свойство Color будет содержать выбранный пользователем цвет. Этот цвет можно присвоить свойству Color какого-то другого компонента. Например, свойство Color компонента TMemo отображает цвет фона данного компонента. Я, правда, говорил, что не стоит использовать в проекте попугайские расцветки, но наша программа учебная, к тому же мы будем устанавливать только те расцветки, которые выберет пользователь . А потому, установите на форму еще одну кнопку TButton , свойство Name которой переименуйте в bColor , а в свойстве Caption напишите Цвет . Не забудьте снять в свойстве Anchors закрепление к верхнему краю, и установить закрепление к нижнему, как мы делали это с остальными кнопками.
Далее, нам потребуется установить на форму компонент TColorDialog :
Этот компонент , как и все остальные компоненты, невизуальный, поэтому устанавливайте его, куда хотите. Свойство Name диалога переименуйте в CD . Обработчик OnClick для кнопки bColor очень простой:
Если диалог состоялся, фону редактора присваиваем тот цвет, который выбрал пользователь . Сохраните проект, запустите его и попробуйте менять цвета.
TFontDialog
TFontDialog - диалог выбора шрифта. В этом диалоге пользователь может выбрать как сам шрифт , так и его размеры, начертание, эффекты и цвет. Не путайте цвет фона и цвет шрифта! Белый или желтый текст, например, прекрасно читается на синем или черном фоне. Нам потребуется установить на форму один такой компонент :
Свойство Name компонента переименуйте в FD . В коде нам потребуется его сложное свойство Font , которое будет содержать тот шрифт , что выбрал пользователь , и которое мы сможем присвоить свойству Font другого компонента.
Также нам потребуется кнопка с именем bFont и текстом Шрифт в свойстве Caption . Не забывайте про привязки кнопок к нижней границе формы. Обработчик OnClick для кнопки такой:
Диалоговые окна выбора имени файла используются в процессах открытия и сохранения файла. Часто эти диалоги называют также диалогами открытия/сохранения файла, хотя на самом деле они позволяют только выбрать имя файла, а все действия по открытию или сохранению файла программируются вручную.
Компонент OpenDialog реализует диалог открытия файла. При запуске этого диалога появляется окно (см. скриншот), в котором можно выбрать имя открываемого файла. В случае успешного закрытия диалогового окна (нажатием кнопки Open) в качестве результата возвращается выбранное имя файла.
Компонент SaveDialog предлагает стандартный диалог сохранения файла, который отличается от диалога открытия файла только своим заголовком.
Основные свойства компонентов OpenDialog и SaveDialog
Далее перечислены основные свойства компонентов OpenDialog и SaveDialog.
FileName типа String — указывает имя и полный путь файла, выбранного в диалоге. Имя файла отображается в строке редактирования списка Имя файла и является результатом диалога.
Title типа String— задает заголовок окна. Если свойство Title не установлено, то по умолчанию используется заголовок Open для OpenDialog и заголовок Save — для SaveDialog.
InitiaLDir типа String— определяет каталог, содержимое которого отображается при вызове диалогового окна. Если каталог не задан, то отображается содержимое текущего каталога.
DefaultExt типа String — задает расширение, автоматически используемое в имени файла, если пользователь не указал расширение.
Filter типа String— задает маски имен файлов, отображаемых в раскрывающемся списке Тип файлов. В диалоговом окне видны имена файлов, совпадающие с указанной маской (см. скриншот) это файл с расширением jpeg). По умолчанию значением Filter является пустая строка, что соответствует отображению имен файлов всех типов.
FilterIndex типа Integer — указывает, какая из масок фильтра отображается в списке. По умолчанию свойство FilterIndex имеет значение 1 (используется первая маска).
Options
Options типа TOpenOptions — применяется для настройки параметров, управляющих внешним видом и функциональными возможностями диалога. Каждый параметр (флажок) может быть установлен или снят. Свойство Options имеет около двух десятков параметров, наиболее важные перечислены ниже:
Основные параметры свойства Options
- ofAllowMultiSelect (из списка можно выбрать одновременно более одного файла);
- ofCreatePrompt (при вводе несуществующего имени файла выдается запрос на создание файла);
- ofNoLongNames (имена файлов отображаются как короткие, не более 8 символов для имени и 3 символов для расширения);
- ofOldStyleDialog (создает диалоговое окно в стиле Windows 3.11).
Фильтр представляет собой последовательность значений, разделенных знаком |. Каждое значение состоит из описания и маски, также разделенных знаком |. Описание представляет собой обычный текст, поясняющий пользователю данную маску. Маска является шаблоном отображаемых файлов и состоит из имени и расширения. Если для одного описания приводится несколько масок, то они разделяются знаком ;.
Здесь фильтр формируется с двумя масками — маской для текстовых файлов и маской для всех файлов (под текстовыми понимаются файлы типов doc и txt).
Так как в раскрывающемся списке диалогового окна отображается только описание фильтра, то для удобства целесообразно включить в описание и маску, например, так:
Фильтр обычно формируется при проектировании приложения. Для этого из окна Инспектора объектов щелчком в области значения свойства Filter вызывается Редактор фильтра (Filter Editor).
Рабочее поле окна Редактора фильтра представляет собой таблицу, состоящую из двух столбцов с заголовками Filter Name и Filter. Значения фильтра вводятся построчно, при этом в левом столбце указывается описание фильтра, а в правом — соответствующая маска (скриншот уже был выше).
Стандартные диалоговые окна выбора имени файла для открытия или сохранения файла вызываются на экран методом Execute. Эта функция в качестве результата возвращает логическое значение, позволяющее определить, как закрыт диалог. Если пользователь в процессе диалога нажал кнопку Open или Save, то диалог считается принятым, и функция Execute возвращает значение True. Если диалог был закрыт любым другим способом, то он считается не принятым, и функция возвращает значение False.
При нажатии кнопки Button2 появляется диалоговое окно OpenDialog1 выбора имени файла для открытия. При выборе имени текстового файла его содержимое загружается в компонент Memo1. Напомним, что многострочный редактор Memo позволяет работать с текстами в коде ANSI. При отмене диалога OpenDialog1 открытие файла не происходит.
Компоненты OpenPictureDialog и SavePictureDialog вызывают стандартные диалоги открытия и сохранения графических файлов. Эти стандартные диалоги отличаются от OpenDialog и SaveDialog видом окон (см. скриншот) и установленными значениями свойства Filter.
Так, по умолчанию свойство Filter установлено для отображения графических файлов следующих форматов:
- JPEG (*.jpg);
- JPEG (*.jpg);
- растровое изображение (*.bmp);
- значок (*.ico);
При использовании диалогов OpenPictureDialog и SavePictureDialog, а также OpenDialog и SaveDialog значение свойства Filter можно установить ранее рассмотренными способами, а также с помощью функции GraphicFilter (GraphicClass: TGraphicCiass) : String.
Параметр GraphicClass принадлежит к одному из графических классов: TBitmap, TGraphic (и его потомки), TIcon, TMetafile или TJPEGimage. Для работы с классом TJPEGimage нужно подключить модуль jpeg. В качестве результата функция GraphicFilter () возвращает строку с фильтрами для указанного графического класса:
TBitmap — Bitmaps (*.bmp) |*.bmp;
TIcon—Icons (* . ico) I * . ico;
TMetafile — All (*.emf;*.wmf) |*.emf;*.wmf|Enhanced Metafiles(*.emf)| *.emf|Metafiles(*.wmf) |*.wmf;
TJPEGimage — All (*.jpg;*.jpg) | *.jpg;*.jpg| JPEG Image File (*.jpg) |*.jpg| JPEG Image File (*.jpg)| *.jpg;
TGraphic — All (*.jpg;*.jpg;*.bmp;*.ico;*.emf;*.wmf) | *.jpg;*.jpg; *.bmp;*.ico;*.emf; *.wmf|JPEG Image File (*.jpg) | *.jpg| JPEG Image File (*.jpg) |*.jpgI Bitmaps (*.bmp) | *.bmp| Icons(*.ico) |*.ico | Enhanced Metafiles(*.emf)|*.emf|Metafiles(*.wmf)I*.wmf.
Если модуль jpeg в разделе uses не указан, то фильтры, соответствующие формату JPEG, будут отсутствовать.
Например, фильтр, заданный как OpenDialog1.Filter := GraphicFilter(TGraphic); позволяет отображать имена графических файлов допустимых форматов.
Стандартные диалоги – это диалоговые окна, общие для большинства приложений Windows. Например, когда пользователь сохраняет файл в редакторе Word, он использует диалоговое окно Save As … (Сохранить как …). Когда он сохраняет рабочую книгу в Microsoft Excel, он также использует диалоговое окно Save As …
Операционная система Windows стандартизирует и значительно облегчает создание таких диалоговых окон. Программисту нет необходимости «изобретать колесо» каждый раз, когда понадобится диалоговое окно, в котором пользователь будет сохранять или открывать файл.
Вместо этого программист попросту устанавливает стандартный компонент на форму и задает ему необходимые свойства.
В составе Lazarus поставляется 14 диалоговых компонентов. Все они находятся на вкладке Dialogs. Как и MainMenu, в среде Lazarus диалоговые компоненты являются невизуальными, они присутствуют на форме в виде значков, однако во время выполнения они невидимы.
В этом уроке мы рассмотрим диалоговые компоненты: TOpenDialog, TSaveDialog, TFontDialog.
Для активизации диалогового окна используется метод Execute(). Он выполняет открытие соответствующего окна и возвращает значение True, если пользователь щелкнул по кнопке ОК.
Компоненты TOpenDialog и TSaveDialog
Компонент TOpenDialog предназначен для выбора файла с целью последующего открытия, а компонент TSaveDialog — для последующего сохранения файла.
свойства приведены в таблице.
Эти компоненты не предназначены для выполнения конкретных действий: загрузки файла, записи в файл. Они применяются только для получения от пользователя желаемых настроек, например ввода полного имени файла вместе с путем поиска.
Рассмотрим использование диалоговых окон на примере создания простейшего Текстового редактора.
Задание. Создайте приложение Текстовый редактор. В приложении должно быть меню, содержащее пункты: Файл -Открыть, Файл-Сохранить, Шрифт. Приложение открывает текстовый файл на диске с использованием компонента TOpenDialog, записывает текст из файла в объект Memo на форме. После редактирования и форматирования текст необходимо сохранить. Для выбора файла для сохранения использовать компонент TSaveDialog, при форматировании шрифта — компонент TFontDialog.
При работе с текстовыми файлами следует иметь в виду, что при выводе в TMemo файла с русским текстом, в Windows буквы могут отображаться некорректно. Это вызвано тем, что текстовые файлы в ОС Windows имеют кодировку CP-1251. Перед выводом текст необходимо преобразовать в кодировку UTF8.
Ход выполнения проекта
1. Создайте форму и разместите на ней компоненты MainMenu, Memo1. Компонент MainMenu – невизуальный компонент, его значок можно поместить в произвольном месте.
2. Чтобы начать формирование пунктов меню, дважды щелкните по компоненту TMainMenu1. Откроется специальное окно Редактор меню.
Определите пункты меню.
Меню первого уровне содержит два пункта: New Item1 и New Item2 . Первый пункт создается автоматически. Чтобы на этом уровне добавить второй пункт, откройте контекстное меню существующего пункта и выполните команду Вставить новый пункт (после). Появиться новый пункт New Item2.
Меню New Item1 содержит пункты : New Item3 и New Item4. Откройте контекстное меню пункта New Item1 и выполните команду Создать подменю. В подменю появиться пункт New Item3. Для него откройте контекстном меню и выполните команду Создать новый пункт (после). Появиться пункт New Item4.
3. Значения свойств установите в соответствии с таблицей.
Компонент | Свойство | Значение |
MenuItem1 | Caption | Файл |
MenuItem2 | Caption | Шрифт |
MenuItem3 | Caption | Открыть |
MenuItem4 | Caption | Сохранить |
Form1 | Caption | Текстовый редактор |
Memo1 | ScrollBars | ssVertical |
4. Удалите текст «Memo1» из окна Memo1.
- выберите в окне Инспектор объектов объект Memo1;
- на странице Свойства в строке Lines дважды щелкните на значении String или на кнопке с многоточием для формирования и редактирования текста;
- в окне Диалог ввода строк удалите текст «Memo1» и щелкните мышью на кнопке ОК.
5. Выберите в палитре компонентов вкладку Dialogs и поместите на форму компоненты OpenDialog, SaveDialog, FontDialog.
Эти компоненты невизуальные, разместить их в нижней части формы рядом со значком TMainMenu.
6. Настройте свойства компонентов OpenDialog, SaveDialog
Компонент | Свойство | Значение |
OpenDialog1 | Title | Открыть |
SaveDialog1 | Title | Сохранить |
7. Чтобы реализовать выбор типа файла при открытии файла в окне диалога:
- выберите в окне Инспектор объектов объект OpenDialog1;
- на странице свойства дважды щелкните мышью по списку значений свойства Filter.
- в окне Редактор фильтра (Filter Edit) задайте фильтры для выбора типа и расширения файла.
8. Чтобы установить в качестве расширения файла первый вариант (.txt), задайте для свойства OpenDialog1.FilterIndex значение 1.
9. Для диалога SaveDialog задайте свойство DefaultExt = txt (чтобы расширение txt автоматически добавлялось к создаваемому файлу).
10. В разделе implementation после директивы < TForm1 >запишите программный код процедуры Ansi_Memo, реализующей загрузку текста из файла с системной кодировкой (кодировка Ansi) в memo-поле (кодировка UTF8), а также процедуры Memo_Ansi, сохраняющей текст из memo-поля в файле на диске.
11. Напишите программный код для процедуры обработчика щелчка на пункте меню Файл – Открыть. Для этого дважды щелкните на данном пункте меню.
После выбора пользователем файла в свойстве OpenDialog1.FileName будет находиться имя файла вместе с путем к нему.
Обратите внимание на оператор:
Если имя файла, а также путь содержит кириллицу, то необходимо строку с именем файла преобразовать в системную кодировку.
12. Напишите программный код процедуры обработчика щелчка на пункте меню Файл-Сохранить:
Приложение открывает диалоговое окно «Сохранить», в котором задается имя файла. Имя файла из свойства SaveDialog1.FileName запоминается в переменной FName. В заключительной части процедуры оператор Memo1.Lines.SaveToFile(FName); используется для записи в файл содержимого свойства Lines объекта Memo1
13. Напишите программный код процедуры обработчика щелчка на пункте меню Шрифт:
14. Сохраните, откомпилируйте и запустите на выполнение созданное приложение.
15. Щелкните мышью на кнопке Открыть, в диалоговом окне Открыть текстовый файл выберите папку, задайте тип файла и выберите текстовый файл, после чего нажмите кнопку Открыть.
16. Отредактируйте текст в окне приложения и нажмите кнопку Сохранить.
После этого в диалоговом окне сохранить текстовый файл выберите в поле тип файла расширение для сохраняемого файла, задайте его имя и щелкните мышью по кнопке Сохранить.
17. Открыв в окне Проводника папку, в которой был сохранен файл, убедитесь, что файл с указанным вами именем в ней есть.
Для организации стандартного диалогового окна Find (Найти) (см. скриншот) предназначен компонент FindDialog, который служит для ввода текстовой информации в строку Find what (Строка поиска). Введенная строка является значением свойства FindText типа String.
Кодирование операций, связанных собственно с поиском строки, осуществляется программистом. Для этого используется событие onFind типа TNotifyEvent, возникающее при нажатии кнопки Find Next (Найти далее). Действия, связанные с поиском текста, должны выполняться внутри процедуры-обработчика этого события. Диалоговое окно Find в принципе можно использовать и просто для ввода в программу текстовой информации (значение свойства FindText), хотя для этого есть более удобные средства и способы, например функция InputBox или однострочный редактор Edit.
Параметрами диалога управляет свойство Options типа TFindOptions, которое может принимать следующие значения (поскольку практически все значения этого параметра для компонента FindDialog и компонента ReplaceDialog, рассмотренного ниже, аналогичны, здесь приведены и значения, связанные с заменой текста):
- frDisableMatchCase, frDisableWholeWord, frDisableUpDown — снимают флажки Match case (Учитывать регистр), Match whole word only (Совпадение только по целым словам) и переключатели Direction (Направление поиска) соответственно;
- frDown — активизирует переключатель Down (Вниз) при открытии диалога;
- frFindNext — устанавливается при нажатии кнопки Find Next и сбрасывается при закрытии диалога;
- frHideMatchCase, frHideWholeWord, frHideUpDown — удаляют из диалога флажки Match case, Match whole word only и переключатели Direction соответственно;
- frMatchCase — включается при установке флажка Match case;
- frReplace (для ReplaceDialog) — указывает на необходимость заменить текущее вхождение строки FindText строкой ReplaceText;
- frReplaceAll (для ReplaceDialog)— указывает, что необходимо заменить все вхождения строки FindText строкой ReplaceText;
- frShowHelp — отображает кнопку Help;
- frWholeWord — включается при установке флажка Match whole word only.
Рассмотрим в качестве примера следующую процедуру:
Компонент ReplaceDialog
Компонент ReplaceDialog организует стандартное диалоговое окно Replace (см. скриншот), предназначенное для ввода текстовой информации в строки Find what (Найти) и Replace with (Заменить на). Введенные строки являются значениями свойств FindText и ReplaceText типа String соответственно.
Диалоговое окно поиска и замены строк в Delphi реализуется компонентом ReplaceDialog, который аналогичен компоненту FindDialog, но имеет дополнительное свойство ReplaceText типа String и событие OnReplace типа TNotifyEvent, возникающее при нажатии кнопок Replace и Replace All. Связанные с поиском и заменой текста действия должны выполняться в обработчике этого события.
Реализуемые компонентами FindDialog и ReplaceDialog диалоговые окна являются немодальными и после их активизации методом Execute могут оставаться в неактивном состоянии одновременно с другими окнами. В связи с этим метод Execute удобно использовать как процедуру.
Аннотация: Лекция посвящена изучению работы с диалогами. Приводятся многочисленные примеры, а также рассматриваются принципы работы с графическими файлами.
Цель лекции
Изучение стандартных диалогов и компонента-контейнера изображений TImage .
Диалоги
В любой большой программе есть диалоги.
Диалоги - это стандартные системные окна, предназначенные для получения информации от пользователя. В Lazarus диалоги - невизуальные (невидимые пользователю) компоненты, работа которых приводит к выводу на экран стандартных диалоговых окон операционной системы.
Информация , которую требуется получить от пользователя, может быть самой разной: какой файл открыть, какой файл создать, куда сохранить, какой выбрать шрифт , цвет, картинку… Можно, конечно, создавать все эти диалоги вручную, но гораздо удобней пользоваться стандартными диалогами - это проще, и эти диалоги используют язык установленной операционной системы. Тем более что от каждого диалога нам с вами потребуется всего пару-тройку свойств, и один метод - легче некуда! Все диалоги находятся на вкладке Dialogs Палитры компонентов.
TOpenDialog и TSaveDialog
Диалоги TOpenDialog и TSaveDialog предназначены, как нетрудно догадаться из их названия, для открытия и сохранения файлов:
Изучать работу диалогов мы с вами будем сразу на конкретных примерах. Чтобы не делать лишней работы, воспользуемся проектом MyNotebook из прошлой лекции, который вы должны были сохранить в папку 14-01. Если вы помните, в том проекте для хранения текста мы использовали файл MyText.txt, что не очень удобно - а вдруг пользователю захочется работать со многими файлами, а не только с одним? Вот как раз для этого нам и понадобятся два этих диалога.
Итак, откройте Lazarus. Если у вас открылся новый проект (или предыдущий), закройте его командой Файл -> Закрыть. Далее, командой Файл -> Открыть найдем и откроем проект MyNotebook (для этого нужно указать файл MyNotebook.lpi или MyNotebook.lpr). Обратите внимание: только что мы воспользовались стандартным диалогом открытия файла!
Когда проект с редактором текста откроется, установите в любое место формы по одному компоненту TOpenDialog и TSaveDialog . Эти компоненты будут невидимы для пользователя, поэтому их можно установить в любое место формы, например, прямо поверх Memo1 . Выделите компонент TOpenDialog , разберемся с его свойствами. Как видите, их не очень много, да и нужны нам будут не все.
Со свойствами разобрались, остался метод. Метод этот - Execute .
Execute вызывает стандартное диалоговое окно , и дает пользователю сделать выбор. Если пользователь сделал свой выбор, то Execute вернет True . Если пользователь отказался делать выбор и закрыл окно, не указав файла, метод вернет False .
Настроим наш TOpenDialog :
Теперь займемся фильтром. Выделите свойство Filter и щелкните по кнопке "…" справа от него. Откроется редактор фильтров, который мы заполним следующим образом:
Когда вы нажмете "ОК", Lazarus в свойстве Filter сгенерирует следующий фильтр:
Эту строку можно было бы написать и вручную, но воспользоваться Редактором фильтров все же удобней.
Теперь, когда мы настроили наш диалог открытия файлов OD, займемся кодом. Если вы помните, то загрузка текста из файла у нас происходила при нажатии кнопки "Читать", то есть, bRead . Щелкните дважды по этой кнопке, и вы попадете на код её события OnClick . Приведу текст этого события:
Помните, мы вначале проверяли, существует ли этот файл , и затем, в зависимости от результата, предпринимали либо одно, либо другое действие. Так вот, с диалогами этого делать не нужно! Если пользователь выбрал файл , то нет смысла проверять - существует ли он. Конечно, существует, иначе пользователь не смог бы его выбрать. Чувствуете разницу? Новый код события будет таков:
А теперь разница видна? Мы проверяем - если диалог сработал, то мы вызываем метод LoadFromFile , передавая ему в качестве параметра выбранный пользователем файл . Не забывайте, что в свойстве FileName диалога содержится имя выбранного файла вместе с его адресом и расширением. Если же диалог не сработал, то и делать ничего не нужно.
Теперь займемся диалогом сохранения файла TSaveDialog . А тут нам все уже известно - все свойства и метод Execute у него в точности такие, как и у TOpenDialog , разве что текст в свойстве Title другой. Именно поэтому я и дал эти диалоги парой.
Измените имя компонента на SD . Свойства DefaultExt и Filter настройте так же, как в OD. Все остальное остается без изменений. Теперь нам нужно вписать код сохранения файла. Делается это в событии OnClick кнопки "Сохранить". Новый код события такой:
Код простой, и должен уже быть вам понятен без всяких комментариев. Сохраните проект и запустите его на выполнение. Посмотрите, как работает сохранение и загрузка файлов. Здесь есть один недостаток, если вы заметили: при сохранении уже открытого файла программа все равно запрашивает, куда сохранять текст. Этот недостаток мы исправим в ближайшей лабораторной работе.
TColorDialog
TColorDialog - диалог выбора цвета. Он очень прост. Все, что нам от него нужно, это свойство Color и метод Execute . Если диалог состоялся, то сложное свойство Color будет содержать выбранный пользователем цвет. Этот цвет можно присвоить свойству Color какого-то другого компонента. Например, свойство Color компонента TMemo отображает цвет фона данного компонента. Я, правда, говорил, что не стоит использовать в проекте попугайские расцветки, но наша программа учебная, к тому же мы будем устанавливать только те расцветки, которые выберет пользователь . А потому, установите на форму еще одну кнопку TButton , свойство Name которой переименуйте в bColor , а в свойстве Caption напишите Цвет . Не забудьте снять в свойстве Anchors закрепление к верхнему краю, и установить закрепление к нижнему, как мы делали это с остальными кнопками.
Далее, нам потребуется установить на форму компонент TColorDialog :
Этот компонент , как и все остальные компоненты, невизуальный, поэтому устанавливайте его, куда хотите. Свойство Name диалога переименуйте в CD . Обработчик OnClick для кнопки bColor очень простой:
Если диалог состоялся, фону редактора присваиваем тот цвет, который выбрал пользователь . Сохраните проект, запустите его и попробуйте менять цвета.
TFontDialog
TFontDialog - диалог выбора шрифта. В этом диалоге пользователь может выбрать как сам шрифт , так и его размеры, начертание, эффекты и цвет. Не путайте цвет фона и цвет шрифта! Белый или желтый текст, например, прекрасно читается на синем или черном фоне. Нам потребуется установить на форму один такой компонент :
Свойство Name компонента переименуйте в FD . В коде нам потребуется его сложное свойство Font , которое будет содержать тот шрифт , что выбрал пользователь , и которое мы сможем присвоить свойству Font другого компонента.
Также нам потребуется кнопка с именем bFont и текстом Шрифт в свойстве Caption . Не забывайте про привязки кнопок к нижней границе формы. Обработчик OnClick для кнопки такой:
Читайте также: