Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Создание методов с помощью визуальных средств





 

Синтаксический “скелет” метода может быть сгенерирован с помощью визуальных средств. Для этого нужно в Инспекторе Объектов дважды щелкнуть мышкой на пустой строчке напротив названия интересующего Вас события в требуемом компоненте, если эта строчка не пуста, то двойной щелчок на ней просто переместит Вас в окне Редактора Кода в то место, где находится данный метод.

Кратко остановимся на концепции объектно-ориентированного программирования. Определим базовые. Класс - это категория объектов, обладающих одинаковыми свойствами и поведением. При этом объект представляет собой просто экземпляр какого-либо класса. Например, в Delphi тип “форма” (окно) является классом, а переменная этого типа - объектом. Метод - это процедура, которая определена как часть класса и инкапсулирована (содержится) в нем. Методы манипулируют полями и свойствами классов (хотя могут работать и с любыми переменными) и имеют автоматический доступ к любым полям и методам своего класса. Доступ к полям и методам других классов зависит от уровня “защищенности” этих полей и методов. Методы можно создавать как визуальными средствами, так и путем написания кода вручную.

Задание 5.

Рассмотрим процесс создания программы CONTROL1, которая поможет нам изучить технику написания методов в Delphi.

1. Поместите с помощью мышки компонент Edit (находится на страничке “Standard” Палитры Компонентов) на форму. После этого ваша форма будет иметь вид, показанный на рис. 1. Чтобы создать метод, просто дважды щелкните справа от слова OnDblClick

Рис. 1.События компонента.

2. Теперь перейдите в Object Inspector, выберите страничку “Events” и дважды щелкните в пустой строчке напротив события OnDblClick. После этого в активизировавшемся окне Редактора Вы увидите сгенерированный “скелет” метода Edit1DblClick, являющегося реакцией на событие OnDblClick:

procedure TForm1.Edit1DblClick(Sender: TObject);

Begin

 

end;

 

Рис. 2. Общий вид формы.

3. После генерации процедуры Вы можете оставить ее имя таким, каким “установил” Delphi, или изменить его на любое другое (для этого просто введите новое имя в указанной выше строке Инспектора Объектов справа от требуемого события и нажмите Enter).

Теперь в окне Редактора Кода введите смысловую часть метода:

 

procedure TForm1.Edit1DblClick(Sender: TObject);

Begin

 

Edit1.Text:= 'Вы дважды щелкнули в строке редактирования';

end;

 

4. Сохраните программу.

5. Во время выполнения дважды щелкните на строке редактирования. Текст в этой строке изменится в соответствии с тем, что мы написали в методе Edit1DblClick: см. Рис. 3.

 

 

Рис. 3: Содержимое управляющего элемента TEdit изменяется после двойного щелчка по нему.

 

Листинг Программа CONTROL1 демонстрирует, как создавать и использовать методы в Delphi.

program Control1;

 

Uses

Forms,

Main in 'MAIN.PAS' {Form1};

 

Begin

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

 

Листинг: Головной модуль программы CONTROL1.

unit Main;

 

Interface

 

Uses

WinTypes, WinProcs,

Classes, Graphics, Controls,

Printers, Menus, Forms, StdCtrls;

 

Type

TForm1 = class (TForm)

Edit1: TEdit;

procedure Edit1DblClick(Sender: TObject);

end;

 

Var

Form1: TForm1;

 

Implementation

 

{$R *.DFM}

 

procedure TForm1.Edit1DblClick(Sender: TObject);

Begin

Edit1.Text:= 'Вы дважды щелкнули в строке редактирования';

end;

 

end.

 

После того, как Ваша программа загрузится в память, выполняются две строчки кода в CONTROL1.DPR, автоматически сгенерированные компилятором:

 

Application.CreateForm(TForm1, Form1);

Application.Run;

 

Первая строка запрашивает память у операционной системы и создает там объект Form1, являющийся экземпляром класса TForm1. Вторая строка указывает объекту Application, “по умолчанию” декларированному в Delphi, чтобы он запустил на выполнение главную форму приложения. В данном месте мы не будем подробно останавливаться на классе TApplication и на автоматически создаваемом его экземпляре - Application. Важно понять, что главное его предназначение - быть неким ядром, управляющим выполнением Вашей программы.

