Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

События в Delphi 1 страница

Объектно-ориентированное программирование | События в Delphi 3 страница | События в Delphi 4 страница |


Читайте также:
  1. 1 страница
  2. 1 страница
  3. 1 страница
  4. 1 страница
  5. 1 страница
  6. 1 страница
  7. 1 страница

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

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

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

Событийная модель Windows.

ся работа операционной системы (ОС) Windows основана на понятии

события. Что это значит? Давай попробуем разобраться.

Внутри ядра Windows создаётся очередь событий. Когда какое-нибудь

приложение или устройство, изменило своё состояние и хочет сообщить об этом

операционной системе, то оно помещает в эту очередь соответствующее сообщение. ОС

Windows обрабатывает его и если необходимо, то реагирует на изменения.

 

 

Давай рассмотрим реальный пример события и реакции на него. Допустим, что мы

передвинули курсор мыши. Она генерирует событие и помещает его в очередь

сообщений. Когда Windows доходит до обработки этого сообщения, то он получает новые

координаты курсора мышки. Так как положение курсора изменилось, ОС должна

перерисовать его в новой позиции на экране. После этого, Windows переходит к обработке

следующего сообщения.

Если в очереди нет сообщений, то Windows переходит в состояние ожидания. Но

такое бывает очень редко. Даже когда ты не работаешь за компьютером, и он простаивает,

в фоне работает очень много процессов, которые отнимают процессорное время и

генерируют свои события.

Когда ты нажимаешь на кнопку, также генерируется событие, что кнопка нажата.

Любое действие, которое несёт в себе какие либо изменения может генерировать

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

реализуется многозадачность Windows.

Давай взглянём на простую очередь (она не является очередью ОС Windows, это

просто пример):

Событие Идентификатор приложения Дополнительно

Нажата клавиша 261 А

Перерисовать экран 385 (12, 46, 336, 267)

Перемещена мышь 261 (356,451)

 

Первая колонка показывает тип события. Вторая колонка показывает идентификатор

приложения, которое сгенерировало событие. В третьей показываются дополнительные

параметры. Так, например, при нажатии клавиши на клавиатуре, в качестве

дополнительного параметра идёт буква, которую нажали. Конечно же, в реальной

ситуации будет не буква, но у нас же это просто пример.

ОС Windows берёт первую строку из очереди и обрабатывает её. Потом берёт

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

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

события разных приложений, что даёт многозадачность.

Конечно же, многозадачность построена не только на сообщениях и здесь много

дополнительных факторов. Но очереди играют достаточно большую роль.

В Delphi все компоненты так же работают через события. Ты будешь постоянно

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

обработчик события для нажатия клавиши на клавиатуре и производить в нём какие-то

действия. Например, по нажатию определённой клавиши, можно выводить окно (действие

как у горячих клавиш).

Обработчик события – это простая процедура или функция, которая вызывается по

наступлению какого-то события.

 

2. Модульное программирование.

Модульное программирование является развитием и совершенствованием процедурного программирования и библиотек специальных программ. Основная черта модульного программирования - стандартизация интерфейса между отдельными программными единицами. Модуль - это отдельная функционально-законченная программная единица, которая структурно оформляется стандартным образом по отношению к компилятору и по отношению к объединению ее с другими аналогичными единицами и загрузке. Как правило, каждый модуль содержит паспорт, в котором указаны все основные его характеристики: язык программирования, объем, входные и выходные переменные, их формат, ограничения на них, точки входа, параметры настройки и т.д. Объем модуля обычно не превышает 1000 команд ЭВМ или операторов языка программирования. В противном случае модуль становится громоздким и трудным к восприятию и использованию.

 

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

 

Основные концепции модульного программирования:

-каждый модуль реализует единственную независимую функцию;

-каждый модуль имеет единственную точку входа и выхода;

-размер модуля по возможности должен быть минимизирован;

-каждый модуль может быть разработан и закодирован различными членами бригады программистов и может быть отдельно протестирован;

-вся система построена из модулей;

-модуль не должен давать побочных эффектов;

-каждый модуль не зависит от того, как реализованы другие модули.

 

3. Нисходящее программирование.

