Что такое mdi и sdi интерфейс
Перейти к содержимому

Что такое mdi и sdi интерфейс

  • автор:

MDI — Многодокументный интерфейс

Существуют два основных стиля интерфейсов пользователя: интерфейс с одним документом (single-document interface, SDI) и интерфейс со многими документами (multiple-document interface, MDI). Текстовый редактор с интерфейсом SDI позволяет открыть только один документ — чтобы открыть другой, следует закрыть предыдущий. В приложении MDI Вы можете открыть сразу несколько документов.

Контейнер для форм

В приложение Visual Basic можно добавить MDI форму, которая будет служить контейнером для подчиненных форм. Подчиненная форма — это обычная форма, у которой значение свойства MDIChild равно True. В режиме выполнения подчиненные окна помещаются внутри родительского окна MDI формы. Меню команд MDI формы может быть общим для всех подчиненных окон, или, если подчиненная форма имеет собственное меню команд, оно замещает меню формы контейнера. При закрытии формы-контейнера закрываются все подчиненные формы.

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

Dim NewDoc As New Form1 ' Создать новый экземпляр формы NewDoc.Show ' Показать на экране

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

Unload Me ' Выгрузить текущую форму

На форму MDI можно поместить управляющий элемент, если он имеет свойство Align (Выстроить) или является невидимым в режиме выполнения.

Создадим Текстовый редактор

Простой текстовый редактор имеет интерфейс MDI.

Создайте форму-контейнер командой Add => MDI Form, меню Project.

На форме Form1 создайте текстовое поле Text1 и установите для него свойство Multiline в True, Top и Left в 0.

Свойство MDIChild установите в True.

Создайте процедуру Form_Resize, чтобы размеры текстового окна изменялись при изменении размеров формы:

Text1.Height = Me.ScaleHeight Text1.Width = Me.ScaleWidth

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

Option Explicit Private Sub mnuNew_Click() Dim NewDoc As New Form1 ' Создать новый экземпляр формы. Static n As Integer ' Статическая переменная сохраняет значение после завершения работы процедуры NewDoc.Show ' Показать на экране окно нового документа n = n + 1 ' Увеличиваем значение переменной на 1, при создании еще 1 экземпляра MDIForm1.ActiveForm.Caption = Left(MDIForm1.ActiveForm.Caption, 4) + CStr(n) End Sub

Код дочерней формы Form1:

Option Explicit Private Sub Form_Resize() Text1.Height = Me.ScaleHeight Text1.Width = Me.ScaleWidth ' Необходимо использовать ключевое слово Me ' Так как последующий экземпляры класса будут работать не корректно End Sub

Создайте новый пункт в меню Файл => Окна. Установите свойство WindowList — для отображения списка доступных окон, это свойство доступно лишь для MDI и подчиненных форм.

Меню в приложениях MDI

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

Таким образом, некоторые команды могут быть в меню формы контейнера, в меню подчиненной формы и на панели инструментов. Чтобы не дублировать код, нужно создать открытую процедуру в подчиненной форме и вызывать ее из процедуры обработки событий.

Форма-контейнер может содержать несколько типов документов.

В меню Файл, MDI формы добавим пункт Новый Документ.

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

Option Explicit ' Объявляем глобальную переменную для нумерации документов Public n As Integer

Код подчиненной формы:

Option Explicit Private Sub Form_Resize() Text1.Height = Me.ScaleHeight Text1.Width = Me.ScaleWidth End Sub Public Sub NewFile(m As Integer) Dim NewDoc As New Form1 NewDoc.Show m = m + 1 MDIForm1.ActiveForm.Caption = Left(MDIForm1.ActiveForm.Caption, 4) + CStr(m) End Sub Private Sub mnuNew_Click() NewFile MDIForm1.n End Sub

Загрузка и выгрузка форм MDI и подчиненных форм

При загрузке подчиненной формы автоматически загружается и форма MDI. Однако при загрузке формы MDI, подчиненные формы автоматически не загружаются. Это можно увидеть, установив в качестве стартового объекта MDI форму. Можно загрузить подчиненные формы как скрытые, установив значение свойства AutoShowChildren в True и отобразить их в нужный момент методом Show.

Выгрузка формы выполняется по команде Unload в коде программы или при закрытии окна.

При этом выполняются обработки событий QueryUnload и Unload для формы, в которых можно отследить сохранение введенных данных. При выгрузке MDI формы выгружаются и все подчиненные формы. Команда End вызывает немедленное завершение программы, при этом не выполняется процедуры обработки событий.

Проверка были ли сохранены данные

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

Для получения информации о состоянии документа в модуле подчиненной формы введем логическую переменную:

Public fs As Boolean

Переменная fs получает значение True при любых изменениях в текстовом поле.

Private Sub Text1_Change() fs=True End Sub

Пусть сохранение документа выполняется в процедуре SaveFile. Переменная fs получает значение False после сохранения документа.

Private Sub SaveFile() : fs=False End Sub

Если при закрытии документа fs равно True, то функцию MsgBox выводит вопрос и возвращает ответ пользователя. Если ответ был Yes, то выполняется процедура SaveFile.

