Методические указания для проведения практических и лабораторных занятий по дисциплине "Программирование на языке высокого уровня" для студентов специальностей 220200 Автоматизированные системы обработки информации и управления

Вид материалаМетодические указания

Содержание


Компонент TGroupBox
Компонент TPanel
Компоненты TOpenDialog и TSaveDialog
Компонент TColorDialog
Компонент TDriveComboBox
Компонент TFileListBox
Компонент TDirectoryOutline
Подобный материал:
1   2   3   4   5   6   7   8   9   10   11

Компонент TGroupBox

TObject—TPersistent—”TCorr]ponent—”TControl—>TWinControl—>

—>TCustomControl—>TCustomGroupBox—TGroupBox

Модуль STDCTRLS

Страница Палитры компонентов Standard

Единственное назначение этого компонента — служить предком (Parent) для других компонентов. Это играет роль тогда, когда они должны быть объединены в группу по какому-либо признаку. Типичный пример — радиокнопки. Когда одна из них нажимается, все остальные радиокнопки в группе (т. е. с одним значением свойства Parent) автоматически отпускаются.

Поэтому, для того чтобы на форме иметь несколько независимых групп радиокнопок, их нужно поместить на разные объекты типа TGroupBox. (Кстати, именно для решения задачи с радиокнопками есть специальный ком­понент — TRadioGroup).

Будучи потомком класса TCustomControl, TGroupBox наследует от него общие свойства, описанные ранее. Специфических свойств и методов этот компонент не имеет.


Компонент TPanel

TObject->TPersistent-”TComponent->TControl->TWinControl—>

->TCustomControl—”TCustomPanel-”TPanel

Модуль EXTCTRLS

Страница Палитры компонентов Standard

Этот компонент — панель — является несущей конструкцией для размещения других элементов управления. В отличие от простой рамки (TBevel) панель сама является оконным элементом управления и родителем для всех разме­щенных на ней компонентов. Часто ее используют для создания панелей инстру­ментов, строк состояния и т. п.

За внешнее оформление панели отвечают свойства:

(Pb) property Bevel Inner: TPanelBevel;

(Р1э) property BevelOuter: TPanelBevel;

TPanelBevel = (bvNone, bvLowered, bvRaised) ;

(Pb) property BevelWidth: TBevelWidth;

TBevelWidth = 1..Maxint;

(Pb) property BorderWidth: TBorderWidth;

TBorderWidth = 0..Maxint ;

На границах панели размещаются две специальные окаймляющие рамки (bevels): Bevellnner и BevelOuter. При помощи комбинации белого и серого цветов они имитируют трехмерность — приподнятость (bvRaised) или утоп-ленность (bvLowered). Обе рамки имеют ширину BevelWidth. Наружная — BevelOuter — расположена прямо по периметру панели, вторая — Bevellnner — внутри на расстоянии BorderWidth от нее. Обе могут быть невидимыми (bvNone), приподнятыми или утопленными.

Комбинируя сочетания bvLowered/bvRaised, можно создать вокруг панели "ров" или "вал".

Иллюзию трехмерности может подчеркнуть также стиль обрамления компо­нента:

(Pb) property BorderStyle: TBorderStyle;

TBorderStyle = bsNone .. bsSingle;

Значение bsSingle означает, что панель будет окаймлена черной линией единичной толщины (по периметру, снаружи от обеих рамок).

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

(Pb) property Alignment: TAlignment;

Свойство

(Pb) property Locked: boolean;

предназначено для определения способа взаимодействия панели с размещен­ными на ней объектами OLE. Если оно равно True, последние при активизации сервера OLE "по месту'" не могут заместить панель. В обработчике события:

(Pb) property OnResize: TNotifyEvent;

может быть предусмотрена реакция пользователя на изменение размеров панели.


3.6. Компоненты — стандартные диалоговые окна Windows

В Windows, начиная с версии 3.1, появилась библиотека стандартных диало­говых окон COMMDLG.DLL, которая позволила заменить вызовом функций программирование рутинных операций в типовых случаях взаимодействия с пользователем. К этим случаям относятся выбор имени файла для чтения и записи, выбор цвета или шрифта, поиск и замена текста, настройка принтера и параметров печати. В Delphi предусмотрены компоненты, представляющие собой оболочку для этих стандартных диалогов.




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

1. Настройка параметров диалога, во время которой устанавливаются те или иные возможности. У всех диалогов для этого предусмотрено свойство Options, но у некоторых есть и дополнительные свойства.

2. Вызов метода Execute, который показывает диалоговое окно на экране и инициирует взаимодействие с пользователем. Execute является функцией:

он возвращает True, если пользователь подтвердил ввод значения (т. е. нажал кнопку ОК на экране или клавишу на клавиатуре) и False, если он отказался от выбора (т. е. нажал кнопку Cancel или клавишу ).

3. В случае положительного ответа — чтение установленных значений в пред­ставляющем их свойстве (свойствах).

Примечание

Несколько отличается принцип взаимодействия в диалогах TFindDialog и TReplaceDialog, где нажатие кнопки подтверждения (Find и Replace соот­ветственно) инициирует событие, которое пользователь должен обработать.

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


Компоненты TOpenDialog и TSaveDialog

TObj ect—>TPersistent—>TCoinponent—>TConimonDialog—”TOpenDialog—”

-+TSaveDialog

Модуль DIALOGS

Страница Палитры компонентов Dialogs

Эти компоненты-диалоги предназначены для выбора имени файла, который будет в дальнейшем использован для чтения или записи. Рассмотрим их сов­местно, т. к. они отличаются только интерпретацией некоторых опций.

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

(РЬ) property Filter: string;

Формат строки фильтра состоит из двух частей. В первой задается крат­кое описание типа. Во второй части, которая отделяется символом '|' — маска поиска нужных файлов по расширению. В список файлов попадут толь­ко те, которые имеют указанные расширения. Примеры задания фильтра: 'Delphi projectsl*.dpr' или 'All graphics files I *-bmp,*.ico,*.wmf '.

Таких пар строк для разных типов в фильтре может быть несколько, при этом форматы представления фильтра в самой системе Windows и в Delphi имеют одно отличие. При вызове стандартных диалогов Windows эти пары строк должны разделяться нулевым байтом, после последней строки также должен стоять нулевой байт. В рассматриваемых компонентах все строки раз­деляются символом 'Г.

Создавать строки вручную нужно лишь в редких случаях — для ввода значения свойства на этапе проектирования предназначен специальный редактор. Есть также простой способ составить фильтр для графических файлов — для этого предназначена процедура GraphicFilter (ее описание см. в разделе "Графическая подсистема").

В качестве начального фильтра при вызове диалога будет выбрана та пара строк, номер (индекс) которой совпадает со значением свойства:

(Pb) property Pilterlndex: Integer;

Если свойству не присваивалось значения, то по умолчанию выбирается первая пара.

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

(Pb) property InitialDir: string;

В случае, если в поле ввода имени файла пользователь при ручном наборе не определил его расширение, это за него пытается сделать диалог. Для этого свойству

(Pb) property DefaultExt: TFileExt;

TFileExt = string[3];

присваивается строка (до трех символов, без точки), которая и будет исполь­зоваться в качестве расширения по умолчанию. Например, если пользователь ввел в поле имени файла 'mybitmap', a DefaultExt равно 'bmp', то компонент вернет полное имя 'mybitmap. bmp'.

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

(Pb) property FileEditStyle: TFileEditStyle;

TFileEditStyle = (fsEdit, fsComboBox);

а содержимое списка ранее возвращавшихся имен — свойством:

(Pb) property HistoryList: TStrings;

В случае действия стиля fsEdit это свойство не играет роли. Если же установ­лено fsComboBox, в выпадающем списке появляется содержимое HistoryList.

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

procedure TFormI-FileOpenClick(Sender: TObject);

begin

with OpenDialogI do

if Execute then

begin

Memol.Lines.LoadFromFile(FileName) ;

HistoryList.Add(FileName);

end;

end;

У двух диалогов имеется большой набор опций. Часть из них является общей, часть — играет роль только для одного из диалогов:

(Pb) property Options: TOpenOptions;

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMuItiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCreatePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCreate) ;

TOpenOptions = set of TOpenOption;

Три опции отвечают за работу с файлами со статусом "только для чтения":

ofReadOnly — делает флажок "Read only" помеченным при появлении;

ofHideReadOnly — прячет этот флажок в появляющемся диалоге;

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

Также три опции ограничивают ввод имен для новых (несуществующих) фай­лов:

ofPathMustExist — указывает на то, что файл может находиться только в одном из существующих каталогов. В случае ввода несуществующего пути к файлу пользователь извещается об ошибке;

ofFileMustExist — аналогичньм образом указывает на то, что может быть выбран только один из существующих файлов;

ofCreatePrompt — опция устанавливает реакцию на предыдущую ситуацию. Если она установлена, то вместо сообщения об ошибке вьшодится запрос на создание нового файла.

Другие опции:

ofOverwritePrompt — запрашивает подгверждение, если пользователь вы­брал для записи уже существующий файл;

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

ofShowHelp — включает в состав диалога кнопку Help;

ofNo Validate — выключает проверку введенного имени файла на наличие в нем недопустимых символов;

ofAllowMultiSelect —позволяет выбирать несколько файлов одновременно;

ofShareAware — отключает проверку на возможность совместного доступа к выбранному файлу. В случае отстутствия этой опции файл нельзя вы­брать, если он открыт другим приложением;

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

