Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа
Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.
TPrintScale = (poNone, poProportional, poPrintToFit) ;
poNone -- отсутствует;
poProportional -- производится изменение масштаба в пропорции, равной соотношению точек на дюйм у формы и принтера;
poPrintToFit -- аналогично предыдущему, но осуществляется приведение размера изображения к размеру листа.
Свойства форм MDI
На базе TForm можно создавать специфические виды форм. Перечисленные ниже свойства и методы работают только в главных окнах приложений MDI.
(ро) property ClientHandle: HWND; procedure Arrangelcons; |
Содержит дескриптор клиентского окна (для главного окна MDI). | |
Упорядочивает расположение свернутых в значок дочерних форм MDI. | ||
procedure Cascade; |
Располагает дочерние формы MDI каскадом. | |
procedure Tilet-property TileMode: TTiieMode; TTileMode = (tbHorizontal, tbVertical) ; |
|
Располагает дочерние формы MDI мозаикой. Стиль определяется свойством TileMode. |
Определяет стиль расположения дочерних форм -- вертикальный или горизонтальный. | ||
| ||
Передает фокус следующей форме в списке дочерних форм. | ||
procedure Previous; ($o) property ActiveMDIChild: TForm; |
Передает фокус предыдущей форме в списке дочерних форм. | |
Содержит указатель на активную дочернюю форму. | ||
(Ro) property MDIChildren[I: Integer]: TForm; |
Определяет количество дочерних форм. | |
Содержит указатель на 1-тую дочернюю форму. | ||
(Pb) property WindowMenu: TMenuItem; |
Указывает на тот пункт меню, к которому достраивается список имен дочерних форм. | |
Функции из модуля FORMS В модуле FORMS (где описан класс Они важны для понимания взаимодейс! |
Топп) содержится также ряд функций. пвия формы и ее дочерних компонентов. | |
function GetParentForm(Control: TControl) : TForm; |
Возвращает указатель на форму, которой принадлежит элемент управления Control. | |
function ValidParentForm(Control: TControL): TForm; |
Делает то же, что и предыдущая функция, при этом, если форма не найдена, возникает исключительная ситуация EInvalidOperation. | |
function DisableTaskWindows( |
Переводит в неактивное состояние все окна, кроме ActiveWindow. Эта функция возвращает копию исходного списка окон (TaskWindowList). |
procedure EnableTaskWindows(WindowList: Pointer); |
Используется в паре с предыдущей функцией. Получив созданный ею список окон, переведенных в неактивное состояние, EnableTaskWindows активизирует все окна (через вызов функции API EnableWindow) и очищает список. Такой прием необходим при создании модальных окон и управлении ими, например, внутри метода MessageBox. |
function AllocateHWnd(Method: TWndMethod) : HWND; |
Создает экземпляр окна вспомогательного класса TPUtilWindow (не путать с классом как понятием объектно-ориентированного программирования), обработчиком сообщений у которого служит метод Method. |
procedure DeallocateHWnd(Wnd: HWND) ; |
Уничтожает созданный предыдущей функцией экземпляр окна. |
function IsAccel(VK: Word; const Str: string): Boolean; |
Проверяет, является ли символ VK акселератором для текстовой строки Str. Функция возвращает True, если в строке содержится сочетание & ' VK '. |
function KeysToShiftState(Keys: Word) : TShiftState; |
Преобразует флаги состояния клавиатуры и кнопок мыши из типа MKSHIFT, MKLBUTTON в принятый в Delphi тип TShiftState. |
function KeyDataToShiftState(KeyData: Longint): TShiftState; |
Производит аналогичное преобразование из виртуальных кодов клавиш Windows (например, типа VKSHIFT). |
Приложение и среда его выполнения
Над всеми формами и компонентами стоит объект, отражающий собственно приложение, -- это объект Application (класса TApplication). Он держит в руках все нити управления другими объектами -- создание и уничтожение форм, обработку сообщений, обслуживание исключительных ситуаций.
Помимо форм и принадлежащих им компонентов, "действующими лицами" для приложения служат несколько других важных объектов. К ним относятся дисплей Screen (класс TScreen), принтер Printer (класс TPrinter) и буфер обмена (класс TClipboard). Все они являются глобальными: именно на их использование рассчитаны различные методы многих компонентов. Создание этих объектов происходит автоматически при запуске приложения, поэтому ни при каких обстоятельствах программистом не должны создаваться другие их экземпляры.
Для хранения параметров приложения вы можете создать объекты, соответствующие файлам инициализации (TIniFile).
Объект Application
TApplication = class(TComponent)
На уровне методов и свойств этого компонента осуществляется управление выполняемым приложением. Он отсутствует в Палитре компонентов, и все его свойства должны изменяться из программы.
Поводов для обращения к TApplication может быть два. Во-первых, это получение информации о приложении, общей для всех ее форм. Во-вторых, это управление процессом выполнения приложения и входящими в него формами. Эти методы тесно связаны с Windows, и работа с многими из них требует определенного опыта.
К информационным могут быть отнесены следующие свойства:
property Title: string; |
Имя приложения. Под этим именем оно отображается в TaskManager, TaskBar и т. п. По умолчанию равно имени проекта. |
(Ro) property ExeName: string; |
Имя файла с расширением .ЕХЕ, содержащего приложение (то же самое имя возвращает функция ParamStr(0)). |
property Icon: TIcon; |
Значок приложения. Первоначально, при запуске, значок загружается из ресурса с именем MAINICON в файле ресурсов проекта. |
Теперь рассмотрим методы и свойства в последовательности, соответствующей "жизненному циклу" приложения. При запуске на выполнение Application сначала создает и инициализирует формы приложения при помощи метода:
procedure CreateForm(FormClass: TFormClass; var Reference);
Параметр Reference будет указывать на созданный экземпляр формы класса FormClass.
С обращений к этому методу начинается код, содержащийся в файле с расширением .DPR; при этом в нем создаются только те формы, которые содержатся в списке Auto-Create Forms в опциях проекта. Метод работает таким образом, что в случае, если указатель на главную форму равен nil, то созданная форма становится главной. Из этого следует, что главной всегда будет первая из создаваемых форм. Указатель на нее описан в свойстве:
(Ro) property MainForm: TForm;
Здесь нужно сделать специальную оговорку. Помимо главной и других форм у приложения есть еще одно -- невидимое -- окно. Именно оно является по-настоящему главным и именно в нем обрабатываются все сообщения Windows, управляющие состоянием приложения. Его дескриптор доступен в свойстве:
property Handle: HWnd;
После создания всех форм метод
procedure Run;
запускает цикл обработки сообщений главной формы приложения. Его код очень прост и выглядит следующим образом:
procedure TApplication.Runt-begin
AddExitProc(DoneApplication);
if FMainForm о nil then begin
FMainForm.Visible := True;
repeat
HandleMessage until Terminated;
end;
end;
Вызываемый в нем метод
procedure HandleMessage;
извлекает следующее сообщение из очереди и передает его на обработку следующим образом:
procedure TApplication.HandleMessage;
begin
if not ProcessMessage then Idle;
end;
Метод ProcessMessage ищет нужный обработчик сообщения и передает ему управление. Назначение метода Idle поясняется ниже.
О поступлении сообщения оповещает вызов обработчика события:
property OnMessage: TMessageEvent;
TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;
Используя обработку OnMessage, программист может переопределить обработку любого (или любых) сообщений (кроме WM_QUIT и сообщений системы оперативной подсказки). Для этого, выполнив внутри метода необходимые действия, в параметре Handled нужно вернуть True. Тогда сообщение не поступит в функцию окна приложения. Необходимо быть крайне осторожным, подменяя системные обработчики сообщений.
Существует другой способ перехвата сообщений. Для этого нужно написать метод, имеющий следующий rim
TWindowHook = function (var Message: TMessage): Boolean of object;
и зарегистрировать его в качестве перехватчика сообщений приложения с помощью метода:
procedure HookMainWindowfHook: TWindowHook);
Если одна из процедур-перехватчиков типа TWindowHook в цепочке вернет True, это будет означать, что сообщение обработано.
Когда необходимость в перехвате сообщений отпадет, созданный вами метод нужно исключить из списка при помощи вызова метода:
procedure UnhookMainWindow(Hook: TWindowHook);
Если сообщений в очереди нет, то может быть выполнена "фоновая" работа, предусмотренная программистом. Для этого нужен обработчик события, которое генерируется в этой ситуации внутри метода Idle в HandleMessage:
property Onldle: TIdleEvent;
TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
Обработчик должен вернуть признак потребности в последующих событиях Onldle в булевом параметре Done. Если "все сделано" и он присваивает Done значение True, то приложение переходит в режим ожидания сообщения и обработчик не вызывается до возникновения следующей ситуации отсутствия сообщений в очереди. Если возвращается значение False, метод будет вызываться все время при отсутствии сообщений.
Пример обработки сообщений OnMessage и Onldle имеется на дискете (название проекта MOVLINES). Их использует программа сохранения экрана, которая вызывается системой по истечении некоторого времени, в обработчике Onldle она рисует на экране линии и прекращает работу, когда обработчик OnMessage получает сообщение от мыши или клавиатуры.
Как видно из приведенного кода метода Run, сообщения обрабатываются вплоть до установки флага:
(Ro) property Terminated: Boolean;
Такой флаг устанавливается при получении собщения WM_QUIT. Используя его, можно вставить свои действия на завершающем этапе (после окончания обработки сообщений перед вызовом деструктора Application). Свойство это доступно только для чтения, поэтому завершить приложение можно, вызвав метод
procedure Terminate;
который и посылает сообщение WM_QUIT. Для обработки сообщений предназначен также метод
procedure ProcessMessages;
который возвращает управление тогда, когда обработаны все сообщения в очереди. Пример:
procedure TApplication.ProcessMessages;
begin
while ProcessMessage do;
end;
Одна или более форм приложения могут иметь статус fsStayOnTop, то есть постоянно находятся поверх других форм (не имеющих этого статуса). Для того, чтобы на время отключить его действие, применяется пара методов:
procedure Normal!zeTopMosts;
-- отключает статус;
procedure RestoreTopMosts;
-- восстанавливает его.
Эти методы могут быть полезными, когда необходимо вывести информацию поверх формы со статусом fsStayOnTop. В самом объекте Application они вызываются соответственно при деактивизации/актнвизации приложения, сво-рачивании/разворачивании главной формы.
Активизация и деактивизация происходят тогда, когда пользователь или приложение осуществляют переключение между задачами Windows. Приложение способно отслеживать эти моменты. При активизации и деактивизации приложения возникают события:
property OnActivate: TNotifyEvent;
property OnDeactivate: TNotifyEvent;
Текущее состояние активности можно узнать в свойстве:
property Active: Boolean;
События, возникающие соответственно при сворачивании и восстановлении главной формы приложения, также относятся к объекту Application:
property OnMinimize: TNotifyEvent;
property OnRestore: TNotifyEvent;
Для программного выполнения таких операций есть два метода:
procedure Minimize;
procedure Restore;
У Application есть метод:
procedure BringToFront;
У формы также есть метод с этим названием, который показывает форму поверх остальных и активизирует ее. Отличие этих методов в том, что Form. BringToFront активизирует вызвавшую его форму, а метод Application.BringToFront -- ту форму, которая была активна последней.
Во время выполнения приложения могут возникать исключительные ситуации. При их возникновении обработку осуществляет метод:
procedure HandleException(Sender: TObject);
Стандартная обработка подразумевает вызов метода
procedure ShowException(E: Exception);
который отображает диалоговое окно с именем приложения в заголовке и сообщением об ошибке (содержащемся в параметре -- объекте Е класса Exception).
Стандартную обработку можно перекрыть (во всех случаях, кроме обработки исключительной ситуации EAbort), определив обработчик события:
property OnException: TExceptionEvent;
TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
Целый ряд методов управляет системой помощи. Для ее нормального функционирования в первую очередь необходимо, чтобы было определено имя файла помощи в свойстве:
property HelpPile: string;
Если оно определено, то вызов помощи можно осуществить тремя видами запросов, которьм соответствуют методы:
function HelpContext(Context: |
Осуществляет вызов помощи по заданному контексту. |
function HelpJump(const JumpID: string): Boolean- |
Осуществляет вызов помощи для контекстной строки JumpID. Например, вызов Application.HelpJump('HelpJump ') даст подсказку по этой функции. |
function HelpConunand (Command: Word; Data: Longint): Boolean; |
Посылает системе помощи команду Command с параметром Data. Для описания типов команд см. справку по процедурам WinHelp API Windows. |
Все функции возвращают True, если файл Help определен, и произошел вызов приложения WinHelp.
Если вы хотите перехватить обращение к справочной системе, то необходимо написать обработчик события:
property OnHelp: THelpEvent;
THelpEvent = funcс ion(Command: Word; Data: Longint;
var CallHelp: Boolean):Boolean of object;
В нем вы можете предусмотреть предоставление собственной помощи пользователю. Результат True функции означает успех (помощь предоставлена). Если после обработки события по-прежнему нужно вызвать систему помощи Windows (через WinHelp), то в параметре CallHelp нужно вернуть True.
Метод
function MessageBox(Text, Caption: PChar; Flags: Word): Integer;
содержит вызов стандартного диалогового окна с тем же названием и назначением.
Если вы хотите использовать в составе Delphi и вызывать из форм приложения диалог, созданный с помощью других средств программирования, то дескриптор такого диалога должен быть присвоен свойству:
property DialogHandle: HWnd;
Подробные правила работы с этим свойством описаны в документации разработчика компонентов Delphi.
Наконец, упомянем о системе оперативной подсказки. У приложения имеется собственный текст подсказки, определяемый свойством:
property Hint: string;
В отличие от подсказок для других компонентов, он не отображается при остановке мыши. Его содержимое обычно передается строке состояния.
Целый ряд методов и свойств объекта, отвечающих за реализацию системы оперативной подсказки, подробно описан в соответствующем разделе. Поэтому они здесь только перечисляются:
property OnHint: TNotifyEvent;
property ShowHint: Boolean;
property HintPause: Integer;
property OnShowHint: TShowHintEvent ;
property HintColor: TColor;
procedure CancelHint;
Объект Clipboard
TClipboard = class(TPersistent)
Объект TClipboard представляет программисту интерфейс с буфером обмена (Clipboard) Windows. При включении в проект модуля CLIPBRD этот глобальный объект создается автоматически и доступен приложению в течение всего цикла.
Методы открытия и закрытия буфера обмена