Private Sub Form_QueryUnload(Cancel As integer, UnloadMode As Integer) If fs Then If MsgBox("Сохранить файл?", vbYesNo)=vbYes Then SaveFile End If End Sub

SDI и MDI

MFC упрощает работу как с однодокументным интерфейсом (SDI), так и с несколькими приложениями интерфейса MDI.

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

В Windows 95 и более поздних версиях приложения обычно представляют собой SDI, так как операционная система приняла представление «по центру документов».

SDI- и MDI-приложения в Qt

Существует два типа приложений, базирующихся на документах. Первый тип — это SDI (Single Document Interface, однодокументный интерфейс), второй — MDI (Multiple Document Interface, многодокументный интерфейс). В SDI-приложениях рабочая область одновременно является окном приложения, а это значит, что невозможно открыть в одном и том же приложении сразу два документа. MDI-приложение предоставляет рабочую область (класса QWorkSpace), способную размещать в себе окна виджетов, что дает возможность одновременной работы с большим количеством документов.

Главное отличие MDI — от SDI -приложения состоит в том, что SDI-приложение содержит только одно окно документа, a MDI-приложение способно содержать несколько таких окон, что дает пользователю возможность параллельной работы с несколькими документами.

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

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

Популярные статьи

Класс главного окна QMainWindow

Создание главного окна приложения с помощью QMainWindow

03.12.2011 г. Автор: admin QMainWindow — это очень важный класс, который реализует главное окно, содержащее в себе типовые виджеты, необходимые большинству приложений, такие как меню, секции для панелей инструментов, рабочую область, строки состояния. В этом классе внешний вид уже подготовлен и его виджеты. Далее.

Работа с файлами. Класс QFile

Работа с файлами и папками в Qt

03.12.2011 г. Автор: admin Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта, вызовом метода. Далее.

Реализация сервера с помощью класса QTcpServer

Создание сервера с помощью класса QTcpServer

03.12.2011 г. Автор: admin Для реализации сервера Qt предоставляет удобный класс QTcpServer, который предназначен для управления входящими TCP-соединениями. Программа, показанная на рисунке, является реализацией простого сервера, который принимает и подтверждает получение запросов клиентов. Далее.

2011-2012 © qt-doc.ru — Программирование Qt

Права на опубликованные материалы принадлежат их авторам. При перепечатке наличие прямой активной ссылки на qt-doc.ru обязательно.

КАК применяются технологии SDI и MDI?

В приложениях, разрабатываемых под Windows давно уже действует некоторый стандарт. Если вы пишите приложение на Visual C++, то скорее всего будете использовать однодокументный или многодокументый интерфейс пользователя. Это своего рода шаблон, созданный Microsoft для ускроения разработки приложений.
Однодокументный интерфейс — своего рода джентельменский набор того, что должно иметь уважающее себя главное окно — меню, панель инструментов и строка состояния. Мастер Visual C++ App Wizard (Мастер Приложений) позволяет сгенеировать шаблон такого приложения, где всё это есть по минимуму. То есть вам самим не надо будет беспокоиться о таких вещах, как элементы управления и можно будет вплотную заняться алгоритмом работы приложения.
Вот, как выглдят такое стандартное окно:

Разрабатывая своё приложение на базе такого окна, вы будете добавлять в него новые пункты меню, кнопки панели инструментов, надписи в строку состояния. В конце концов такое окно изменится почти до неузнаваемости. Вот, что получилось у компании Sonic Foundry:

Как продолжение однодокументного интерфейса — многодокументный. Он позволяет размещать в главном окне сразу несколько окон, выполняющих функции всего, что угодно — окна настройки, управляющих окон, графиков, таблиц и диспетчеров файлов. Порождённые окна не имеют права покидать пределы главного окна. Также они не могут отображаться без родительского окна — сами по себе. При перемещении родительского окна по экрану, они перемещаются вместе с ним. В заголовке окна MDI приложения обычно пишется имя активного документа. Кроме того, обратите внимание, что у SDI-приложений нет пункта меню Window («Окно»), в котором в обязательном порядке должен быть выведен список всех окон и стандартные команды: New Window («Новое окно»), Cascade («Расположить каскадом»), Tile («Растянуть»), Arrange Icons («Упорядочить значки»).

Если документы связаны сежду собой слабо, смысла создавать многооконное приложение нет никакого. Вы можете открыть сколько угодно копий приложения Paint и копировать рисунки из одного в другое. Но если существует реальный обмен данными, то передавать их между приложениями гораздо сложнее, чем внутри одного приложения. Так возникла технология «Документ / Вид» или «Документ / Представление» — («Document / View»). Начинающим она кажется сложной, но это не так. У любого приложения документ может быть только один. В классе документа хранятся общие данные, с которыми работают все окна. Вид — класс, отвечающий за клиентскую часть окна. Для каждого нового окна вид создаётся свой. Эти же данные конечно можно было бы хранить и в классе вида. Как вы понимаете, данные можно хранить где угодно. Но тогда к ним будет осложнён доступ из других документов.

Оба эти примера — SDI и MDI были сгенеированы мастером App Wizard программы Visual C++. Я не вписал в них ни единой строчки кода!

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *