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

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

Содержание


Компонент TCalendar
Свойства форм MDI
Подобный материал:
1   2   3   4   5   6   7   8   9   10   11

Компонент TCalendar

TObjectTPersistentTComponent-”TControl->TWinControl—>

—>TCustomControl—”TCustomGr id—”ТСа lends r

Модуль CALENDAR

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

Компонент представляет собой календарь. Текущие год, месяц и день в календаре соответственно задаются свойствами:

J property Year: Integer;

property Month: Integer;

property Day: Integer;

Внешний вид его определяется свойствами:

(Pb) property GridLineWidth;

— толщина разграничивающих линий;

(Pa property Color;

— цвет панели компонента.

День, с которого начинается отображение недели, определяется свойством:

(Pb) property StartOfWeek: TDayOfWeek;

TDayOfWeek = 0..6 ;

О определяет неделю, принятую в англоязычных странах (первый день недели — воскресенье), 1 задает более привычный порядок — с понедельника. Следу­ющие значения последовательно смещают начало недели дальше.

Свойство

(pVl property UseCurrentDate: Boolean;

возвращает True в случае совпадения текущих дат компонента и системных часов компьютера.

Свойство

property CalendarDate: TDateTime;

содержит текущую дату в формате TDataTime. Все даты текущего месяца размещаются в векторном свойстве:

(Ro) property CellText[ACol, ARow: Integer]: string;

Методы

procedure NextMonth;

procedure NextYear;

procedure PrevMonth;

procedure PrevYear;

соответственно увеличивают или уменьшают на единицу значение текущего месяца или года. Метод

procedure UpdateCalendar;

обновляет текущую дату календаря.


3.9. Форма и ее свойства

Последним в этом разделе будет рассмотрен самый важный, особый компо­нент — форма. Форма в Delphi — это синоним окна. В библиотеках для Windows (MFC, OWL) существуют отдельные классы для каждой важной разновидности окон — диалогового окна, клиентских и дочерних окон MDI и так далее. Разработчики VCL пошли по новому пути, объединив в одном классе свойства и методы всех этих разновидностей. Специализация при этом все равно осталась — она определяется свойством:

(РЬ) property PcrmStyle: TPormStyle;

TPormStyle = [fsNoririal, fsMDIChild, fsMDIForm, fsStayOnTop) ;

fsNormal — обычное окно;

fsMDIChild — дочернее окно приложения MDI;

fsMDIForm — главное окно MDI;

fsStayOnTop — окно, остающееся поверх других даже в неактивном со­стоянии. (В данном случае это касается только других окон приложения).

Такая разновидность, как диалоговое окно, не имеет собственного стиля. Каким образом реализуются его особенности, описано ниже.


У TForm есть методы, которые имеют смысл только для некоторых из стилей FormStyle. Рассмотрим сначала общие свойства и методы формы, а затем — специфические.

Набор пиктограмм в заголовке окна описывается свойством:

(РЬ) property Borderlcons: TBorderIcons;

TBorderIcon = (biSystemMenu, biMiniinize, biMaximize);

TBorderIcons = set of TBorderIcon;

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

Обрамление формы задается свойством:

(Pb) property BorderStyle: TFormBorderStyle ;

TPormBorderStyle = (bsNone, bsSingle, bsSizeable, bsDialog);

Помимо двух стандартных стилей обрамления (bsNone и bsSingle) у формы есть еще два своих типа (bsSizeable и bsDialog). Эти возможности стандартны для Windows. Особенности реализации здесь заключаются в том, что стиль обрамления может изменяться в процессе выполнения программы.

Каждое окно может находиться в одном из состояний — нормальном, свер­нутом (минимизированном) и развернутом (максимизированном), что опреде­ляется свойством:

(рта property WindowState: TWindowState;

TWindowState = [wsNormal, wsMinimized, wsMaximized);

Значение этого свойства можно изменить как на этапе разработки, так и во время исполнения.

Окно в свернутом состоянии на экране отображается значком формы, который задается в свойстве:

(Pb) property Icon: TIcon;

Значок главной формы приложения идентифицирует само приложение в TaskManager Windows 3.11 и Windows NT или TaskBar Windows 95. Если он не определен, то используется значок приложения (объекта Application).

Каждая форма может иметь главное и всплывающее меню. Главное меню определяется свойством:

(РЬ| property Menu: TMainMenu;

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

Всплывающее меню формы представлено свойством:

(Pb) property PopupMenu: TPopupMenu;

Форма может содержать объекты OLE. Для этого она должна быть зарегистрирована в качестве их приемника. Свойство

property DropTarget: Boolean;

устанавливает, может ли форма быть приемником объектов OLE. Для разме­щения подменю возможностей сервера OLE можно выделить отдельный пункт:

(Pb) property ObjectMenuItem: TMenuItem;

Этот пункт будет активизироваться при получении фокуса компонентом TOLEContainer.

Создание формы

Правила создания форм на этапе выполнения задаются в опциях проекта (страница Forms). Все формы, которые вы включили в состав приложения на этапе визуального проектирования, могут быть автоматически созданы при его запуске, для этого их имена должны находиться в списке Auto-Create Forms. Все прочие формы (список Available Forms) нужно создавать самосто­ятельно, вызвав конструктор Create или метод Application.CreateForm.

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

(Pb) property OnCreate: TNotifyEvent;

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

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

Для показа и активизации прочих форм необходимо вызвать одну из мето­дов — Show или ShowModal. Последний используется только для модальных форм, работа с которыми описана ниже. При вызове метода

procedure Show;

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

(РЬ) property OnShow: TNotifyEvent;

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

(Pa property Position: TPosition;

TPosition = (poDesigned, poDefault, poDefaultPosOnly,

poDefaultSizeOnly, poScreenCenter) ;

poDefault — принять положение и размеры, определенные средой Windows по умолчанию;

poDefaultPosOnly — принять только положение, определенное средой Windows по умолчанию;

poDefaultSizeOnly — принять только размеры, определенные средой Windows по умолчанию;

poScreenCenter — разместить окно по центру экрана (при этом размеры будут равны половине ширины и высоты экрана в пикселах, а для дочерней формы MDI — половине соответствующих размеров клиентского окна);

poDesigned — принять те значения положения и размеров, которые были определены во время разработки приложения.

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

(Plo) property OnPaint: TNotifyEvent;

Для этого он должен использовать канву формы:

(Ro) property Canvas: TCanvas;

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

procedure TFormI.FormCreate(Sender: TObject) ;

begin

gr := TBitmap.Create ;

gr.LoadFromFile('c:\delphi\iinages\splash\256color\chemical.b(np') ,-end;

procedure TFormI.FormPaint(Sender: TObject);

begin

Canvas.Draw(0,0,gr) ;

end;

После отрисовки форма получает фокус ввода сообщений от системных уст­ройств, т. е. становится активной. Об этом извещает наступление события:

(Pb) property OnActivate: TNotifyEvent;

Узнать, активна ли форма, можно путем обращения к ее свойству:

(Ro) property Active: Boolean;

При активизации формы ей посылается сообщение о настройке ее размеров (WM_SIZE). После того, как размеры изменены, возникает событие

(Pb) property OnResize: TNotifyEvent;

которое может быть использовано для переустановки размеров как формы, так и всех элементов управления на ней. В следующем примере форма наст­раивает размеры своей клиентской области точно по размерам содержащейся в ней таблицы DrawGridI, которая, в свою очередь, тоже пытается получить максимально возможный в данной области размер:

procedure TFormI.FormResize(Sender: TObject);

var i,w,h : integer;

begin

if WindowState=wsNorinal then with DrawGridI do

begin

w := (ClientWidth - ColCount*GridLineWidth) div ColCount;

if w < 1 then w := 1;

h := (ClientHeight - RowCount*GridLineWidth) div RowCount;

if h < 1 then h := 1;

for i := 0 to ColCount-1 do ColWidths[i] := w;

for i := 0 to RowCount-1 do RowHeights [i] := h;

Inc(w, GridLineWidth);

Inc(h, GridLineWidth);

if (ClientWidth <> w * ColCount) or

(ClientHeight oh* RowCount) then

begin

Forml.ClientWidth := w * ColCount + 2*GridLineWidth;

Forml.ClientHeight := h * RowCount + 2*GridLineWidth;

end;

end;

end;

Здесь нужно обратить внимание на два момента. Во-первых, изменение раз­меров внутри обработчика OnResize влечет за собой как минимум один новый вызов этого события, поэтому возможны неоднократные перерисовки и изме­нения размеров. Во-вторых, чтобы этот процесс рано или поздно остановился, нужно ввести условия, при достижении которых размеры изменяться не будут, иначе наступит зацикливание.

После изменения размеров вновь возникает событие OnPaint.

Разумеется, описанные выше события (OnPaint, OnActivate и OnShow) возникают не только при инициализации формы, а и, к примеру, при каждом переключении между приложениями или формами в приложении. Последние два действия имеют парные события, возникающие при утере фокуса или исчезновении формы с экрана:

(pb) property OnDeactivate: TNotifyEvent;

(Pb) property OnHide: TNotifyEvent;

Метод

procedure Hide;

дает возможность сделать форму невидимой (изменяет свойство Visible). Во всех случаях, когда форма становится невидимой, возникает событие OnHide.

С помощью пары методов Show/Hide обычно управляют из главной формы показом прочих форм. Будьте внимательны! При вызове Hide для главной формы подумайте о том, каким путем вы собираетесь после этого снова визуализировать ее.

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

procedure Close;

В первую очередь внутри Close вызывается метод:

function CloseQuery: Boolean;

Для закрытия формы необходимо, чтобы он вернул True. Этот метод — прямой аналог метода CanClose в библиотеке OWL. Для проверки на воз­можность закрытия он вызывает обработчик события:

(Pb) property OnCloseQuery: TCloseQueryEvent;

TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;

Здесь вы должны проверить возможность закрытия формы и вернуть нужное значение в параметре CanClose (который изначально имеет значение True). Например:

procedure TPorm2.FormCloseQuery(Sender: TObject;

var CanClose: Boolean);

begin

if Memo 1.Modified then case MessageDlgf' Save text?', mtWarning, mbYesNoCancel, 0) of

mrYes: Memol.Lines.SaveToFile('MYTEXT.TXT ') ;

mrCancel: CanClose := False;

end;

end;

Таким образом, если обработчик события OnCloseQuery не описан, возвраща­ется True (форму можно закрыть).

Для форм стиля fsMDIForm (родительских окон MDI) сначала должны за­крываться все дочерние формы (вызываются их методы CloseQuery). Если хотя бы одна из них возвращает False, метод тут же возвращает False, и обработчик события OnCloseQuery закрываемой родительской формы управления не полу­чает.

Затем метод Close вызывает обработчик следующего события

(Pb) property OnClose: TCloseEvent;

TCloseEvent = procedure(Sender: TObject; var Action : TCloseAction) of object;

TCloseAction = (caNone, caHide, caFree, caMinimize);

что позволяет определить дальнейшую реакцию. Дело в том, что закрытие можно реализовать различными способами, в зависимости от значения пара­метра Action:

caNone — не делать ничего;

caHide — сделать форму невидимой (скрыть);

caMinimize — свернуть форму в значок;

caFree — уничтожить форму, вызвав ее деструктор.

Перед вызовом OnClose в параметр Action засылается значение caHide. Ис­ключение составляют дочерние формы MDI, для которых засылается значение caMinimize или caNone в зависимости от возможности их сворачивания.

Если обработчик вернул значение caNone, форма не закрывается. Таким путем можно продублировать OnCloseQuery.

При закрытии главной формы приложения любое отличное от caNone значение вызывает завершение приложения. Для формы, не являющейся главной, зна­чения caHide и caMinimize позволяют соответственно скрыть и свернуть ее в значок. Выбор значения caFree влечет за собой вызов деструктора путем обращения к методу:

procedure Release;

Последним при уничтожении формы инициализируется событие:

(Pb) property OnDestroy: TNotifyEvent;

Это событие является парным по отношению к OnCreate; обработчик его вызывается в деструкторе формы. Здесь программист может предумотреть необходимые действия при уничтожении формы, к примеру, записать значения в файл JNI.

Модальные формы

Компонент TForm в VCL объединяет в себе свойства и может играть роль как главного окна программы, так и диалогового (модального) окна. Чтобы форма работала в качестве диалога, вместо метода Show нужно вызвать метод:

function ShowModal: Integer;

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

(Rb) property ModalResult: TModalResult ;

не изменит своего значения, первоначально нулевого. Напомним, что это свой­ство формы меняется непосредственно с помощью некоторых видов принад­лежащих ей кнопок (см. раздел "Кнопки"). Если для модальной формы прог­раммистом вызывается метод Close, то ее единственным действием является то, что свойству ModalResult присваивается значение mrCancel (без вызовов OnCloseQuery и OnClose).

Как только получено ненулевое значение ModalResult, вызьшается метод:

procedure CloseModal;

Его роль такая же, как у Close для обычной формы: сначала вызов CloseQuery, затем — генерация события OnClose. Установив в параметре Action этого события значение caNone, можно обнулить ModalResult и тем самым воспре­пятствовать закрытию. В противном случае форма деактивизируется и делается невидимой.

Этот набор методов неприменим к дочерним формам MDI (со стилем fsMDIChild).


3.10. Управление дочерними элементами

Если вы хотите передать фокус одной из форм проекта, используйте метод этой формы:

procedure SetFocus;

Форма при этом обязана быть видимой и активной (Enabled), иначе создается исключительная ситуация EInvalidOperation.

Два метода отвечают за передачу фокуса между визуальными компонентами в составе формы. Метод

procedure FocusControl(Control: TWinControl);

передает фокус элементу управления Control, а метод

procedure DefocusControl(Control: TWinControl; Removing: Boolean);

отбирает его. Параметр Removing, равный True, означает, что элемент при этом должен передать фокус своему родительскому элементу. Напомним, что для элементов в эти моменты генерируются события OnEnter и OnExit. Имеющий фокус элемент определяется свойством:

(РЁ) property ActiveControl: TWinControl;

Оно может принимать значение nil, если фокус имеет сама форма.

В компоненте TForm доступен еще один метод, по предназначению сходный с FocusControl:

function SetFocusedControl(Control: TWinControl): Boolean;

Этот метод вызывается внутри многих компонентов (находящихся вне модуля FORMS) при получении фокуса ввода — именно поэтому он находится в секции public. Программисту не стоит его использовать, т. к. он не доку­ментирован.

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

(pb) property HorzScrollBar;

(Pis) property VertScrollBar;

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

(Pb) property AutoScroll;

установлено в значение True. Следующий метод помещает элемент управления AControl в видимую часть клиентской области:

procedure ScrollInView(AControl: TControl);

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

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

(Pb) property KeyPreview: Boolean;

в True означает, что поступающие от клавиатуры сообщения будут сначала поступать форме, и только затем — элементу. Пример использования этой возможности приведен в разделе "Обработка событий от мыши и клавиатуры".

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

(Pb) property PixelsPerInch: Integer;

Вы можете присвоить этому свойству любое значение, превышающее 36, либо 0.

При ненулевом значении этого свойства во время создания форма и все ее элементы масштабируются в некоторой пропорции. Эта пропорция равна отно­шению числа точек на дюйм на экране в данный момент к этому же числу во время разработки. Если же PixelsPerInch = 0, никакого масштабирования не производится.

Чтобы не изменять PixelsPerInch напрямую, разработчики предусмотрели дру­гое — обобщающее — свойство:

(Pb) property Scaled: Boolean;

При установке Scaled в False PixelsPerInch обнуляется, в True — получает новое значение, равное числу точек на дюйм на экране в текущем видеорежиме.

Нужно учитывать, что если вы хотите сделать приложение, независимое от разрешения экрана, то значение свойства Position у всех его форм должно отличаться от poDesigned — иначе они будут появляться в разных местах (в том числе и за пределами экрана).

Внешний вид формы и ее составных частей можно отобразить не только на экране. Метод

function GetForrnImage: TBitmap;

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

procedure Print;

Полученное изображение передается объекту TPrinter (см. ниже), при этом его масштабирование производится в соответствии со значением свойства:

(Pb) property PrintScale: TPrintScale;

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: HWnd) : Pointer;

Переводит в неактивное состояние все окна, кроме 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).


3.11. Приложение и среда его выполнения

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

Помимо форм и принадлежащих им компонентов, "действующими лицами" для приложения служат несколько других важных объектов. К ним относятся дисплей Screen (класс TScreen), принтер Printer (класс TPrinter) и буфер обмена (класс TClipboard). Все они являются глобальными: именно на их использо­вание рассчитаны различные методы многих компонентов. Создание этих объектов происходит автоматически при запуске приложения, поэтому ни при каких обстоятельствах программистом не должны создаваться другие их эк­земпляры.

Для хранения параметров приложения вы можете создать объекты, соответст­вующие файлам инициализации (TIniFile).