Нисходящее программирование (top-down programming). Способ разработки программ, при котором программирование ведется методом "сверху вниз", от общего к деталям. Алгоритм решения задачи разбивается на несколько более простых частей или подзадач. Их выделяют таким образом, чтобы, программирование подзадач было независимым. При этом составляют план решения всей задачи, пунктами которого и являются выделенные части. План записывают графически в виде блок-схемы, где определяют головную и подчиненные подзадачи и связи между ними, т. е. интерфейс. Здесь же устанавливают, какие начальные данные (или аргументы) получает каждая подзадача для правильного функционирования и какие результаты она выдает. По блок-схеме составляется программа, в которой содержатся вызовы подпрограмм (процедур или функций), соответствующих выделенным подзадачам.

 

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

 

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

Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.

 

В соответствии с данной методологией:

1. Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

- последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

- ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

- цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

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

3. Разработка программы ведётся пошагово, методом «сверху вниз».

 

5. Понятия объекта, класса объектов.

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

 

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

 

Имена свойств объектов класса объявляются с помощью ключевого слова var, методы, применимые к объектам данного класса, описываются функциями. Внутри определения класса можно использовать ключевое слово this для обращения к текущему представителю класса.

 

6. Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм.

Инкапсуляция — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected. Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования.

 

Часто инкапсуляция может быть достигнута простейшими организационными мерами: знание того, что «вот так-то делать нельзя» иногда является самым эффективным средством инкапсуляции!

 

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

 

Полиморфизм (в языках программирования) — взаимозаменяемость объектов с одинаковым интерфейсом. Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций»

 

 

7. Данные типа класс, объявление класса, объекты.

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

 

Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.

 

Cпецификатор класса представляет то, что называется объявлением класса. Уточнённый спецификатор типа объявляет расположенный за ним идентификатор именем класса. Уточнённый спецификатор обеспечивает неполное предварительное объявление класса и перечисления.

 

Класс считается объявленным даже тогда, когда в нём полностью отсутствует информация о членах класса (пустой список членов класса). Неименованный класс с пустым множеством членов - уже класс!

 

Ключевое слово Class это центральная часть Объектно-ориентированного кода.

 

Это определение содержит так называемые 'члены' - данные и методы (подпрограммы). Когда объект класса создан, он становится автономным элементом - вы можете обратиться к данным и методам объекта независимо от любого другого объекта. Оно похоже на запись Delphi, но с активными компонентами - методами.

 

Эти элементы определены в определении типов класса. Элементы метода осуществлены в разделе implementation модуля.

 

Объявление класса имеет следующее типичное описание:

 

type

className = class(BaseClass)

private

// Определения данных/методов локальные для этого модуля

protected

// Определения данных/методов, локальных для этого класса + потомки

public

// Определения данных/методов пригодных для использования всеми объектами этого класса

published

// Внешне общественные определения

end;

 

Параметры можно передать при создании объектного образца класса. Они передаются методу Constructor класса. Слово Constructor используется вместо функции или метода. Вы можете иметь множество конструкторов для различных наборов параметра. Они снабжены ключевым словом overload; после конца определения конструктора.

 

Обычно, название метода конструктора - Create.

 

Когда объект разрушают, вызывают метод Destructor. Вы можете использовать его, чтобы предпринять специальное действие прежде, чем объектная память будет исправлена.

 

Обычно, название метода деструктора - Destroy.

 

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

 

8. Данные типа запись, оператор присоединения, правила использования.

 

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

Запись - это структурированный тип, содержащий набор объектов разных типов. Составляющие запись объекты называются ее полями. В записи каждое поле имеет свое собственное имя. Чтобы описать запись, необходимо указать ее имя, имена объектов, составляющих запись и их типы. Общий вид такой:

 

Type

 

"имя записи" = Record

 

"поле 1": "тип 1";

 

"поле 2": "тип 2";

 

...

 

"поле n": "тип n"

 

End;

 

Оператор присоединения позволяет осуществлять доступ к полям записи, таким образом, как если бы они были простыми переменными. Его общий вид: With <имя записи> Do <оператор>. Внутри оператора к компонентам записи можно обращаться только с помощью имени соответствующего поля.

Для обращения к полю записи используется составное имя, в котором необходимо указать путь от вершины до нужного поля.

 

Ввод, вывод и др. операции над записью выполняются для отдельных полей, в соответствии с их типами.

 

Доступ к полям записи

 

Его можно осуществить двумя способами.

 

Указанием имени переменной и имени поля. Например, klass[2].fam, klass[3].sb, klass[1].b4. Поэтому ввод фамилий и оценок учащихся, то есть элементов массива klass, можно задать так:

 

For i: = 1 To 25 Do

 

Begin

 

