Справочник по компонентам Delphi. Часть 3
Страница 8. Создание формы


 

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

Правила создания форм на этапе выполнения задаются в опциях проекта (страница 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;

 

 
« Предыдущая статья   Следующая статья »