Материал: Основы разработки программных средств в среде Delphi. Романов А.В

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

5.3. Типы пользовательского интерфейса

Программные продукты, работающие в операционной среде Windows, по типу используемого интерфейса пользователя можно классифицировать следующим образом:

  1. Консольные приложения;

  2. Одно-документный интерфейс (SDI-приложение).

  3. Многодокументный интерфейс (MDI-приложение).

  4. Форма со вкладками.

Консольные приложения, т.е. программы, работающие в текстовом режиме и не имеющие собственного окна. Например, программы, написанные для MS DOC, как правило, работают в консольном режиме. Приведем пример простого приложения, которое выводит в консольном окне текст.

program ConsoleProg;

{$APPTYPE CONSOLE} // директива компилятора,

// определяющая приложение как консольное

{$R *.RES}

begin

WriteLn ('Выводимый текст');

end;

5.3.1. SDI-интерфейс

Термин SDI (Single Document Interface) дословно означает одно-документный интерфейс. SDI-приложения способны загрузить и использовать одновременно только один документ. Ярким представителем такого класса программ является стандартное ПО просмотра текстовых файлов в Windows – программа "Блокнот".

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

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

5.3.2. MDI-интерфейс

Термин MDI (Multiple Document Interface) дословно означает многодокументный интерфейс и описывает приложения, способные загрузить и использовать одновременно несколько документов или объектов.

Обычно MDI-приложения состоят минимум из двух форм – родительской и дочерней. Свойство родительской формы FormStyle устанавливается равным fsMDIForm. Для дочерней формы устанавливается стиль fsMDIChild. Родительская форма служит контейнером, содержащим дочерние формы, которые могут перемещаться, изменять размеры, минимизироваться или максимизироваться только в клиентской области родительской формы. В приложении могут быть дочерние формы разных типов, например одна – для обработки изображений, а другая – для работы с текстом.

В MDI-приложении, как правило, требуется выводить несколько экземпляров объектов одного класса, каждый из которых должен быть создан перед использованием, т.е. под объект должна быть выделена память, и уничтожен (память должна быть освобождена), когда программа в объекте больше не нуждается.

В случае форм в Delphi это можно сделать автоматически с помощью вкладки Forms в опциях настройки проекта (меню Project, команда Options ( , Shift+Ctrl+F11)). При этом автоматически создаваемые формы (Auto-create forms) автоматически будут уничтожаться и освобождать память.

Для динамического создания объекта необходимо использовать конструктор Create, в частности, для динамического создания формы Form1 необходим следующий код.

Form1:= TForm1.Create(Application);

Конструктор Create получает в качестве параметра потомка класса TComponent (базовый класс всех компонентов Delphi), который и будет владельцем формы. Можно передать параметр nil, создав форму без владельца, но тогда придется освобождать занимаемую память вручную с помощью программного кода Form1.Free. В примере (как обычно и делается), в качестве владельца выступает глобальный объект разрабатываемого приложения Application. Дело в том, что процесс удаления форм подчиняется концепции владельцев объектов: когда объект уничтожается, автоматически уничтожаются все объекты, которыми он владеет. Созданная описанным образом форма принадлежит объекту Application и уничтожается при закрытии приложения.

Класс TForm имеет несколько свойств, специфичных для MDI-приложений.

ActiveMDIChild – свойство возвращает дочерний объект TForm, имеющий в текущее время фокус ввода. Оно полезно, когда родительская форма содержит панель инструментов или меню, команды которых распространяются на открытую дочернюю форму.

Свойство MDIChildren является массивом объектов, предоставляющих доступ к созданным дочерним формам. MDIChildCount возвращает количество элементов в этом массиве. Обычно эти свойства используется при выполнении какого-либо действия над всеми открытыми дочерними формами. Вот, например, код миминизации всех дочерних форм.

for i:= MDIChildCount-1 downto 0 do

MDIChildren[i].WindowState := wsMinimized;

Отметим, что если минимизировать дочерние формы в порядке возрастания элементов массива, цикл будет работать некорректно, так как после сворачивания каждого окна массив MDIChildren обновляется и пересортировывается, и возможен пропуск некоторых элементов.

Профессиональные MDI-приложения позволяют активизировать необходимое дочернее окно, выбрав его из списка в меню. Свойство WindowMenu определяет объект TMenuItem, который Delphi будет использовать для вывода списка доступных дочерних форм.

Из специфических MDI-событий класса TForm отметим, что событие OnActivate (отобразить, показать форму) родительской формы имеет место при переключении между дочерними формами.

Имеются также специфичные для MDI-форм методы. Arrangelcons выстраивает пиктограммы минимизированных дочерних форм в нижней части родительской формы. Cascade располагает дочерние формы каскадом, так что видны все их заголовки. Next и Previous вызывает переход от одной дочерней формы к другой. Tile выстраивает дочерние формы так, что они не перекрываются.

5.3.3. Форма со вкладками

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

Для создания форм со вкладками предназначен специальный элемент управления PageControl ( , страница Win32). На каждой странице данного элемента (каждая создаваемая страница является объектом типа TTabSheet) можно размещать любые другие компоненты.

Для добавления или удаления вкладки при проектировании используются команды контекстного меню New Page или Delete Page, соответственно. Во время работы программы аналогичные действия выполняются вызовом конструктора Create или метода Free класса TTabSheet.