Readln(klass[i].fam);

 

Readln(klass[i].b1);

 

Readln(klass[i].b2);

 

Readln(klass[i].b3);

 

Readln(klass[i].b4);

 

Readln(klass[i].b5);

 

End;

 

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

 

With <имя записи> Do <оператор>.

 

Внутри оператора к компонентам записи можно обращаться только с помощью имени соответствующего поля.

 

9. Методы объекта и их реализация с помощью процедур и функций..

 

Базовым в объектно-ориентированном программировании является понятие объекта. Состояние объекта задаётся значениями его признаков. Объект «знает», как решать определённые задачи, то есть располагает методами решения. Программа, написанная с использованием ООП, состоит из объектов, которые могут взаимодействовать между собой.

 

Программная реализация объекта представляет собой объединение данных и процедур их обработки. Переменные объектного типа называют экземплярами объекта.

 

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

 

Методы — это процедуры и функции, которые принадлежат объекту. методы описываются внутри объявления объекта и бывают нескольких типов.

 

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

 

virtual (виртуальные) — такие методы могут быть переопределены в потомках объекта. Например, если у вас есть объект гараж и метод ворота, то в его потомке этот метод может быть заменен улучшенной версией. Для определения адреса Delphi строит таблицу виртуальных методов, которая позволяет во время выполнения программы определить адрес метода. В такой таблице хранятся все методы текущего объекта и его предка.

 

Dynamic (динамические) — эти методы схожи с виртуальными, но для определения адреса используется другой способ. Для каждого объекта строится таблица только из его методов. Каждому методу назначается уникальный индекс. В данном случае экономится память, потому что не надо хранить адреса методов предков, но для поиска любого из них тратится намного больше времени.

 

Message (сообщения) — такие метода реагируют на события операционной системы. Для большинства сообщений ОС Windows в Delphi уже есть специальные обработчики событий, но если вам нужно, чтобы метод реагировал на определенное событие, которого нет у компонента, необходимо определить его вручную.

 

Abstract (абстрактный) — такой метод будет только объявлен в объекте, а реализации у него не будет. Если в объекте есть хотя бы один такой метод, то он считается абстрактным. Такой объект нельзя использовать.

 

10. Конструкторы и деструкторы.

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

 

Конструкторы и деструкторы - это специальные методы класса. Разумеется, эти методы обладают целым рядом особенностей (именно по этому они и выделены в специальную группу). Их особенности:

 

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

 

Второе. В отличии от других методов конструктор и деструктор вызываются сами (а другие методы мы вызываем явным образом). Конструктор вызывается в момент создания экземпляра класса, а деструктор - в момент уничтожения. Т. е. их не надо вызывать явным образом - они вызываются сами. Именно поэтому конструкторы обычно используются для задания некоторых начальных значений для переменных класса, а деструкторы - для освобождения памяти (в случае если у вас есть внутри класса переменные-указатели).

 

Третье. Ни конструктор, ни деструктор не возвращают никакого значения (даже типа void). Это означает, в частности, что при обяъвлении конструтора и деструктора в классе мы перед ними не пишем ни какой тип.

 

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

 

Наследование объектов

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

этой возможностью на практике. Допустим, что у нас есть объект, описы-

вающий точку, — TMyPoint. Он может выглядеть следующим образом:

TmyPoint = class

protected

PointX, PointY:Integer;

public

constructor Create(X,Y: Integer); virtual;

procedure Draw; virtual;

end; '

В данном случае у нас объект, который не имеет предков. В таких случаях

берется базовый объект TObject. Он дает нам базовые функции, необходи-

мые любому объекту. В разделе protected объявлены две переменные

PointX и PointY, которые будут являться координатами точки. Это значит,

что доступ к ним сможет получить только этот объект или его потомок.

В разделе public объявлены две процедуры, которые будут доступны всем.

Первая — это конструктор (constructor) с именем create. Конструктор —

это такая же процедура, только вместо ключевого слова procedure нужно

написать constructor и дать имя create. Этой процедурой мы будем созда-

вать данный объект во время выполнения программы. Внутри ее можно вы-

полнить какие-то начальные действия (выделить необходимую память, уста-

новить значение переменных по умолчанию и т. д.).

В данном случае конструктору передаются координаты точки, и в нем мы

можем сохранить эти значения, используя переменные Pointx и PointY.

Вот как это будет выглядеть:

constructor TMyPoint.Create(X, Y: Integer);

