Свойства, методы и события в delphi
Особенности управления свойствами визуальных компонент в режиме выполнения. Текстовый редактор для ввода строк. Создание методов с помощью визуальных средств. События в Delphi. Ключевая цель среды визуального программирования. Обработка сообщений Windows.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 03.03.2018 |
Размер файла | 264,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
1. Управление свойствами визуальных компонент в режиме выполнения
Каждый компонент, помещаемый на форму, имеет свое отражение в окне Инспектора Объектов (Object Inspector). Object Inspector имеет две “странички” - “Properties” (Свойства) и “Events” (События). Создание программы в Delphi сводится к “нанесению” компонентов на форму (которая, кстати, также является компонентом) и настройке взаимодействия между ними путем:
изменения значения свойств этих компонентов
написания адекватных реакций на события.
Свойство является важным атрибутом компонента. Для пользователя (программиста) свойство выглядит как простое поле какой-либо структуры, содержащее некоторое значение. Однако, в отличие от “просто” поля, любое изменение значения некоторого свойства любого компонента сразу же приводит к изменению визуального представления этого компонента, поскольку свойство инкапсулирует в себе методы (действия), связанные с чтением и записью этого поля (которые, в свою очередь, включают в себя необходимую перерисовку). [22,25,30,53] Свойства служат двум главным целям: во-первых, они определяют внешний вид формы или компонента; во-вторых, свойства определяют поведение формы или компонента.
Существует несколько типов свойств, в зависимости от их “природы”, т.е. внутреннего устройства.
Простые свойства - это те, значения которых являются числами или строками. Например, свойства Left и Top принимают целые значения, определяющие положение левого верхнего угла компонента или формы. Свойства Caption и Name представляют собой строки и определяют заголовок и имя компонента или формы.
Перечислимые свойства - это те, которые могут принимать значения из предопределенного набора (списка). Простейший пример - это свойство типа Boolean, которое может принимать значения True или False.
Рис. 1 - Отображение комбинированных значений вложенных
Вложенные свойства - это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак “+” слева от названия таких свойств. Имеются два вида таких свойств: множества и комбинированные значения. Object Inspector изображает множества в квадратных скобках. Если множество пусто, оно отображается как []. Установки для вложенных свойств вида “множество” обычно имеют значения типа Boolean. Наиболее распространенным примером такого свойства является свойство Style с вложенным множеством булевых значений. Комбинированные значения отображаются в Инспекторе Объектов как коллекция некоторых величин, каждый со своим типом данных (рис 1). Некоторые свойства, например, Font, для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство.
Delphi позволяет легко манипулировать свойствами компонентов как в режиме проектирования (design time), так и в режиме выполнения программы (run time).
Рис. 2 - Изменение размеров с помощью Дизайнера Форм
В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) или на страничке “Properties” Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно “зацепить” мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector.
Рис. 3 - Изменение размеров с помощью Инспектора Объектов
С другой стороны, в режиме выполнения пользователь (программист) имеет возможность не только манипулировать всеми свойствами, отображаемыми в Инспекторе Объектов, но и управлять более обширным их списком. В следующем разделе мы рассмотрим, как это делается.
Управление свойствами визуальных компонентов в режиме выполнения осуществляется в следующем порядке.
Все изменения значений свойств компонентов в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать Object Inspector.
Однако доступ к свойствам компонентов довольно легко получить программным путем.[30] Все, что Вы должны сделать для изменения какого-либо свойства - это написать простую строчку кода аналогично следующей:
MyComponent.Width := 35;
Вышеприведенная строка устанавливает ширину (Width) компонента в значение 35. Если свойство Width компонента еще не было равно 35 к моменту выполнения данной строки программы, Вы увидите, как компонента визуально изменит свою ширину.
Таким образом, нет ничего магического в Инспекторе Объектов. Object Inspector просто является удобным способом выполнения в режиме проектирования того, что может быть осуществлено программным путем в режиме выполнения. Более того, как уже было сказано выше, у компонента могут быть свойства, не отображаемые в окне Инспектора Объектов.
Объектно-ориентированный язык Паскаль, лежащий в основе Delphi, в качестве базового имеет принцип соответствия визуальных компонент тем вещам, которые они представляют. Разработчики Delphi поставили перед собой цель, чтобы, например, представление компонента Button (кнопка), инкапсулирующее некий код, соответствовало визуальному изображению кнопки на экране и являлось как можно более близким эквивалентом реальной кнопки, которую Вы можете найти на клавиатуре. И именно из этого принципа родилось понятие свойства.
Если изменить свойства Width и Height компонента Button, кнопка соответствующим образом изменит свои ширину и высоту. Пользователю нет необходимости после изменения свойства Width указывать объекту, чтобы он перерисовал себя, хотя при обычном программировании именно так и нужно поступать. Свойства - это более чем просто данные. Напротив, они делают эти данные “живыми”, и все это происходит перед глазами пользователя. Свойства создают иллюзию, как будто пользователь имеет дело с реальными объектами, а не с их программным представлением.
Программа SHAPEDEM
Программа SHAPEDEM.DPR, изображенная на рис. 4, демонстрирует различные способы, с помощью которых можно изменять пользовательский интерфейс при выполнении программы. Эта программа не производит никаких полезных действий кроме демонстрации того, как легко можно создать “дельфийское” приложение с настраиваемым интерфейсом.
Программа SHAPEDEM содержит всего лишь объект TShape, размещенный на форме, вместе с двумя полосами прокрутки и несколькими кнопками. Эта программа интересна тем, что позволяет в режиме выполнения изменять размер, цвет и внешний вид объекта TShape, равно как размер и цвет самой формы.
Рис. 4 - Программа SHAPEDEM имеет две полосы прокрутки и несколько кнопок
Листинг А показывает код программы SHAPEDEM.
Код головного модуля этой программы мы приведем по частям - по мере его написания.
Листинг А: Исходный код программы SHAPEDEM.DPR.
program Shapedem;
uses
Forms,
Mina in 'MAIN.PAS' {Form1};
Begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Рис. 5 - Вы можете использовать полосы прокрутки, кнопки и список для изменения внешнего вида приложения
На нашем примере полосы прокрутки (ScrollBars) используются для изменения размера фигуры, изображенной в средней части экрана, как показано на рис.5. Для выбора нового вида фигуры используется выпадающий список (ComboBox), а для изменения цвета фигуры или окна (формы) используется стандартное диалоговое окно выбора цвета, вызываемое кнопками “Цвет фигуры” и “Цвет формы”.
Что нужно сделать пользователю (программисту) для того чтобы получить возможность “в режиме выполнения” изменять цвет какого-либо элемента или всего окна (формы)? Для этого достаточно выполнить всего лишь несколько действий. [52]
Для изменения цвета окна просто выберите компонент ColorDialog из палитры компонентов (она находится на страничке “Dialogs”) и поместите его на форму. Кроме того, поместите на форму обычную кнопку (компонент Button, находится на страничке “Standard”). Для удобства чтения с помощью Object Inspector измените имя компонента (свойство Name) с “Button1” (которое дается по умолчанию) на “FormColor”, а его заголовок (свойство Caption) - на “Цвет формы”. Дважды щелкните по кнопке “Цвет формы” - Delphi сгенерирует заготовку метода, который выглядит следующим образом:
procedure TForm1.FormColorClick(Sender: TObject);
begin
end;
Теперь введите две простые строчки кода:
procedure TForm1.FormColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Form1.Color := ColorDialog1.Color;
end;
Рис. 6 - Диалоговое окно “Color” дает возможность изменить цвет “во время выполнения”
Данный код во время выполнения при нажатии кнопки “Цвет формы” вызывает стандартное диалоговое окно выбора цвета, как показано на рис.6.Если в этом диалоговом окне Вы щелкните кнопку OK, выполнится следующая строка:
Form1.Color:=ColorDialog1.Color;
Этот код установит свойство Color формы Form1 в цвет, который был выбран с помощью диалогового окна ColorDialog1. Это весьма просто.
Та же самая техника может использоваться для изменения цвета фигуры (компонент Shape, объект TShape). Все, что Вам нужно сделать - это поместить на форму другую кнопку, изменить (при желании) ее имя на “ShapeColor”, а заголовок - на “Цвет Фигуры”, дважды щелкнуть по ней мышкой и создать метод аналогичный следующему:
procedure TForm1.ShapeColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Shape1.Brush.Color := ColorDialog1.Color;
end;
Отметим, что, написанный здесь код, является самодокументированным, т.е. любой, мало-мальски знакомый с программированием человек, сможет без особого труда разобраться, что же делают эти строки; а если перед этим он прочтет документацию, то для него вообще все будет прозрачно.
Все эти действия можно проделать и автоматически - например, изменить цвет определенного элемента формы, чтобы привлечь внимание пользователя к какому-либо действию.
Весь механизм Windows-сообщений, используемый при взаимодействии компонент во время выполнения, оказывается скрытым от программиста, делая процесс создания программ наиболее легким. Сложное программирование в среде Windows становится доступным “широким” массам программистов. Например, программирование изменения размера фигуры с помощью полос прокрутки, требовавшее в “чистом” Windows сложной обработки сообщений в конструкции типа “case”, в Delphi сводится к написанию одной-единственной строчки кода.
Для начала поместите два компонента ScrollBar на форму (находится на страничке “Standard”) и установите свойство Kind первого компонента в sbHorizontal, а второго - в sbVertical. Переключитесь на страничку “Events” в Инспекторе Объектов и создайте заготовки метода для отклика на событие OnChange в каждой полосе прокрутки. Напишите в каждом из методов по одной строчке следующим образом:
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
Shape1.Width := ScrollBar1.Position * 3;
end;
procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
Shape1.Height := ScrollBar2.Position * 2;
end;
Показанный здесь, код, устанавливает свойства Width и Height фигуры TShape в соответствии с положением “бегунка” на полосах прокрутки (сомножители 3 и 2 введены только для лучшего представления).
Последняя часть программы SHAPEDEM демонстрирует большие возможности языка Object Pascal, на основе которого построен Delphi. можно ввести элементы в список компонента ComboBox как в режиме проектирования, так и при выполнении программы. При этом в режиме проектирования можно просто ввести нужные элементы в список Items, щелкнув маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство (Items).
Перед Вами появится диалоговое окно текстового редактора (String List Editor), в которое Вы и введете элементы (рис.7). Вы могли заметить, что список этих элементов совпадает со списком опций свойства Shape компонента Shape1 (Shape). Иными словами, если Вы выделите компонент Shape1 на форме (просто щелкнув по нему) и посмотрите свойство Shape в Инспекторе Объектов, Вы увидите список возможных видов фигур, которые может принимать данный компонент. Это как раз те самые виды фигур, которые мы перечисляли в списке у компонента ComboBox1. Данный список Вы можете найти в on-line справочнике по Delphi по контексту “TShapeType”. Или же, если Вы заглянете в исходный код класса TShape, там увидите те же элементы, формирующие перечислимый тип TShapeType:
TShapeType = (stRectangle, stSquare, stRoundRect,
stRoundSquare, stEllipse, stCircle);
Итак, смысл всего сказанного заключается в том, что за всеми объектами, которые Вы видите в “дельфийской” программе, стоит некий код на Паскале, к которому
Вы имеете доступ при “прямом” программировании. Ничто от Вас не скрыто. Это значит, что Вы можете изменить поведение любой части Вашей программы во время ее выполнения посредством введения соответствующего кода.
Рис. 7 - Текстовый редактор для ввода строк
В нашем конкретном случае, Вам нужно написать только одну строчку кода, которая будет выполнена в качестве отклика на щелчок пользователем по выпадающему списку ComboBox1. Чтобы написать код этого отклика, в режиме проектирования выделите компонент ComboBox1 на форме (как всегда, просто щелкнув по нему левой кнопкой мыши), затем перейдите на страничку “Events” в Инспекторе Объектов. Дважды щелкните по пустому полю напротив события OnClick. В редакторе автоматически сгенерируется следующая заготовка метода:
procedure TForm1.ComboBox1Click(Sender: TObject);
begin
end;
Теперь вставьте одну строчку кода, чтобы метод выглядел следующим образом:
procedure TForm1.ComboBox1Click(Sender: TObject);
begin
Shape1.Shape := TShapeType(ComboBox1.ItemIndex);
end;
Эта строчка кода устанавливает свойство Shape компонента Shape1 в вид, который пользователь выберет в выпадающем списке. Данный код работает благодаря соответствию между порядковыми членами перечислимого типа и числовыми значениями разных элементов в ComboBox. Другими словами, первый элемент перечислявмого типа имеет значение 0, что соответствует первому элементу, показанному в ComboBox (см. рис.7). Рассмотрим этот подход несколько подробнее.
Если Вы рассмотрите декларацию перечислимого типа TShapeType, то увидите, что первый его элемент называется “stRectangle”. По определению, компилятор назначает этому элементу порядковый номер 0. Следующему по порядку элементу назначается номер 1 и т.д. Таким образом, слова “stRectangle”, “stSquare” и т.п., в действительности, просто символизируют порядковые номера в данном перечислимом типе. На элементы в списке ComboBox также можно сослаться по их порядковому номеру, начиная с 0. Именно поэтому так важно (в данном случае) вводить указанные строки в строгом соответствии с декларацией типа TShapeType. Таким образом, используя преобразование типа “TShapeType(ComboBox1.ItemIndex)”, Вы можете указать компилятору, что общего имеют элементы в ComboBox и перечислимый тип в TShapeType: а именно, порядковые номера.
Итак, Вы видите, что Delphi является весьма гибким и мощным программным средством, которое позволяет Вам быстро реализовать логику Вашей программы и предоставляет полное управление приложением.
Программа SHAPEDEM2
Программа SHAPEDEM проста в написании и в освоении.[51,53] Однако при изменении пользователем размера окна она будет выглядеть “некрасиво”. Давайте изменим ее таким образом, чтобы программа сама обрабатывала изменение размера окна, а заодно изучим компонент меню. Для достижения этих целей сделаем следующее:
Кнопки и выпадающий список уберем с экрана и вместо них поместим на форму компонент меню (MainMenu)
“Заставим” полосы прокрутки изменять свое положение в зависимости от размера окна
“Заставим” свойство Position полос прокрутки изменяться так, чтобы правильно отражать размер формы.
Взглянув на рис.8, Вы сможете увидеть, как будет выглядеть программа после этих изменений.
Рис. 8 - Программа SHAPDEM2 имеет возможность реагировать на изменение пользователем размера окна
Листинг B: Программа SHAPDEM2 включает метод FormOnResize. Представлен главный модуль.
unit Main;
interface
uses
WinTypes, WinProcs, Classes, Graphics, Forms, Controls,
ColorDlg, StdCtrls, Menus, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Shape1: TShape;
ColorDialog1: TColorDialog;
ScrollBar1: TScrollBar;
ScrollBar2: TScrollBar;
MainMenu1: TMainMenu;
Shapes1: TMenuItem;
ShapeColor1: TMenuItem;
FormColor1: TMenuItem;
Shapes2: TMenuItem;
Rectangle1: TMenuItem;
Square1: TMenuItem;
RoundRect1: TMenuItem;
RoundSquare1: TMenuItem;
Ellipes1: TMenuItem;
Circle1: TMenuItem;
Exit1: TMenuItem;
procedure NewShapeClick(Sender: TObject);
procedure ShapeColorClick(Sender: TObject);
procedure FormColorClick(Sender: TObject);
procedure ScrollBar2Change(Sender: TObject);
procedure ScrollBar1Change(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Exit1Click(Sender: TObject);
private
{ Private declarations }
public
{Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.NewShapeClick(Sender: TObject);
begin
Shape1.Shape := TShapeType((Sender as TMenuItem).Tag);
end;
procedure TForm1.ShapeColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Shape1.Brush.Color := ColorDialog1.Color;
end;
procedure TForm1.FormColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Form1.Color := ColorDialog1.Color;
end;
procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
Shape1.Height := ScrollBar2.Position;
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
Shape1.Width := ScrollBar1.Position;
end;
procedure TForm1.FormResize(Sender: TObject);
var
Menu,
Caption,
Frame: Integer;
begin
Caption := GetSystemMetrics(sm_cyCaption);
Frame := GetSystemMetrics(sm_cxFrame) * 2;
Menu := GetSystemMetrics(sm_cyMenu);
Scrollbar1.Max := Width;
Scrollbar2.Max := Height;
Scrollbar2.Left := Width - Frame - Scrollbar2.Width;
Scrollbar1.Top := Height - ScrollBar2.Width - Frame - Caption - Menu;
Scrollbar1.Width := Width - Scrollbar2.Width - Frame;
Scrollbar2.Height := Height - Frame - Caption - Menu - Scrollbar1.Height;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
end.
Главное меню для программы создается с помощью компонента MainMenu (находится на страничке “Standard” палитры компонентов). Поместив его на форму, дважды щелкните по нему мышкой - откроется редактор меню, в котором Вы сможете ввести нужные Вам названия пунктов меню и, при желании, изменить их имена (задаваемые Delphi по умолчанию) для удобочитаемости. Создадим меню программы SHAPEDEM2 с тремя главными пунктами: “Цвета”, “Фигуры”, “Выход”.
Для первого пункта создадим следующие подпункты:
Цвет фигуры
Цвет окна
Для второго:
Прямоугольник
Квадрат
Закругленный прямоугольник
Закругленный квадрат
Эллипс
Окружность
Третий пункт меню не будет содержать никаких подпунктов.
После создания всех пунктов и подпунктов меню для работы программы SHAPEDEM2 нужно назначить номера для каждого из подпунктов меню, связанных с типом фигуры. Для этого воспользуемся свойством Tag, имеющимся у каждого пункта меню. Свойство Tag (типа Integer) специально введено в каждый компонент Delphi с тем, чтобы программисты могли использовать его по своему усмотрению. Назначим 0 свойству Tag пункта “Прямоугольник”, 1 - пункту “Квадрат”, 2 - пункту “Закругленный прямоугольник” и т.д. Цель такого назначения будет объяснена позднее.
Два метода, созданные для подпунктов изменения цвета, аналогичны тем, которые были в программе SHAPEDEM:
procedure TForm1.ShapeColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Shape1.Brush.Color := ColorDialog1.Color;
end;
procedure TForm1.FormColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Form1.Color := ColorDialog1.Color;
end;
Как Вы видите, ничего не изменилось по сравнению с первой версией программы, хотя данные методы уже вызываются из меню, а не из кнопок.
Аналогично методы, реализующие реакцию на выбор подпунктов меню изменения вида фигуры также весьма похожи на методы выбора фигуры через выпадающий список:
procedure TForm1.NewShapeClick(Sender: TObject);
begin
Shape1.Shape := TShapeType((Sender as TMenuItem).Tag);
end;
Этот код “работает” правильно благодаря тому, что перечислимый тип TShapeType в качестве начального имеет значение 0 и в свойство Tag подпунктов меню мы также записали порядковые номера, начинающиеся с нуля.
Отметим, что мы использовали оператор as, который позволяет надежно преобразовывать типы из одного в другой: в частности, преобразовать параметр Sender (имеющий общий тип TObject) в тип TMenuItem. Как правило, параметр Sender в Delphi - это управляющий элемент, посылающий сообщения функции, в которой он фигурирует. В данном случае, Sender является пунктом меню, и, следовательно, Вы можете работать с этим параметром так, как если бы он был декларирован с типом TMenuItem.
Главная причина использования оператора as заключается в том, что он обеспечивает весьма ясный синтаксис, даже если Вы проводите сложное двухуровневое преобразование типов. Более того, оператор as обеспечивает проверку преобразования в режиме выполнения программы. Когда Вы используете оператор as, Вы можете быть уверены в том, что преобразование Sender в TMenuItem реально будет произведено лишь в том случае, если Sender действительно имеет тип TMenuItem.
Две полосы прокрутки в программе SHAPEDEM2 всегда будут располагаться возле границ окна, независимо от его размеров. Выполнение этих действий требует от Вас написания несколько более сложного программирования, чем было ранее. Как было указано выше, Delphi, хотя и скрывает от программиста детали Windows-программирования, однако не запрещает обращаться к функциям Windows API (прикладного пользовательского интерфейса). Таким образом, Delphi поддерживает низкоуровневое программирование на уровне Windows API. Иначе говоря, если Вам нужно углубиться в дебри низкоуровневого программирования - пожалуйста!
procedure TForm1.FormResize(Sender: TObject);
var
Menu,
Caption,
Frame: Integer;
begin
Caption := GetSystemMetrics(sm_cyCaption);
Frame := GetSystemMetrics(sm_cxFrame) * 2;
Menu := GetSystemMetrics(sm_cyMenu);
Scrollbar1.Max := Width;
Scrollbar2.Max := Height;
Scrollbar2.Left := Width - Frame - Scrollbar2.Width;
Scrollbar2.Height := Height - Frame - Caption - Menu;
Scrollbar1.Top :=
Height - Scrollbar2.Width - Frame - Caption - Menu;
Scrollbar1.Width := Width - Scrollbar2.Width - Frame;
end;
Код, показанный здесь, является реакцией на событие OnResize. Это событие перечислено среди других на страничке “Events” Инспектора Объектов в состоянии, когда выбрана форма (окно). Как Вы можете ожидать, событие (сообщение) OnResize посылается форме (окну) каждый раз, когда пользователь “захватывает” мышкой за какой-либо край окна и делает размер окна большим или меньшим. Однако это же сообщение (событие) посылается окну и тогда, когда происходит максимизация окна (но не минимизация).
Первое, что делается в данном методе, - запрашиваются системные параметры, определяющие размеры заголовка окна, огибающей его рамки и меню. Эта информация “добывается” путем вызова функции GetSystemMetrics, являющейся частью Windows API. Функции GetSystemMetrics передается один аргумент в виде константы, определяющей вид запрашиваемой информации. Например, если Вы передадите функции константу sm_cyCaption, получите в качестве результата высоту заголовка окна (в пикселах). Полный список этих констант имеется в on-line справочнике Delphi (Help|Windows API|Alphabetical functions|User functions|GetSystemMetrics), здесь же мы приведем небольшую выдержку из справочника:
SM_CXBORDER Ширина огибающей окно рамки, размер которой не может быть изменен.
SM_CYBORDER Высота огибающей окно рамки, размер которой не может быть изменен.
SM_CYCAPTION Высота заголовка окна, включая высоту огибающей окно рамки, размер которой не может быть изменен (SM_CYBORDER).
SM_CXCURSOR Ширина курсора.
SM_CYCURSOR Высота курсора.
SM_CXFRAME Ширина огибающей окно рамки, размер которой может быть изменен.
SM_CYFRAME Высота огибающей окно рамки, размер которой может быть изменен.
SM_CXFULLSCREEN Ширина клиентской части для полноэкранного окна.
SM_CYFULLSCREEN Высота клиентской части для полноэкранного окна (эквивалентна высоте экрана за вычетом высоты заголовка окна).
SM_CXICON Ширина иконки.
SM_CYICON Высота иконки.
SM_CYMENU Высота полосы меню в одну строку. Это высота меню за вычетом высоты огибающей окно рамки, размер которой не может быть изменен (SM_CYBORDER).
SM_CXMIN Минимальная ширина окна.
SM_CYMIN Минимальная высота окна.
SM_CXSCREEN Ширина экрана.
SM_CYSCREEN Высота экрана.
SM_MOUSEPRESENT Не 0, если мышь установлена.
В методе FormResize программа вычисляет новые размеры полос прокрутки:
Scrollbar1.Max := Width;
Scrollbar2.Max := Height;
Scrollbar2.Left := Width - Frame - Scrollbar2.Width;
Scrollbar2.Height := Height - Frame - Caption - Menu;
Scrollbar1.Top :=
Height - Scrollbar2.Width - Frame - Caption - Menu;
Scrollbar1.Width := Width - Scrollbar2.Width - Frame;
Вычисления, приведенные здесь, включают простые математические действия. Например, левая сторона вертикальной полосы прокрутки должна быть равна ширине всего окна (формы) за вычетом ширины рамки и ширины самой полосы прокрутки. Это элементарная логика и, реализовав ее в программе, мы получим вертикальную полосу прокрутки, всегда располагающуюся возле правого края окна (формы).
В программе SHAPEDEM свойство Max каждой полосы прокрутки оставалось равным значению по умолчанию - 100; это означало, что после того, как бегунок полосы прокрутки пройдет все доступное расстояние (как для вертикальной, так и для горизонтальной полосы прокрутки), свойство Position будет установлено в 100. Если бегунок возвращался к началу, свойство Position устанавливалось равным свойству Min, которое, по умолчанию, 0.
В программе SHAPEDEM2 Вы можете изменять значения свойств Min и Max так, чтобы диапазон значений Position полос прокрутки отражал текущий размер окна (формы) даже при изменении формой своего размера в режиме выполнения. Здесь приведены соответствующие строки из метода FormResize.
procedure TForm1.FormResize(Sender: TObject);
begin
...
Scrollbar1.Max := Width;
Scrollbar2.Max := Height;
...
end;
Две показанные выше, строчки кода, просто устанавливают максимальные значения полос прокрутки равными ширине и высоте формы соответственно. После этого Вы всегда сможете сделать помещенную на форму фигуру такой же “большой”, как и сама форма. После введения таких изменений Вам больше не потребуется умножать свойство Position на какой-либо множитель.
procedure TForm1.Scrollbar2Change (Sender: TObject);
begin
Shape1.Height := Scrollbar2.Position;
end;
Если Вы после этого запустите программу SHAPDEM2 на выполнение, Вы увидите, что она работает корректно при любом изменении размера формы. Более того, теперь то можете выбирать фигуры и цвета из меню, что придает программе более строгий вид.
В конце хотелось бы сделать одно маленькое замечание: каждая форма, по умолчанию, имеет две полосы прокрутки (HorzScrollbar и VertScrollbar), которые автоматически появляются всякий раз, когда размер формы становится меньше, чем область, занимаемая управляющими элементами, расположенными на этой форме. Иногда эти полосы прокрутки могут быть весьма полезными, но в нашей ситуации они сделают совсем не то, что хотелось бы. Поэтому, для надежности, можно установить их вложенные свойства Visible в False.
Таким образом, мы рассмотрели, как изменять свойства компонентов во время выполнения. В целом, такие действия ненамного сложнее, чем изменение свойств в режиме проектирования с помощью Object Inspector.
2. Методы в Delphi
Создание методов с помощью визуальных средств
Чтобы полностью понять и почувствовать все преимущества Delphi, желательно хорошо изучить язык Object Pascal. И хотя возможности визуальной части Delphi чрезвычайно богаты, программистом может стать только тот, кто хорошо разбирается в технике ручного написания кода.
По мере обсуждения темы данной лекции мы рассмотрим несколько простых примеров, которые, тем не менее, демонстрируют технику использования важных управляющих элементов Windows.
Из предыдущей лекции можно сделать вывод о том, что синтаксический “скелет” метода может быть сгенерирован с помощью визуальных средств. Для этого, напомним, нужно в Инспекторе Объектов дважды щелкнуть мышкой на пустой строчке напротив названия интересующего Вас события в требуемом компоненте. Заметим, если эта строчка не пуста, то двойной щелчок на ней просто переместит Вас в окне Редактора Кода в то место, где находится данный метод.
Для более глубокого понимания дальнейшего изложения, кратко остановимся на концепции объектно-ориентированного программирования. Для начала определим базовое понятие объектно-ориентированного программирования - класс. Класс - это категория объектов, обладающих одинаковыми свойствами и поведением. При этом объект представляет собой просто экземпляр какого-либо класса. Например, в Delphi тип “форма” (окно) является классом, а переменная этого типа - объектом. Метод - это процедура, которая определена как часть класса и инкапсулирована (содержится) в нем. Методы манипулируют полями и свойствами классов (хотя могут работать и с любыми переменными) и имеют автоматический доступ к любым полям и методам своего класса. Доступ к полям и методам других классов зависит от уровня “защищенности” этих полей и методов. Пока же для нас важно то, что методы можно создавать как визуальными средствами, так и путем написания кода вручную.
Давайте рассмотрим процесс создания программы CONTROL1, которая поможет нам изучить технику написания методов в Delphi.
Для создания программы CONTROL1 поместите с помощью мышки компонент Edit (находится на страничке “Standard” Палитры Компонентов) на форму. После этого ваша форма будет иметь вид, показанный на.
Теперь перейдите в Object Inspector, выберите страничку “Events” и дважды щелкните в пустой строчке напротив события OnDblClick, как показано на.
Рис. 8 A - Чтобы создать метод, просто дважды щелкните справа от слова OnDblClick
После этого в активизировавшемся окне Редактора Вы увидите сгенерированный “скелет” метода Edit1DblClick, являющегося реакцией на событие OnDblClick:
procedure TForm1.Edit1DblClick(Sender: TObject);
begin
end;
После генерации процедуры Вы можете оставить ее имя таким, каким “установил” Delphi, или изменить его на любое другое (для этого просто введите новое имя в указанной выше строке Инспектора Объектов справа от требуемого события и нажмите Enter).
Теперь в окне Редактора Кода введите смысловую часть метода:
Рис. 8 B - Главная форма программы CONTROL1
procedure TForm1.Edit1DblClick(Sender: TObject);
begin
Edit1.Text:= 'Вы дважды щелкнули в строке редактирования';
end;
Сохраните программу. Во время выполнения дважды щелкните на строке редактирования. Текст в этой строке изменится в соответствии с тем, что мы написали в методе Edit1DblClick: см. REF _Ref340033634 \h Рис. 8-C.
Рис. 8 C - Содержимое управляющего элемента TEdit изменяется после двойного щелчка по нему
Листинг 8-A и Листинг 8-B предоставляют полный код программы CONTROL1.
Листинг 8-A: Программа CONTROL1 демонстрирует, как создавать и использовать методы в Delphi.
program Control1;
uses
Forms,
Main in 'MAIN.PAS' {Form1};
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Листинг 8-B: Головной модуль программы 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, автоматически сгенерированные компилятором:[30,51,52]
Application.CreateForm(TForm1, Form1);
Application.Run;
Первая строка запрашивает память у операционной системы и создает там объект Form1, являющийся экземпляром класса TForm1. Вторая строка указывает объекту Application, “по умолчанию” декларированному в Delphi, чтобы он запустил на выполнение главную форму приложения. В данном месте мы не будем подробно останавливаться на классе TApplication и на автоматически создаваемом его экземпляре - Application. Важно понять, что главное его предназначение - быть неким ядром, управляющим выполнением Вашей программы.
Как правило, у большинства примеров, которыми мы будем оперировать в наших уроках, файлы проектов .DPR практически одинаковы. Поэтому в дальнейшем там, где они не отличаются кардинально друг от друга, мы не будем приводить их текст. Более того, в файл .DPR, автоматически генерируемый Delphi, в большинстве случаев нет необходимости заглядывать, поскольку все, производимые им действия, являются стандартными.
Итак, мы видели, что большинство кода Delphi генерирует автоматически. [22,25,30] В большинстве приложений все, что Вам остается сделать - это вставить одну или несколько строк кода, как в методе Edit1DblClick:
Edit1.Text := 'Вы дважды щелкнули в строке редактирования';
Хотя внешний интерфейс программы CONTROL1 достаточно прост, она (программа) имеет строгую внутреннюю структуру. Каждая программа в Delphi состоит из файла проекта, с расширением .DPR и одного или нескольких модулей, имеющих расширение .PAS. Модуль, в котором содержится главная форма проекта, называется головным. Указанием компилятору о связях между модулями служит предложение Uses, которое определяет зависимость модулей.
Нет никакого функционального различия между модулями, созданными Вам в Редакторе, и модулями, сгенерированными Delphi автоматически. В любом случае модуль подразделяется на три секции:
Заголовок
Секция Interface
Секция Implementation
Таким образом, “скелет” модуля выглядит следующим образом:
unit Main; {Заголовок модуля}
interface {Секция Interface}
implementation {Секция Implementation}
end.
В интерфейсной секции (interface) описывается все то, что должно быть видимо для других модулей (типы, переменные, классы, константы, процедуры, функции). В секции implementation помещается код, реализующий классы, процедуры или функции.
Передача параметров
В Delphi процедурам и функциям (а, следовательно, и методам классов) могут передаваться параметры для того, чтобы обеспечить их необходимой для работы информацией. Программа PARAMS демонстрирует, как использовать передачу параметров в методы Delphi. Кроме того, мы узнаем, как:
создавать свои собственные процедуры;
добавлять процедуру в класс, формируя метод класса;
вызывать одну процедуру из другой.
Рис. 8-D - Программа PARAMS позволяет вызовом одной процедуры заполнить шесть строк
Программа PARAMS позволяет Вам вводить фразы в строки редактирования. После нажатия кнопки “Вызов процедуры WriteAll” строка из управляющего элемента EditSource скопируется в шесть управляющих элементов - строк редактирования, как показано на .
Далее мы не будем подробно останавливаться на том, как размещать компоненты на форме - считаем, что это Вы уже умеете. После того, как Вы разместили на форме семь компонентов Edit, переименуйте с помощью Инспектора Объектов седьмой компонент (Edit7) в EditSource. Положите на форму компонент Button, и в Object Inspector измените его заголовок (свойство Caption) на “Вызов процедуры WriteAll” (естественно, Вы можете заменить его шрифт, цвет и т.д.).
После завершения проектирования формы класс TForm1 будет выглядеть следующим образом:
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
EditSource: TEdit;
Button1: TButton;
end;
Следующий шаг заключается в добавлении метода, вызываемого по нажатию пользователем кнопки 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 Вы, естественно, можете редактировать как в режиме проектирования, так и во время выполнения.
Текст, который должен быть отображен в шести строках редактирования, передается процедуре 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”, так как оно уже присутствует в описании класса.
Листинг 8-C показывает полный текст головного модуля программы PARAMS. Мы не включили сюда файл проекта, поскольку, как уже упоминалось, он практически одинаков для всех программ.
Листинг 8-C: Исходный код головного модуля программы 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, можно продолжить изучение компонент и способов создания их методов.
В программе CONTROL1, рассмотренной в начале лекции, был сгенерирован метод, являю-щийся откликом на событие OnClick строки редактирования Edit1. Аналогично, можно сгене-рировать метод, являющийся реакцией на событие OnDbl Click.
Рис. 8E - Внешний вид программы
В программе CONTROL2, имеющейся на диске, расширен список находящихся на форме компонентов и для многих из них определены события OnClick и OnDblClick. Для исследования можно просто скопировать файлы проекта CONTROL1 в новую директорию CONTROL2, изменить имя проекта на CONTROL2.DPR (в этом файле после ключевого слова “program” также должно стоять название “CONTROL2”) и добавить компоненты Label, GroupBox, CheckBox, RadioButton, Button на форму (эти компоненты находятся на страничке “Standard” Палитры Компонентов). Форма будет иметь примерно следующий вид.
Рис. 8F - Внешний вид программы CONTROL2
Заметим, что необходимо “положить” компонент GroupBox на форму до того, как Вы добавите компоненты CheckBox и RadioButton, которые, в нашем примере, должны быть “внутри” группового элемента. Иначе, объекты CheckBox1, CheckBox2, RadioButton1 и RadioButton2 будут “думать”, что их родителем является форма Form1 и при перемещении GroupBox1 по форме не будут перемещаться вместе с ней. Таким образом, во избежание проблем, компонент, который должен быть “родителем” других компонентов (Panel, GroupBox, Notebook, StringGrid, ScrollBox и т.д.), нужно помещать на форму до помещения на нее его “детей”. Если Вы все же забыли об этом и поместили “родителя” (например, GroupBox) на форму после размещения на ней его “потомков” (например, CheckBox и RadioButton) - не отчаивайтесь! Отметьте все необходимые объекты и скопируйте (с удалением) их в буфер обмена с помощью команд меню Edit|Cut. После этого отметьте на форме нужный Вам объект (GroupBox1) и выполните команду меню Edit|Paste. После этого все выделенные Вами ранее объекты будут помещены на форму, и их “родителем” будет GroupBox1. Описанный механизм является стандартным и может быть использован для всех видимых компонент.
Выберите объект Label1. Создайте для него метод, являющийся откликом на событие OnDblClick (см. с. 2). Введите в метод одну строчку, например:
procedure TForm1.Label1DblClick(Sender: TObject);
begin
Edit1.Text := 'Двойной щелчок на Label1';
end;
Запустите программу на выполнение и дважды щелкните мышкой на метке Label1. Вы увидите, что строка редактирования изменится и в ней появится текст “Двойной щелчок на Label1”.
Теперь закройте приложение и возвратитесь в режим проектирования. Добавьте обработчики событий OnClick и OnDblClick для каждого объекта, имеющегося на форме. Текст вашего головного модуля будет выглядеть следующим образом:
Листинг 8-D: Головной модуль программы CONTROL2.
Unit Main;
interface
uses
WinTypes, WinProcs, Classes,
Graphics, Controls, StdCtrls,
Printers, Menus, Forms;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
procedure Edit1DblClick(Sender: TObject);
procedure Label1DblClick(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure CheckBox2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Edit1DblClick(Sender: TObject);
begin
Edit1.Text := 'Двойной щелчок на Edit1';
end;
procedure TForm1.Label1DblClick(Sender: TObject);
begin
Edit1.Text := 'Двойной щелчок на Label1';
end ;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
Edit1.Text := 'Щелчок на CheckBox1';
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
Edit1.Text := 'Щелчок на CheckBox2';
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Edit1.Text := 'Щелчок на RadioButton1';
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Edit1.Text := 'Щелчок на Radiobutton2';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := 'Щелчок на Button1';
end;
end.
Эта программа служит двум целям:
она показывает, как создавать процедуры (методы) и как “наполнять” их содержательной “начинкой”;
она демонстрирует технику работы с управляющими элементами Windows.
Информация периода выполнения. Программа CONTROL3
Как Вы, наверное, заметили, методы программы CONTROL2, являющиеся откликами на события OnClick и OnDblClick, во многом похожи друг на друга.
Открытость среды Delphi позволяет получать и оперировать информацией особого рода, называемой информацией периода выполнения (RTTI - run-time type information), которая организована в виде нескольких уровней.
Верхний уровень RTTI представлен как средство проверки и приведения типов с использованием ключевых слов is и as.
Ключевое слово is дает программисту возможность определить, имеет ли данный объект требуемый тип или является одним из наследников данного типа, например, таким образом:
if MyObject is TSomeObj then ...
Имеется возможность использовать RTTI и для процесса приведения объектного типа, используя ключевое слово as:
if MyObject is TSomeObj then
(MyObject as TSomeObj).MyField:=...
что эквивалентно:
TSomeObj(MyObject).MyField:=...
Средний уровень RTTI использует методы объектов и классов для подмены операций as и is на этапе компиляции. В основном, все эти методы заложены в базовом классе TObject, от которого наследуются все классы библиотеки компонент VCL. Для любого потомка TObject доступны, в числе прочих, следующие информационные методы:
ClassName - возвращает имя класса, экземпляром которого является объект;
ClassInfo - возвращает указатель на таблицу с RTTI, содержащей информацию о типе объекта, типе его родителя, а также о всех его публикуемых свойствах, методах и событиях;
ClassParent - возвращает тип родителя объекта;
ClassType - возвращает тип самого объекта;
InheritsFrom - возвращает логическое значение, определяющее, является ли объект потомком указанного класса;
InstanceSize - возвращает размер объекта в байтах.
Эти методы могут использоваться в Вашем коде напрямую.
Нижний уровень RTTI определяется в дельфийском модуле TypInfo и представляет особый интерес для разработчиков компонентов. Через него можно получить доступ к внутренним структурам Delphi, в том числе, к ресурсам форм, инспектору объектов и т.п.
Итак, доступ к информации периода выполнения в Delphi позволяет динамически получать как имя объекта, находящегося на форме, так и название класса, которому он принадлежит (и еще много другой полезной информации; но об этом - в дальнейших уроках). Для этого используется свойство Name, имеющееся у любого класса-наследника TComponent (а таковыми являются все компоненты, входящие в дельфийскую библиотеку VCL), и метод ClassName, доступный для любого потомка класса базового TObject. А, поскольку класс TComponent, в свою очередь, является наследником класса TObject, то он доступен для всех компонент из библиотеки VCL.
Вернувшись к нашим примерам, мы можем заменить целую “кучу” методов двумя, реализующими события OnClick и OnDblClick для всех объектов сразу. Для этого можно скопировать все файлы из CONTROL2 в новый директорий CONTROL3 или использовать для работы уже имеющуюся на диске программу. Создадим стандартным образом методы ControlDblClick и ControlClick для какого-либо объекта (например, для Label1). Введем в них следующие строки:
procedure TForm1.ControlDblClick(Sender: TObject);
begin
Edit1.Text := 'Двойной щелчок на ' +
(Sender as TComponent).Name +
' (класс ' + Sender.ClassName + ')';
end;
procedure TForm1.ControlClick(Sender: TObject);
begin
Edit1.Text := 'Щелчок на ' +
(Sender as TComponent).Name +
' (класс ' + Sender.ClassName + ')';
end;
Теперь назначим данные методы всем событиям OnClick и OnDblClick, имеющимся у расположенных на форме объектов. Мы видим, что размер программы существенно сократился, а ее функциональность значительно возросла.
Рис. 8G - Программа CONTROL3 выводит информацию не только об имени объекта, но и о названии его класса (типа)
В режиме выполнения после, например, щелчка на объекте CheckBox1 приложение будет иметь вид, изображенный на .
Итак, мы видим, что используя информацию периода выполнения, можно сделать программу весьма гибкой и универсальной.
В этой лекции мы рассмотрели, как управлять методами компонентов во время выполнения программы. Помимо этого, мы изучили, что такое информация периода выполнения и научились использовать ее в целях создания гибких и универсальных приложений.
3. События в Delphi
Одна из ключевых целей среды визуального программирования - скрыть от пользователя сложность программирования в Windows. При этом, однако, хочется, чтобы такая среда не была упрощена слишком, не до такой степени, что программисты потеряют доступ к самой операционной системе.
Программирование, ориентированное на события, - неотъемлемая черта Windows. Некоторые программные среды для быстрой разработки приложений (RAD) пытаются скрыть от пользователя эту черту совсем, как будто она столь сложна, что большинство не могут ее понять. Истина заключается в том, что событийное программирование само по себе не так уж сложно. Однако есть некоторые особенности воплощения данной концепции в Windows, которые в некоторых ситуациях могут вызвать затруднения.
...Подобные документы
Общая характеристика системы программирования Delphi, а также принципы создания ее компонентов. Описание значений файлов приложения, созданного с помощью Delphi. Структура и свойства библиотеки визуальных компонентов (Visual Component Library или VCL).
отчет по практике [1,1 M], добавлен 07.12.2010Рассмотрение особенностей среды программирования Delphi, анализ клиент-серверной версии. Знакомство с библиотекой визуальных компонентов. Основные функции интеллектуального редактора. Характеристика требований к базам данных. Функции программы "Магистр".
дипломная работа [1,5 M], добавлен 10.03.2013Основы программирования, работа в консольном режиме Delphi. Правила оформления комментариев. Типы данных, используемые в консольном режиме. Текстовый редактор Delphi Memo. Пример загрузки текстового файла. Примеры решения и оформления простейших задач.
отчет по практике [2,1 M], добавлен 11.03.2014Разработка визуального интерфейса пользователя, на основе экранных форм среды Delphi и визуальных компонент. Основные типы данных, используемые в программе MD 5 Calc. Однонаправленные хэш-функции. Процесс хэширования MD5, возможности его применения.
курсовая работа [433,1 K], добавлен 28.08.2012Методы, подходы, принципы, интерфейс Lazarus и Delphi. Технические различия, ход установки и коммерческий доступ к продуктам среды визуального программирования. Установление дополнительных компонент программы, их совместимость с операционными системами.
курсовая работа [4,1 M], добавлен 14.03.2012Освоение языка программирования Delphi. Построение блок-схемы запуска главного таймера и основная логика программы. Использованные свойства и события Form, MediaPlayer, Timer, MainMenu. Запуск, пауза и остановка анимациии. Создание листинга программы.
курсовая работа [771,9 K], добавлен 22.06.2014Описания объектов, свойств, методов, формы и основных модулей текста программы в среде Delphi. Создание Windows-приложения на алгоритмическом языке Object Pascal в среде визуального программирования. Анализ результатов тестирования программного продукта.
курсовая работа [2,4 M], добавлен 27.08.2012Особенности среды визуального проектирования Borland Delphi 7.0. Этапы разработки программы и составления блок-схемы алгоритмов. Способы вычисления кусочно-заданной функции одной переменной. Рассмотрение компонентов среды Delphi, ее предназначение.
контрольная работа [703,8 K], добавлен 24.09.2012Разработка программы для работы в операционных системах семейства Windows. Использование среды Delphi - современной технологии визуального проектирования. Создание пользовательского интерфейса, оконного приложения, меню; задание исходной матрицы.
курсовая работа [1,5 M], добавлен 12.01.2011Создание Windows-приложения на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое, как планируется, будет обеспечивать решение специализированных задач по формированию, обработке на ЭВМ и выводу информации.
курсовая работа [967,6 K], добавлен 20.05.2008Теоретические основы объектно-ориентированного языка программирования Delphi, изучение среды визуального проектирования приложений. Определение 40-го числа Фибоначчи, составление листинга и блок-схемы программы, тестирование ее на работоспособность.
курсовая работа [261,1 K], добавлен 25.03.2015Общая характеристика интерфейса языка программирования Delphi. Рассмотрение окна редактора кода, конструктора формы, инспектора объектов и расширения файлов. Ознакомление с основными этапами создания и сохранения простого приложения; проверка его работы.
презентация [184,3 K], добавлен 18.03.2014Создание информационной системы обработки матриц. Общая характеристика программного обеспечения, которое реализует выполнение заданных функций. Программа разработана с использованием среды визуального программирования Delphi 7 и языка Object Pascal.
курсовая работа [373,4 K], добавлен 14.01.2011Delphi как среда разработки программ, ориентированных на работу в Windows. Назначение и преимущество использования электронных учебников. Описание возможностей среды Delphi 5 для разработки электронного учебника. Варианты применения служб Internet.
дипломная работа [3,6 M], добавлен 13.07.2011Создание в Delphi программы, позволяющей тестировать уровень знаний операционной системы Windows. Важнейшие свойства и события компонента MainMenu. Описание работы программы и ее фрагменты. Внешний вид исходной формы теста. Программа решения задачи.
курсовая работа [2,8 M], добавлен 21.07.2013C++ Builder - SDI-приложение, главное окно которого содержит настраиваемую инструментальную панель и палитру компонентов. Свойства атрибутов компонента, определяющие его внешний вид и поведение. События, методы и VCL компоненты в среде C++ Builder.
курсовая работа [225,9 K], добавлен 12.02.2009Разработка 32-разрядных приложений Windows с помощью системы виртуального объектно-ориентированного программирования Delphi. Работа с коммуникационными портами. Виртуальное проектирование Windows. Назначение контактов COM порта (разъём DB-9S.).
реферат [32,7 K], добавлен 28.08.2009Методы, позволяющие обрабатывать события, в интерфейсах. Преимущество использования getSource(). Метод actionPerformed(), вызываемый при возникновении события, когда пользователь щелкает на кнопке или выполняет действие, затрагивающее компонент.
презентация [1,2 M], добавлен 26.10.2013Эффективные средства разработки программного обеспечения. Технология визуального проектирования и событийного программирования. Конструирование диалоговых окон и функций обработки событий. Словесный алгоритм и процедуры программы Borland Delphi 7 Studio.
дипломная работа [660,2 K], добавлен 21.05.2012Теоретические аспекты среды программирования Delphi. Сущность понятия жизненного цикла, характеристика спиральной модели. Назначение программы "Графический редактор", ее основные функции. Работа с графическим редактором, документирование программы.
курсовая работа [695,6 K], добавлен 16.12.2011