Наконец, одна опция — ofExtensionDifTereiit — является выходной. Она уста­навливается после завершения диалога в том случае, если расширение у вве­денного имени файла отличается от того, которое определено по умолчанию (в свойстве DefaultExt).

Текст, появляющийся в заголовке диалога, определяется свойством:

(Pb) property Title: string;

Если оно не было задано, то в заголовках диалогов появится "Open" для TOpenDialog и "SaveAs" для TSaveDialog.

В случае успешного завершения диалога в свойстве

(Ro) property Files: TStrings;

содержатся имена выбранных пользователем файлов. Если выбран один файл, его имя можно получить как Files.Strings[0], но есть для этого и отдельное свойство:

(Pb) property FileName: TFileName;


Компонент TColorDialog

TObject->TPersistent—>TCoinponent-TCommonDialog->TColorDialog

Модуль DIALOGS Страница Палитры компонентов Dialogs

Предназначен для определения цвета пользователем. Настройка диалога осу­ществляется через свойство:

(Pb) property Options: TColorDialogOptions;

TColorDialogOption = (cdFullOpen, cdPreventFullOpen, cdShowHelp);

TColorDialogOptions = set of TColorDialogOption;

Данные опции определяют:

cdFullOpen — полный показ диалога. В этом случае пользователь может выбрать не только один из цветов системной палитры, но и задать соб­ственный;

cdPreventFullOpen — запрещение полного показа диалога;

cdShowHelp — показ кнопки Help.

В диалоге пользователь может определить несколько (до 16) собственных цве­тов, которые доступны в свойстве:

(РЙ property CustomColors: TStrings;

Каждый из этих цветов представлен в свойстве CustomColors строкой вида

ColorA = SOffaO

где ColorA — условное название цвета (могут быть определены цвета с на­званиями от ColorA до ColorP), а справа от знака равенства стоит его шест­надцатиричное значение в формате RGB.

В случае нажатия кнопки ОК возвращаемое значение цвета содержится в свой­стве:

(РЬ) property Color: TColor;


3.7. Работа с файловой системой

Зачастую возможностей стандартных диалогов (компоненты TOpenDialog и TSaveDialog) недостаточно для реалшации замыслов программиста. Во многих современных коммерческих приложениях перед открытием файла есть возмож­ность получить его характеристики и предварительно просмотреть содержимое. Чтобы дать разработчикам доступ к таким функциям, в библиотеку VCL были включены по отдельности и все составные части стандартного диалога — списки имен дисков, каталогов, файлов и фильтров расширений. Если уста­новить между ними взаимные ссылки, то они будут работать вместе, как в TOpenDialog, безо всякого дополнительного программирования. Вместе с тем, можно описать и специфическую реакцию на изменения этих списков.

Кроме того, в эту группу компонентов включен TDirectoryOutline — пример настройки компонента TOutline на конкретное приложение. Он отображает файловую структуру в виде дерева и также может работать в связке с осталь­ными компонентами этого раздела.


Компонент TDriveComboBox

TObject—”TPersistent—>TComponent—TControl—>TWinControl->

->TCustornComboBox-”TDriveComboBox

Модуль FILECTRL

Страница Палитры компонентов System

Компонент представляет комбинированный список, содержащий информацию о имеющихся в системе устройствах. При инициализации приложения все они заносятся в этот список. Во время выполнения отображаются односимвольное имя устройства, метка в квадратных скобках и пиктограмма, соответствующая его типу (винчестер, сетевой диск, дисковод CD-ROM и т. п.):

TDriveType = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM) ;

К сожалению, функция, определяющая тип диска по его номеру или имени, недоступна программисту. Имеющаяся в API Windows функция GetDriveType не умеет распознавать dtCDROM и dtRAM и сообщает о них как о dtFixed.

Имя текущего диска соответствует значению свойства

property Drive: Char;

а имя с меткой (так, как это показывается в списке) — значению свойства:

property Text;

При этом текст метки может отображаться в верхнем или нижнем регистрах, в зависимости от значения свойства:

(Pb) property TextCase: TTextCase;

TTextCase = (tcLowerCase, tcUpperCase) ;

Пиктограмму типа диска можно получить, используя свойство списка Items.Objects — каждому устройству соответствует объект типа TBitmap.

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

(Pb) property OnChange: TNotifyEvent;

нужно предусмотреть соответствующий код, например:

procedure TFormI.DriveComboBoxlChange(Sender: TObject);

begin

DirectoryListBoxl.Drive := DriveComboBoxl.Drive ;

end;

Существует и более простой путь для такого связывания. Достаточно связать компонент-список дисков с компонентом-списком каталогов, используя свой­ство:

(Pb) property DirList: TDirectoryListBox;

