Опубликован: 07.04.2008 | Уровень: специалист | Доступ: платный
Лекция 28:

ActionList и MDI-окна

< Лекция 27 || Лекция 28: 12 || Лекция 29 >

Сейчас займемся компонентом ActionList. Вначале свяжем его с нашей коллекцией рисунков. Выделите компонент, и в свойстве Images выберите наш ImageList. Далее дважды щелкните по ActionList, чтобы открыть редактор действий. Появится окно редактора, разделенное на две области. Область Categories содержит категории действий, а область Actions – сами действия. Создадим новое действие. Для этого щелкните правой кнопкой по области Actions и выберите команду New Action (новое действие). Действие создастся:

Редактор действий ActionList

Рис. 28.3. Редактор действий ActionList

По умолчанию, действие имеет имя Action1. Выделите это действие и переименуйте его свойство Name в FileNew. Теперь настроим это действие. В свойстве Caption напишите "Новый", это действие будет открывать окно редактора с новым документом. В свойстве Category напишите "File", в этой категории будем хранить все действия, связанные с командой меню "Файл". Сразу же наше действие исчезло из окна – создана новая категория, и действие перенесено в нее. Выберите File в области Categories, а в области Actions снова выделите наше действие.

Теперь нас интересует свойство Hint – строка подсказки, которая выскакивает при наведении указателя мыши на объект. Подсказка выскакивает, если свойство ShowHint объекта установлено в True, мы это сделали только для панели инструментов. Значит, подсказки будут выходить только для кнопочек. В свойстве Hint напишите следующее: "Создать новый файл".

Следующее интересное свойство – ImageIndex, оно показывает индекс изображения для выбранного действия. Когда вы откроете свойство, откроется список картинок, из которых можно выбрать нужную:

Редактирование действия

Рис. 28.4. Редактирование действия

Действие мы подготовили, однако оно работать просто так не будет. Чтобы заставить действие работать, нужно на вкладке Events (События) создать для него обработчик события onExecute. Щелкните дважды по этому событию, и напишите в нем следующий код:

fEditor := TfEditor.Create(Owner);  //создаем новое окно

Переменная fEditor была объявлена в разделе глобальных переменных дочерней формы:

var
  fEditor: TfEditor;

С помощью функции Create() мы создаем новый объект (форму), и присваиваем его этой переменной. То есть, создаем дочернюю форму вручную. Таким же образом вы сможете создавать в дальнейшем другие дочерние окна, указывая их идентификатор.

Действие создано. Теперь создадим кнопку на панели инструментов, которая будет выполнять это действие. Выделите панель инструментов ToolBar, в свойстве Images укажите наш ImageList, чтобы панель использовала те же изображения, что и ActionList. Теперь щелкните по панели правой кнопкой, выберите команду "New Button". Появилась новая кнопка. Выделите ее, и в свойстве Action выберите наше действие – FileNew. Сейчас же на кнопочке появилось нужное изображение, и теперь нажатие на нее приведет к созданию нового дочернего окна. Сохраните проект, скомпилируйте его и выполните. Несколько раз нажав на кнопку, вы создали несколько дочерних окон с редактором. Закрытие дочернего окна уже не сворачивает его, а уничтожает.

Привяжем это же действие к пункту главного меню. Выделите MainMenu, в свойстве Images выберите этот же ImageList. Дважды щелкните по главному меню, чтобы открыть редактор. Создайте категорию "Файл" и команду "Новый". В свойстве Action этой команды выберите наше действие FileNew. Сохраните проект, скомпилируйте и запустите его. В меню появилась команда "Файл – Новый", которая имеет ту же картинку и выполняет то же действие, что и кнопка на панели инструментов.

Проделаем все те же самые действия для всплывающего меню. Но здесь нет категорий, поэтому просто создайте команду "Новый". Не забудьте предварительно привязать к PopupMenu наш ImageList, а к главной форме в свойстве PopupMenu – само всплывающее меню.