Как правило, у большинства примеров, которыми мы будем оперировать в наших уроках, файлы проектов .DPR практически одинаковы. Поэтому в дальнейшем там, где они не отличаются кардинально друг от друга, мы не будем приводить их текст. Более того, в файл .DPR, автоматически генерируемый Delphi, в большинстве случаев нет необходимости заглядывать, поскольку все действия, производимые им, являются стандартными.

Итак, мы видели, что большинство кода Delphi генерирует автоматически. В большинстве приложений все, что Вам остается сделать - это вставить одну или несколько строк кода, как в методе Edit1DblClick:

 

Edit1.Text:= 'Вы дважды щелкнули в строке редактирования';

 

Хотя внешний интерфейс программы CONTROL1 достаточно прост, она (программа) имеет строгую внутреннюю структуру. Каждая программа в Delphi состоит из файла проекта, имеющего расширение .DPR и одного или нескольких модулей, имеющих расширение .PAS. Модуль, в котором содержится главная форма проекта, называется головным. Указанием компилятору о связях между модулями является предложение Uses, которое определяет зависимость модулей.

Нет никакого функционального различия между модулями, созданными Вам в Редакторе, и модулями, сгенерированными Delphi автоматически. В любом случае модуль подразделяется на три секции:

Заголовок

Секция Interface

Секция Implementation

Таким образом, “скелет” модуля выглядит следующим образом:

 

unit Main; {Заголовок модуля}

interface {Секция Interface}

 

implementation {Секция Implementation}

end.

 

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

 

Передача параметров

 

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

Программа PARAMS демонстрирует, как использовать передачу параметров в методы Delphi. Кроме того, мы узнаем, как:

создавать свои собственные процедуры

добавлять процедуру в класс, формируя метод класса

вызывать одну процедуру из другой.

Программа PARAMS позволяет Вам вводить фразы в строки редактирования. После нажатия кнопки “Вызов процедуры WriteAll” строка из управляющего элемента EditSource скопируется в шесть управляющих элементов - строк редактирования, как показано на рис. 4.

 

Задание 6.

1. Разместите на форме семь компонентов Edit, переименуйте с помощью Инспектора Объектов седьмой компонент (Edit7) в EditSource.

2. Положите на форму компонент Button, и в Object Inspector измените его заголовок (свойство Caption) на “Вызов процедуры WriteAll” (естественно, Вы можете заменить его шрифт, цвет и т.д.).

Рис.4: Программа PARAMS позволяет вызовом одной процедуры заполнить 6 строк редактирования.

После завершения проектирования формы класс TForm1 будет выглядеть следующим образом:

 