begin

PointX:=X;

PointY:=Y;

.

end;

Основы языка программирования Delphi 121

Процедуру Draw мы не будем описывать, просто представим, что она выво-

дит на экран точку.

Конструктор и процедура у нашего объекта объявлены виртуальными. Об

этом говорит соответствующее ключевое слово (virtual) в конце объявле-

ния. Это сделано для того, чтобы потомки могли создавать свою реализацию

конструктора и метода рисования.

Теперь допустим, что требуется создать объект линии. Для этого нам нужно

описать свойства четырех координат, конструктор и метод рисования. Мож-

но все это создать с нуля, а можно вывести из объекта точки, который уже

имеет половину необходимого. Объявление объекта линии может выглядеть

примерно так:

TmyLine = class (TMyPoint)

protected

PointXl, PointYl:Integer;

public

constructor Create(X,Y,XI,Yl: Integer); reintroduce;

procedure Draw; override;

end;

Этот объект у нас является наследником от TMyPoint, а значит, наследует

все его свойства и методы. О том, что у нас объект наследник, говорится в

объявлении имени базового объекта (в скобках после ключевого слова

class).

В этом объекте объявлены две переменные Pointxi и PointYl, которые

описывают координаты второй точки. Координаты первой точки наследуются

из базового объекта, поэтому нам не надо их описывать.

Метод create уже содержит четыре параметра, которые будут описывать

координаты двух точек. После объявления этого метода стоит ключевое сло-

во reintroduce. Зачем оно нужно? У базового объекта тоже есть конструк-

тор, но у него два параметра, а у нашего конструктора четыре. Когда мы пе-

реопределяем метод и в новой версии количество параметров изменилось,

то мы должны поставить такое ключевое слово, чтобы показать компилято-

ру, что мы изменили параметры корректно.

Реализация конструктора может выглядеть следующим образом:

Constructor TMyLine.Create(X,Y,X1,Yl:Integer);

begin

inherited Create(X,Y);

PointXl:=X1;

PointYl:=Y1;

end;

/22 Глава 5

В самом начале стоит ключевое слово inherited. Этим мы говорим, что

нужно вызвать конструктор предка (объекта TMyPoint). После этого ключе-

вого слова мы пишем имя конструктора предка и указываем, какие пара-

метры нужно ему передать. В данном случае передаются координаты первой

точки. Предок сохранит эти координаты в переменных Pointx и Pointy.

Когда количество параметров у предка и наследника одинаковое, то можно

ПрОСТО указать КЛЮЧеВОе СЛОВО inherited;.

После этого мы сохраняем координаты второй точки в переменных Pointxi

И PointYl.

'

После объявления метода Draw у нас стоит ключевое слово override. Оно

говорит о том, что мы перекрываем такой же виртуальный метод в объекте

предка.

Чуть позже мы на практике научимся создавать объекты и работать с ними,

а пока с теорией закончим.

Внутри каждого объекта существует переменная Self, которая указывает на

него самого. Если вам нужно обратиться к переменной или методу объекта,

явно указав принадлежность, то можно написать self.имя. В принципе, эту

переменную мы будем использовать, когда нужно вызвать какую-то про-

цедуру и передать ей объект, из которого мы делали вызов.

CallFunc(Self);

В приведенном выше примере мы вызвали процедуру CallFunc, а в качестве

параметра передали текущий объект.

11. Палитра компонентов. Окно Формы. Инспектор объектов. Окно редактора кода (Среда DELPHI).

 

Палитра компонентов Наверное, наиболее часто используемый элемент Delphi IDE - Палитра компонентов. Это инструментальная панель с множеством закладок, расположенная в верхней части экрана. На Палитре компонентов расположены все компоненты, установленные в среде Delphi. Для удобства компоненты располагаются на разных закладках.

Палитра компонентов состоит из нескольких вкладок.

Standard — все эти компоненты являются аналогами компонентов Windows.

Additional — дополнительные компоненты.

Win32 — компоненты, которые есть только в семействе ОС Win32. В это

семейство входят Windows 9x, Windows ME, Windows 2000, Windows NT,

Windows XP. Наверно, легче было сказать, что не входит, потому что это

только Windows 3.1.

System — системные компоненты, с помощью которых облегчается до-


Дата добавления: 2015-07-25; просмотров: 50 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Достоинства ООП| События в Delphi 2 страница

mybiblioteka.su - 2015-2024 год. (0.055 сек.)