Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi_Alp.doc
Скачиваний:
1
Добавлен:
25.11.2019
Размер:
416.26 Кб
Скачать

Пример mdi-приложения.

З апускаем Delphi. В меню "File" выбираем пункт "New Application".

Переименовываем свойство имени формы Name из Form1 в MainForm.

Устанавливаем свойство в инспекторе объектов FormStyle в fsMDIForm. Его можно выбрать из ниспадающего списка доступных свойств. Свойство означает, что данное окно будет родительским в MDI-приложении.

В палитре компонентов выбираем MainMenu. Это второй компонент слева на вкладке Standart. Помещаем его на проектировщик формы Form1. Дважды щелкаем по нему. Появляется конструктор меню окна. Здесь и далее для того, чтобы вызвать конструктор для размещенного в форме компонента главного меню (MainMenu), необходимо или дважды кликнуть по нему мышкой или дважды кликнуть в Object Inspector по свойству Items. Далее, пользуясь свойством Caption задайте меню такой вид, как на рисунке. Примечание: выбрать изменяемый пункт можно мышкой, для изменения названия выберите в инспекторе объектов свойство Caption, для отделения секций меню линией используйте знак тире в свойстве Caption для нужного пункта меню. Создание меню очень простое. Вы сразу видите результат изменения, добавления или удаления пунктов в редакторе формы. Вы всегда можете пополнить пункты меню, используя дополнения, выделенные пунктирной рамкой. Всегда можно вставить или удалить пункт меню в нужное место. Для этого воспользуйтесь правой клавишей мыши. Выбрать интересующее действие можно из выпадающего меню.

Итак, содержание главного меню:

Файл

Правка

Окна

Помощь

Новый

Вырезать

Упорядочить

О программе

Открыть

Копировать

 

 

Сохранить

Вставить

 

 

Сохранить как:

 

 

 

Закрыть

 

 

 

Выход

 

 

 

Выбираем пункт меню "Окна" и переименовываем его имя (идентификатор) Name в инспекторе объектов в WindowMenu.

Выбираем мышкой форму MainForm. В Object Inspector в свойстве WindowMenu устанавливаем их ниспадающего списка пункт меню WindowMenu. Теперь во время работы приложения все дочерние окна будут списком отображаться в меню "Окна".

Поскольку дочерних окон в этом приложении будет много и по внешнему виду они будут подобные, то нет смысла проектировать каждое окно отдельно. Спроектируем одно. Для помещения в проект новой формы выбираем из меню "File" пункт "New Form".

Устанавливаем размеры окна Form2 меньшими главного родительского окна.

Переименовываем свойство Name для этого окна из Form2 в ChildForm.

Устанавливаем свойство дочернего окна для MDI-приложения FormStyle в fsMDIChild.

Выбираем из палитры компонентов Memo и устанавливаем его в дочернюю форму ChildForm.

Меняем свойство Align для этого компонента на alClient. Он немедленно расширяется на все доступное пространство окна.

Далее будем писать событие выбора пункта меню "Новый". При нажатии на него должно появляться дочернее окно. Поступаем следующим образом. Поскольку дочерних окон будет множество, то мы программа должна их автоматически при необходимости создавать. По умолчанию Delphi устанавливает автоматическое создание окна во время запуска приложения. Это избавляет программиста от написания некоторых команд. В данном случае мы все сделаем сами. Выбираем из меню "Project" пункт "Options:". На вкладке Forms снимаем установку "Auto-create forms" для окна ChildForm. Для этого выбираем его и перегоняем одинарной стрелкой в сторону "Available forms". Нажимаем кнопку OK.

Сохраняем проект на диске. Для этого проводником Windows создаем отдельную папку для хранения этого примера. В меню "File" выбираем пункт "Save All". Дальше появляются диалоги сохранения модулей окон и файл проекта. Модуль Unit1 родительского окна можно назвать, сохранив его под именем MainUnit. Модуль Unit2 дочернего окна приложения. можно сохранить под именем ChildUnit. Весь проект можно сохранить под именем MyEdit.