TForm1 = class (TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

Edit6: TEdit;

EditSource: TEdit;

Button1: TButton;

end;

 

3. Добавьте метод, вызываемый по нажатию пользователем кнопки Button1. Это можно сделать двумя способами:

· Перейти в Инспекторе Объектов на страничку “Events” (предварительно выбрав компонент Button1 на форме), выбрать слово OnClick и дважды щелкнуть мышкой на пустой строчке справа от него

· Просто дважды щелкнуть на компоненте Button1 на форме.

 

Delphi сгенерирует следующую “заготовку”:

 

procedure TForm1.Button1Click(Sender: TObject);

Begin

 

end;

 

Цель программы PARAMS - научить Вас писать процедуры и передавать в них параметры. В частности, программа PARAMS реагирует на нажатие кнопки Button1 путем вызова процедуры WriteAll и передачи ей в качестве параметра содержимого строки редактирования EditSource (EditSource.Text).

 

procedure TForm1.Button1Click(Sender: TObject);

Begin

WriteAll(EditSource.Text);

end;

 

Важно понять, что объект EditSource является экземпляром класса TEdit и, следовательно, имеет свойство Text, содержащее набранный в строке редактирования текст. Как Вы уже, наверное, успели заметить, по умолчанию свойство Text содержит значение, совпадающее со значением имени компонента (Name) - в данном случае “EditSource”. Свойство Text Вы, естественно, можете редактировать как в режиме проектирования, так и во время выполнения.

4. Текст, который должен быть отображен в шести строках редактирования, передается процедуре WriteAll как параметр. Чтобы передать параметр процедуре, просто напишите имя этой процедуры и заключите передаваемый параметр (параметры) в скобки - вот так:

WriteAll(EditSource.Text);

Заголовок этой процедуры выглядит следующим образом:

 

procedure TForm1.WriteAll(NewString: String);

 

где указано, что передаваемый процедуре параметр NewString должен иметь тип String.

Вспомним, что задача процедуры WriteAll состоит в копировании содержимого строки редактирования EditSource в шесть других строк редактирования Edit1-Edit6. Поэтому процедура должна выглядеть следующим образом:

 

procedure TForm1.WriteAll(NewString: String);

Begin

Edit1.Text:= NewString;

Edit2.Text:= NewString;

Edit3.Text:= NewString;

Edit4.Text:= NewString;

Edit5.Text:= NewString;

Edit6.Text:= NewString;

end;

 

Поскольку процедура WriteAll не является откликом на какое-либо событие в Delphi, то ее нужно полностью написать “вручную”. Простейший способ сделать это - скопировать заголовок какой-либо уже имеющейся процедуры, исправить его, а затем дописать необходимый код.

Возвратимся еще раз к заголовку процедуры. Заголовок состоит из пяти частей:

 

procedure TForm1.WriteAll(NewString: String);

 

Первая часть - зарезервированное слово “ procedure ”; пятая часть - концевая точка с запятой “;”. Обе эти части служат определенным синтаксическим целям, а именно: первая информирует компилятор о том, что определен синтаксический блок “процедура”, а вторая указывает на окончание заголовка (собственно говоря, все операторы в Delphi должны заканчиваться точкой с запятой).

Вторая часть заголовка - слово “TForm1”, которое квалифицирует то обстоятельство, что данная процедура является методом класса TForm1.

Третья часть заголовка - имя процедуры. Вы можете выбрать его любым, по вашему усмотрению. В данном случае мы назвали процедуру “WriteAll”.

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

 

procedure Example(Param1: String; Param2: String);

 

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

 

TForm1 = class (TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

Edit6: TEdit;

EditSource: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

procedure WriteAll(NewString: String);

end;

 

В данном месте нет необходимости оставлять в заголовке метода слово “TForm1”, так как оно уже присутствует в описании класса.

 

Листинг показывает полный текст головного модуля программы PARAMS.

Листинг: Исходный код головного модуля программы PARAMS показывает, как использовать строки редактирования и как передавать параметры.

 

Unit Main;

Interface

 

Uses

WinTypes, WinProcs, Classes,

Graphics, Controls,

Printers, Forms, StdCtrls;

Type

TForm1 = class (TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

Edit6: TEdit;

EditSource: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

procedure WriteAll(NewString: String);

end;

Var

Form1: TForm1;

Implementation

 

{$R *.DFM}

 

procedure TForm1.WriteAll(NewString: String);

Begin

Edit1.Text:= NewString;

Edit2.Text:= NewString;

Edit3.Text:= NewString;

Edit4.Text:= NewString;

Edit5.Text:= NewString;

Edit6.Text:= NewString;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

Begin

WriteAll(EditSource.Text);

end;

 

end.

 

При экспериментах с программой PARAMS Вы можете попробовать изменить имена процедур и параметров. Однако, следует помнить, что ряд слов в Delphi являются зарезервированными, и употреблять их в идентификаторах (именах процедур, функций, переменных, типов, констант) не разрешается - компилятор сразу же обнаружит ошибку. К ним относятся такие слова, как “procedure”, “string”, “begin”, “end” и т.п.; полный же список их приведен в on-line справочнике Delphi.

Не старайтесь запомнить сразу все зарезервированные слова - компилятор “напомнит” Вам о неправильном их использовании выдачей сообщения типа “Identifier expected.” (Ожидался идентификатор, а обнаружено зарезервированное слово).

 

События в Delphi

 

Объекты из библиотеки визуальных компонент (VCL) Delphi, равно как и объекты реального мира, имеют свой набор свойств и свое поведение - набор откликов на события, происходящие с ними. Список событий для данного объекта, на которые он реагирует, можно посмотреть, например, в Инспекторе Объектов на странице событий. На самом деле, на этой странице представлен список свойств, которые имеют тип вроде TMouseMoveEvent и представляют собой процедуры-обработчики событий. Существует соглашение по названиям данных свойств. Например, OnDblClick соответствует двойному щелчку мыши, а OnKeyUp - событию, когда нажатая клавиша была отпущена. Среди набора событий для различных объектов из VCL есть как события, портируемые из Windows (MouseMove, KeyDown), так и события, порождаемые непосредственно в программе (DataChange для TDataSource).

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

Простейшие события, на которые иногда нужно реагировать - это, например, события, связанные с мышкой (они есть практически у всех видимых объектов) или событие Click для кнопки TButton. Предположим, что вы хотите перехватить щелчок левой кнопки мыши на форме. Чтобы сделать это - создайте новый проект, в Инспекторе Объектов выберите страницу событий и сделайте двойной щелчок на правой части для свойства OnClick. Вы получите заготовку обработчика данного события:

 

procedure TForm1.FormClick(Sender: TObject);

begin

 

end;

 

Напишите здесь следующее:

procedure TForm1.FormClick(Sender: TObject);

begin

MessageDlg('Hello', mtInformation, [mbOk], 0);

end;

 

Каждый раз, когда делается щелчок левой кнопки мыши над формой, будет появляться окно диалога (см. рис.1).

 

Рис.1: Диалог, появляющийся при щелчке мыши на форме.

 

Для получения дополнительной информации, вы должны вернуться в Инспектор Объектов и создать обработчик события OnMouseDown:

 

procedure TForm1.FormMouseDown(Sender: TObject;

Button: TMouseButton;

Shift: TShiftState;

X, Y: Integer);

begin

Canvas.TextOut(X, Y, 'X='+IntToStr(X)+' Y='+IntToStr(Y));

end;

 

Запустите программу, пощелкайте мышкой на форме:

 

Рис.2 Общий вид работающего приложения.

 

В Delphi очень просто отвечать на события. Например, можно создать обработчик для OnKeyDown (нажата клавиша):

 

procedure TForm1.FormKeyDown(Sender: TObject;

var Key: Word; Shift: TShiftState);

begin

MessageDlg(Chr(Key), mtInformation, [mbOk], 0);

end;

 

 

Понимание событий

 

· Windows является системой ориентированной на события;

· События в Windows принимают форму сообщений;

· В недрах VCL Delphi сообщения Windows обрабатываются и преобразуются в более простую для программиста форму;

· Обработка событий в Delphi сводится к написанию для каждого объекта своих обработчиков;

· События в программе на Delphi вызываются не только сообщениями Windows, но и внутренними процессами.

Если посмотреть на DefWindowProc в справочнике по Windows API, то можно увидеть следующее определение:

 

function DefWindowProc(Wnd: HWnd; Msg, wParam: Word;

lParam: LongInt);

 

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

Вторая часть сообщения имеет длину 16 бит и сообщает, что за событие произошло. Например, если нажата левая кнопка на мыши, то переменная Msg содержит значение WM_LBUTTONDOWN. Существуют десятки различного типа cообщений и они называются вроде WM_GETTEXT, WM_HSCROLL, WM_GETTEXTLENGTH и т.п. Список всех сообщений можно видеть в справочнике по Windows API (on-line help).

Последние две переменные, длиной 16 и 32 бита, называются wParam и lParam. Они сообщают программисту важную дополнительную информацию о каждом событии. Например, при нажатии кнопки мыши, lParam содержит координаты указателя мыши.

Одна из хитростей заключается в том, как выделить нужную информацию из этих переменных. В большинстве случаев Delphi освобождает вас от необходимости выполнять данную задачу. Например, в обработчике события OnMouseDown для формы вы просто используете координаты X и Y. Как программисту, вам не нужно прилагать усилия для получения сообщения и связанных с ним параметров. Все, что связано с событиями, представлено в простом и непосредственном виде:

procedure TForm1.FormMouseDown(Sender: TObject;

Button: TMouseButton;

Shift: TShiftState;

X, Y: Integer);

 







Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...

Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...

Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.