Создать новое окно несложно, сложнее открыть уже имеющийся файл. Снова откройте редактор действий ActionList. В категории File создайте новое действие, переименуйте его в FileOpen. Выделите действие, в свойстве Hint напишите "Открыть файл", в свойстве Caption "Открыть", в свойстве ImageIndex выберите подходящую картинку. В событие onExecute введите код:

if OpenDialog1.Execute then begin
    fEditor := TfEditor.Create(Owner);
    fEditor.Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    fEditor.Caption := OpenDialog1.FileName;
  end; //if

Вначале мы проверяем, выбрал ли пользователь файл? Если да, то создаем новое дочернее окно. По умолчанию, оно активно, поэтому можем обращаться к нему по имени переменной fEditor. Загружаем в Memo выбранный файл, затем в заголовок окна выводим имя файла.

Создайте новую кнопку, привяжите к ней это действие. Создайте в главном меню команду "Файл - Открыть", привяжите это же действие. В всплывающем меню создайте команду "Открыть", и привяжите к ней это же действие. Сохраните, скомпилируйте и запустите проект, попробуйте несколько раз открывать разные текстовые файлы. Для большего эффекта можете в компонентах OpenDialog и SaveDialog создать фильтры для расширения *.txt.

Для действия FileSave (сохранить файл) код события onExecute будет такой:

//если активного окна нет - выходим:
  if ActiveMDIChild = nil then exit;
  //если в строке окна есть имя файла, сохраняем в него:
  if Length(ActiveMDIChild.Caption)> 0 then
    fEditor.Memo1.Lines.SaveToFile(fEditor.Caption)
  //иначе спрашиваем, куда сохранять, и сохраняем:
  else if SaveDialog1.Execute then begin
    fEditor.Memo1.Lines.SaveToFile(SaveDialog1.FileName);
    fEditor.Caption := SaveDialog1.FileName;
  end; //else if

Как видно из кода, команда ActiveMDIChild будет содержать значение nil (ничего, пусто), если нет ни одного активного окна. Все остальные операции с этим действием создайте самостоятельно, и привяжите это действие к команде главного меню "Файл – Сохранить", к команде всплывающего меню "Сохранить", к новой кнопке на панели инструментов. Также самостоятельно создайте действие FileExit (выход из программы), и привяжите его к кнопке и соответствующим пунктам главного и всплывающего меню.

У MDI – приложений есть несколько полезных свойств и методов. Рассмотрим некоторые из них.

ActiveMDIChild – указывает на активное дочернее окно. Например, текст в

ActiveMDIChild.Caption

является заголовком активной дочерней формы.

MDIChildCount возвращает целое число – количество открытых дочерних окон.

MDIChildren позволяет получить доступ к любому, даже неактивному дочернему окну. Например,

MDIChildren[1]

это первое дочернее окно

Напоследок научимся вставлять в ActionList стандартные действия. Откройте редактор действий. Щелкните по нему правой кнопкой, и выберите команду "New Standard Action". Откроется список, в котором можно выбрать категорию и команды действий. Нам нужна категория Window (Окно). Выделите эту категорию и следующие команды в ней:

Выбор действий категории Window

Рис. 28.5. Выбор действий категории Window

Как только вы нажмете ОК, эти действия попадут в список ActionList, в категорию Window. Отсортируйте команды следующим образом, и для указанных команд укажите изображения:

Новая стандартная категория

Рис. 28.6. Новая стандартная категория

По порядку, в свойствах Caption этих действий укажите: "Выравнивание каскадом, Выравнивание горизонтально, Выравнивание вертикально, Упорядочить, Свернуть все, Закрыть окно". Сделайте соответствующие пункты в разделе "Окно" главного меню, и в свойстве Action этих пунктов присвойте соответствующие команды. Никакого кода вводить не нужно, он уже содержится в этих командах. Сохраните проект, скомпилируйте и посмотрите, как он работает. Новые команды меню будут недоступны, пока нет открытых окон, при открытых окнах ими можно будет пользоваться. Не написав ни строчки кода, мы организовали обработку окон многооконного проекта, используя стандартные действия ActionList.

< Лекция 27 || Лекция 28: 12 || Лекция 29 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Олег Волков
Олег Волков
Россия, Балаково, МБОУ СОШ 19