Теперь напишем в редакторе кода процедуру создания дочернего окна. Выбираем окно MainForm и дважды щелкаем по компоненту MainMenu1. Выбираем пункт меню "Новый". В Object Inspector переходим на вкладку событий Events. Дважды щелкаем по полю, правее OnClick. Или нажимаем Ctrl+Enter. Появляется готовый заголовок процедуры нажатия на пункт меню "Новый". Между begin и end пишем следующую строку:

TChildForm.Create(Self);

Поскольку в этом окне создается другое, то в переименованный модуль MainUnit необходимо подключить ChildUnit. Для этого выбираем из меню "File" пункт "Use Unit:" и указываем модуль ChildUnit. Нажимаем OK.

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

Программа которую мы создаем — это простое MDI-приложение, где все открываемые файлы в отдельных дочерних окнах размещаются внутри родительского окна (принцип можно увидеть на примере текстового редактора MS Word).

Сразу отмечу некоторые недостатки этой программы. Во первых, новое окно с полем для редактирования появляется уже с текстом "Mio1", во вторых, дочернее окно невозможно закрыть. При закрытии дочернего окна оно минимизируется.

Уже рассматривалось в первых уроках, что проектируемое приложение в момент запуска будет иметь одинаковый вид, свойства, какие были заданы на этапе разработки. Поэтому необходимо убрать все тестовые строки из компонента Mio1 во время разработки, чтобы они не отображались в запущенном приложении.

Для этого сначала отображаем проектируемую форму ChildForm на экран. Для этого нажимаем комбинацию клавиш Shift+F12 или выбираем пункт "Forms..." в меню "View". В появившемся окне выбираем эту самую форму и нажимаем Ok.

Выделяем компонент Mio1 в проектируемой форме одинарным щелчком мышки. В инспекторе объектов находим свойство этого компонента Lines. Изменяем это свойство, нажав на кнопку с троеточием в поле с TStrings. Появляется окно String List Editor, в котором надо убрать все буквы, оставив его пустым. Далее нажимаем Ok.

Теперь мы видим в проектировщике формы ChildForm, что компонент Mio1 не содержит никаких строк.

Дальше сделаем дочернее окно нормально-закрываемым. Для этого необходимо выделить компонент ChildForm (саму проектируемую форму). Но поскольку на этой форме расположен компонент Mio1, который имеет размер всей рабочей области формы, сделать визуально нам это не удастся. Поэтому выбираем прямо из инспектора объектов.

В верхней части Object Inspector есть ниспадающий список, в котором нужно выбрать ChildForm. Далее переходим на вкладку событий Events. Находим событие OnClose (закрытие окна) и дважды щелкаем по пустому полю правее. Создается готовый каркас процедуры закрытия окна с заголовком:

procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);

Здесь вносимый в процедуру параметр Action определяет поведение данной формы при закрытии. Он может принимать следующие значения:

caNone — форма не предпринимает никаких действий.

caHide — форма прячется от глаз пользователя, но не уничтожается из памяти. Поскольку мы с вами "вручную" (программно) создаем дочернюю форму, то нам нужно ее при закрытии уничтожить из памяти.

caFree — форма закрывается и уничтожается из памяти.

caMinimize — форма минимизируется. Это значение для MDI-дочерних окон установлено по умолчанию.

Пишем внутри созданной процедуры:

Action := caFree;

Теперь запустите приложение на выполнение (F9) и посмотрите на ее работу.

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

Итак, открывается файл при выборе пункта меню "Открыть", которое находится в главной форме. Отображаем проектируемую форму MainForm поверх всех окон (Shift+F12). Устанавливаем в форму компонент OpenDialog . Он находится на палитре компонентов на странице Dialogs.

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

Выделяем его и в инспекторе объектов устанавливаем следующие свойства:

Свойство Title устанавливает заголовок такого окна. Заносим в это свойство строку "Открыть текстовый файл".

Свойство Filter фильтрует список по расширению в названиях файлов. Нажимаем на троеточие в этом свойстве. На экран выводится окно Filter Editor, в котором можно легко задать все возможные маски файлов. В левой части Filter Name пишется отображаемое в фильтре название. В правой части Filter сам фильтр. Пишем так, как указано на рисунке. Нажимаем на Ok.

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

Выбираем пункт меню "Файл" в форме MainForm и выбираем пункт "Открыть". Создается пустая процедура реакции на событие выбора этого меню. В ней пишем:

if OpenDialog1.Execute then // если файл выбран, то выполнять следующее

begin

ChildForm := TChildForm.Create(Self); // создать дочернее окно

ChildForm.Mio1.Lines.LoadFromFile(OpenDialog1.FileName); // загрузить в Mio1 выбранный файл

ChildForm.Caption := OpenDialog1.FileName; // установить заголовок дочернего окна в название файла

end;

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

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

Функция Execute для компонента OpenDialog1 вызывает диалоговое окно открытия файла и возвращает значение исхода выбора. Если значение равно true (истинно), то файл был выбран и false (ложно) — пользователь нажал на "Отмена".

Продолжаем понемногу писать текстовый редактор. В почти каждом MDI-приложении есть меню "Окно" или "Window", в котором первыми пунктами стоят различн ого рода операции с позиционированием дочерних окон. Сделаем что-то подобное в нашем многооконном приложении.

Открываем проект на приложении в среде программирования Delphi. Комбинацией клавиш Shift+F12 выводим на экран главную форму MainForm.

Начиная с версии Delphi 4, на странице палитры компонентов Standart есть компонент TActionList. Устанавливаем этот компонент на проектировочную форму MainForm. Дважды щелкаем по нему мышкой или выбираем пункт "Action List Editor" из выпадающего меню по правой кнопке мыши. Открывается окно изменения действий. Нажимаем комбинацию клавиш Ctrl+Ins, или выбираем пункт "New Standart Action" из ниспадаюшего меню на ж елтой кнопке.

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

С помощью нажатой кнопки Shift или Ctrl выберите все стандартные действия, которые относятся к категории Window. Это и есть действия управлением состоянием окон. Нажимаем на кнопку Ok. Теперь вы видите, что в списке действий появилась категория Window (в левой части), в которой находятся все выбранные стандартные действия с окнами (в правой части).

По умолчанию все стандартные действия будут иметь названия на английском языке, поэтому будем из русифицировать вручную. Выбираем первый пункт списка действий Arrange1 и меняем свойство Caption на "Упорядочить значки". Здесь вы сразу заметите, что изначально это свойство имеет значение "&Arrange". Знак амперсанта означает, что следующий за ним символ будет подчеркнут. Это свойство полезно для быстрого выбора пункта данного меню с помощью горячей подчеркнутой клавиши, когда меню активизировано (подробнее можно узнать из справочной системы Windows). Вы сами можете назначать свои буквы быстрого доступа к пунктам меню самостоятельно. Скажу только, что за свою многолетнюю практику ни разу не встречал человека, который пользовался бы таким доступом в меню, поэтому в своих программах подчеркнутых букв не делаю. Но вы пожете не пренебрегать правилами хорошего тона в программировани и все делать по правилам.

Таким образом меняем свойства Caption для всех действий, согласно таблице

&Arrange

Упорядочить значки

&Cascade

Каскадом

C&lose

Закрыть

&Minimize All

Минимизировать все

Tile &Horizontally

Упорядочить по горизонтали

&Tile Vertically

Упорядочить по вертикали

Теперь можно закрыть окно с действиями. Вызываем проектировщик пунктов меню MainMenu1 для формы MainForm.

Удаляем все пункты из меню "Окна". Там из наших первых уроков присутствует только один пункт "Упорядочить". Дальше все довольно просто. Для первого пустого пункта меню изменяем свойство Action в Arrange1. Этот пункт меню сразу изменит свое название на "Упорядочить значки". В проектировщике меню сразу добавляется новый пункт. Изменяем его свойство Action на Cascade1.

И так далее. Добавляем в меню все стандартные действия с окнами.

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

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

У нас остался незадействованным меню "Правка". Там содержатся три стандартных пункта "Вырезать", "Копировать" и "Вставить". Эти действия являются стандартными и содержатся в списке стандартных действий в ActionList1. Они находятся в категории Edit. Добавьте их в список действий самостоятельно. Не забудьте о русификации свойства Caption. В проектировщике меню измените свойство Action у пунктов правки на соответствующие пункты стандартных действий.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]