Все изменения первого будут автоматически отслеживаться вторым. Компонент


TDirectoryListBox

TObject-”TPersistent->TComponent—”TControl->TWinControl—>

—>TCustomListBox->TDirectoryListBox

Модуль FILECTRL

Страница Палитры компонентов System

Компонент представляет список каталогов на текущем устройстве.

Устройство задается свойством

property Drive: Char;

а текущий каталог на нем — свойством:

property Directory: string;

При помощи метода

function GetIternPath(Index: Integer): string;

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

Если список каталогов связать со статическим текстом (меткой), пользуясь свойством

(Р)э) property DirLabel: TLabel ;

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

Метод

procedure OpenCurcent ;

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

Наконец, обновление содержимого списка у этого компонента осуществляет метод:

procedure Update;

Связать список каталогов с компонентом-списком файлов можно, обрабатывая событие:

(РЬ) property OnChange: TNotifyEvent;

или присвоив указатель на последний свойству:

(РЫ property FileList: TFileListBox;

В свойстве Items.Objects списка для каждого его элемента хранится объект типа TBitmap (пиктограмма, представляющая собой открытую или закрытую папку в зависимости от состояния каталога), доступный для чтения и записи.


Компонент TFileListBox

TObject->TPersistent-”TComponent->TControl-”TWinControl->

—>TCustomListBox->TFlleListBox

Модуль FILECTRL

Страница Палитры компонентов System

Компонент представляет список файлов в текущем каталоге. Аналогично предыдущим компонентам, свойства

property Drive: char;

property Directory: string;

содержат имя устройства и каталога на нем, а метод

procedure Update;

обновляет список файлов. Метод

procedure AppiyFilePath (const EditText: string);

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

Свойство

(РЫ property FileEdit: TEdit;

содержит указатель на редактирующий элемент, которому автоматически пере­дается имя текущего файла, которое также доступно как значение свойства:

property FileName: String;

В список можно включить не все файлы, а только обладающие атрибутами, определенными в свойстве:

(Pb) property FileType: TFileType;

TFileAttr = (ftReadOnly, ftHidden, ftSystem, fCVolumeID, ftDirectory, ftArchive, ftNormal) ;

TFileType = set of TFileAttr;

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

(Pb) property Mask: string;

Если свойство

(Pb) property MultiSelect: Boolean;

установлено в True, то в списке может быть одновременно выделено несколько

файлов.

При смене текущего файла возникает событие:

(РЙ property OnChange: TNotifyEvent;

Как и прежде, объекты Items.Objects в этом разделе представляют пиктограммы для разных типов файлов. Задает их показ значение True следующего свойства:

(Pb) property ShowGlyphs: Boolean;


Компонент TDirectoryOutline

TObject—>TPersistent->TComponent->TControl—”TWinControl—>

-TCustomControl—CustomGrid—TCustomOutline-TDirectoryOutline

Модуль DIROUTLN

Страница Палитры компонентов Samples

Этот компонент создан для отображения иерархического дерева файлов и каталогов текущего диска и, таким образом, может заменить сразу компонен­ты TDirectoryListBox и TFileListBox. Он имеет много общего с компонентом TOutline, отличие заключается в возможности работы только с файловой струк­турой.

Значения текущего диска, содержимое файловой системы которого отобража­ется в дереве, устанавливается посредством свойства:

property Drive: Char;

Текущий каталог соответствует значению свойства:

property Directory: TFileName;

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

Стиль отображаемых имен файлов и каталогов определяет свойство:

(РЬ) property TextCase: TTextCase;

TTextCase = (tcLowerCase, tcUpperCase, tcAsIs) ;

tcLowerCase — преобразование к нижнему регистру;

tcUpperCase — преобразование к верхнему регистру;

tcAsIs — без преобразования. Метод

function ForceCase(const AString: string): string;

может использоваться для пребразования строки, передаваемой в параметре AString, в соответствии с текущим стилем свойства TTextCase.


3.8. Вспомогательные компоненты

Таймер

TObject—>TPersistent—>TCoinponent—TTimer

Модуль EXTCTRLS

Страница Палитры компонентов System

Этот невизуальный компонент предназначен для уведомления программы об истечении определенных промежутков времени. Компонент инкапсулирует системный таймер Windows и работает через посылку сообщений WM_TIMER.

Свойство

(Pb) property Enabled: Boolean;

включает/выключает таймер, влияя на генерацию им событий. Будучи уста­новлен в Enabled, таймер начинает генерировать события OnTimer через интер­вал времени

(РЬ| property Interval: Word;

который измеряется в миллисекундах. После каждого истечения такого интер­вала инициируется обработчик, связанный с событием:

(Pb) property OnTimer: TNotifyEvent;

При этом программист получает очередной квант времени.

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