Основные свойства класса TPageControl:

  • ActivePage – имя активной страницы (вкладки);

  • ActivePageIndex – индекс активной страницы;

  • PageCount – количество страниц;

  • Pages[Index:integer] – индексированный список страниц-объектов типа TTabSheet, обычно используется для прямого доступа ко вкладкам;

  • свойство MultiLine определяет, будут ли закладки размещаться в несколько рядов, если все они в один ряд не помещаются;

  • TabPosition определяет место расположения ярлычков закладок: сверху (tpTop), снизу (tpBottom), слева (tpLeft) или справа (tpRight);

  • стиль внешнего вида заголовков вкладок (ярлычков) определяется свойством Style: обычный (tsTabs), в виде кнопок (tsButtons), в виде плоских кнопок (tsFlatButtons);

  • TabHeight и TabWidth – высота и ширина заголовков вкладок (при нулевом значении определяются автоматически);

  • свойство ScrollOpposite определят способ перемещения закладок при размещении их в несколько рядов.

В компоненте имеется ряд методов, позволяющих оперировать страницами:

  • CanShowTab – определяет, может ли пользователь выбрать указанную закладку;

  • FindNextPage – возвращает следующую или предыдущую страницу по отношению к текущей;

  • RowCount – возвращает число рядов закладок;

  • SelectNextPage – делает активной следующую или предыдущую видимую страницу.

Основные события компонента – OnChanging и OnChange. Первое из них происходит непосредственно перед переключением на другую страницу после щелчка пользователя на новой закладке. При этом в обработчик события передается по ссылке параметр AllowChange – разрешение переключения. Если в обработчике задать AllowChange := false, то переключение не произойдет. Событие OnChange происходит сразу после переключения.

5.4. Основные стандартные компоненты

5.4.1. Надписи

Надписи (компонент Label, , страница Standard палитры компонентов) используются для отображения текста без возможностей редактирования. Класс в библиотеке VCL, соответствующий компоненту Label, носит имя TLabel. Он получается добавлением символа "T" к имени компонента (верно и в отношении других компонентов).

Основное свойство класса TLabel, в котором задается выводимый текст – Caption. Следует иметь в виду, что оно имеет строковый тип, и для вывода численных значений необходимо воспользоваться функциями преобразования:

  • IntToStr – преобразует целое число в строку;

  • FloatToStr – преобразует действительное число в строковый тип ;

  • FloatToStrF – аналогична предыдущей функции, но с возможностью формирования представления числа в виде строки (форматирования).

Естественно, для класса TLabel наиболее важными являются свойства форматирования текста. Alignment – определяет способ выравнивания текста по горизонтали: по левому краю (taLeftJustify), по правому (taRightJustify), по центру (taCenter). Свойство Layout определяет выравнивание текста по вертикали: tlTop – вверху, tlCenter – в середине, tlBottom – внизу. Оно имеет смысл, если свойство AutoSize равно false. Текст может быть автоматически отформатирован в несколько строк (перенос по словам), если свойство WordWrap установлено в true и размеры метки это позволяют.

5.4.2. Текстовое поле ввода

Текстовое поле ввода (компонент Edit, , страница Standard) позволяет отобразить и редактировать при помощи клавиатуры строковые данные (свойство Text). Для ввода чисел необходимы функции преобразования: StrToInt (преобразует строку в число целого типа) или StrToFloat (преобразует строку в действительное число).

При изменении содержимого поля ввода происходит событие OnChange. Из свойств можно отметить ReadOnly – разрешает или запрещает возможность редактирования текста, отображаемого в свойстве Text.

5.4.3. Класс tCheckBox

Элемент флажок или индикатор с флажком (компонент CheckBox, , страница Standard) используется для выбора одного из двух вариантов. Соответственно, элемент может находиться в одном из двух состояний: включен (свойство Checked равно true, флажок помечается галочкой) или выключен. Если свойство AllowGrayed равно true, то возможно и третье состояние флажка – включен и закрашен серым. Третье состояние обычно используется для того, чтобы показать, что имеются вложенные флажки, из которых установлена только часть, как, например, в опциях установок Windows. Для идентификации трех состояний используется свойство State, принимающее значения cbChecked (установлен), cbGrayed (установлен и закрашен серым), cbUnchecked (снят).

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

5.4.4. Списки

Элемент интерфейса типа список предназначен для визуализации выбора одного или нескольких вариантов из множества возможных. В Delphi для реализации подобной задачи существует несколько компонентов. Рассмотрим их.

ListBox ( , страница Standard) – отображает список элементов и позволяет пользователю выбрать из него необходимые строки. Свойство Style, установленное в lbStandard (значение по умолчанию) соответствует списку строк, другие значения позволяют отображать в списке не только текст, но и изображения. В список автоматически добавляются полосы прокрутки. Есть свойство Columns , которое определяет число столбцов, в которых будет отображаться список, если он не помещается целиком в окне компонента. Свойство Sorted позволяет упорядочить список по алфавиту.

Основное свойство компонента, содержащее массив списка строк – Items. Используется для очистки списка (метод Clear), а также для добавления (Add), вставки (Insert), перемещения (Exchange, Move) и удаления (Delete) элементов списка, в качестве которых могут выступать не только строки, но и объекты. Индекс выбранной строки можно определить по свойству ItemIndex. По умолчанию ItemIndex = -1, это означает, что ни один элемент списка не выбран. Если есть необходимость установить выбор по умолчанию (который будет показан в момент начала работы приложения), то сделать это можно, например, в обработчике события OnCreate формы, введя в него оператор вида

ListBox1.ItemIndex:=0;

В классе TListBox имеется свойство MultiSelect, разрешающее множественный выбор в списке. В этом случае проверить выбор элемента списка можно с помощью свойства Selected.

Компонент CheckListBox ( , страница Additional) аналогичен компоненту списка строк ListBox, за исключением того, что рядом с каждый элементом находится окно с флажком – индикатор, который пользователь может включать и выключать, помечая элементы списка. Имеется событие OnClickCheck, возникающее при изменении пользователем состояния каждого индикатора.

Источник: https://studfile.net/preview/16568022/