В данной статье дается обзор
среды программирования Delphi.
Обсуждаются главные части рабочей
среды и охватываются такие важные
вопросы как требования к системным
ресурсам и основные части
программы, созданной в Delphi. В конце
статьи можно найти короткое
обсуждение тьюторов.
Данная статья предполагает
наличие знаний о:
- Использовании Windows
- Простейших программных
конструкциях таких, как
переменные, циклы и функции
Требования к системным и
программным ресурсам
Delphi это высокопроизводительный
инструмент создания приложений.
Текущая версия является
16-разрядным компилятором для
создания программ, работающих в
среде Windows 3.1. Delphi 2.0, которая
появится в начале 1996 года, будет
включать полный 32-разрядный
компилятор для использования в Windows
95 или в Windows NT.
Для запуска Delphi требуется 386
компьютер с 4MB памяти. Более
подходящей машиной будет 486DX 66MHz с 8MB
ОЗУ.
Небольшие программы, созданные на
Delphi будут работать на любом
компьютере. Другими словами, они не
требуют того ОЗУ или скорости
процессора, что необходимо для
среды Delphi.
Структура среды
программирования
Внешний вид среды
программирования Delphi отличается от
многих других из тех, что можно
увидеть в Windows. К примеру, Borland Pascal for
Windows 7.0, Borland C++ 4.0, Word for Windows, Program Manager -
это все MDI приложения и выглядят
по-другому, чем Delphi. MDI (Multiple Document
Interface) - определяет особый способ
управления нескольких дочерних
окон внутри одного большого окна.
Среда Delphi же следует другой
спецификации, называемой Single Document
Interface (SDI), и состоит из нескольких
отдельно расположенных окон. Это
было сделано из-за того, что SDI
близок к той модели приложений, что
используется в Windows 95.
Если Вы используете SDI приложение
типа Delphi, то уже знаете, что перед
началом работы лучше
минимизировать другие приложения,
чтобы их окна не загромождали
рабочее пространство. Если нужно
переключиться на другое
приложение, то просто щелкните
мышкой на системную кнопку
минимизации Delphi. Вместе с главным
окном свернутся все остальные окна
среды программирования, освободив
место для работы других программ.
Главные составные части среды
программирования
Ниже перечислены основные составные части Delphi:
Дизайнер Форм (Form Designer)
Окно Редактора Исходного Текста
(Editor Window)
Палитра Компонент (Component Palette)
Инспектор Объектов (Object Inspector)
Справочник (On-line help)
Есть, конечно, и другие важные
составляющие Delphi, вроде линейки
инструментов, системного меню и
многие другие, нужные Вам для
точной настройки программы и среды
программирования. Программисты на Delphi проводят
большинство времени переключаясь
между Дизайнером Форм и Окном
Редактора Исходного Текста
(которое для краткости называют
Редактор). Прежде чем Вы начнете,
убедитесь, что можете распознать
эти два важных элемента. Дизайнер
Форм показан на рис.1, окно
Редактора - на рис.2.
Дизайнер Форм в Delphi столь
интуитивно понятен и прост в
использовании, что создание
визуального интерфейса
превращается в детскую игру.
Дизайнер Форм первоначально
состоит из одного пустого окна,
которое Вы заполняете
всевозможными объектами,
выбранными на Палитре Компонент.
Несмотря на всю важность
Дизайнера Форм, местом, где
программисты проводят основное
время является Редактор. Логика
является движущей силой программы
и Редактор - то место, где Вы ее
“кодируете”.
Палитра Компонент (см. рис.3)
позволяет Вам выбрать нужные
объекты для размещения их на
Дизайнере Форм. Для использования
Палитры Компонент просто первый
раз щелкните мышкой на один из
объектов и потом второй раз - на
Дизайнере Форм. Выбранный Вами
объект появится на проектируемом
окне и им можно манипулировать с
помощью мыши.
Палитра Компонент использует
постраничную группировку объектов.
Внизу Палитры находится набор
закладок - Standard, Additional, Dialogs и т.д.
Если Вы щелкнете мышью на одну из
закладок, то Вы можете перейти на
следующую страницу Палитры
Компонент. Принцип разбиения на
страницы широко используется в
среде программирования Delphi и его
легко можно использовать в своей
программе. (На странице Additional есть
компоненты для организации страниц
с закладками сверху и снизу).
Рис.3: Палитра Компонент -
место, где Вы выбираете объекты,
которые будут помещены на вашу
форму.
Предположим, Вы помещаете
компонент TEdit на форму; Вы можете
двигать его с места на место. Вы
также можете использовать границу,
прорисованную вокруг объекта для
изменения его размеров.
Большинством других компонент
можно манипулировать тем же
образом. Однако, невидимые во время
выполнения программы компоненты
(типа TMenu или TDataBase) не меняют своей
формы.
Слева от Дизайнера Форм Вы можете
видеть Инспектор Объектов (рис.4).
Заметьте, что информация в
Инспекторе Объектов меняется в
зависимости от объекта, выбранного
на форме. Важно понять, что каждый
компонент является настоящим
объектом и Вы можете менять его вид
и поведение с помощью Инспектора
Объектов.
Инспектор Объектов состоит из
двух страниц, каждую из которых
можно использовать для определения
поведения данного компонента.
Первая страница - это список
свойств, вторая - список событий.
Если нужно изменить что-нибудь,
связанное с определенным
компонентом, то Вы обычно делаете
это в Инспекторе Объектов. К
примеру, Вы можете изменить имя и
размер компонента TLabel изменяя
свойства Caption, Left, Top, Height, и Width.
Вы можете использовать закладки
внизу Инспектора Объектов для
переключения между страницами
свойств и событий. Страница событий связана с
Редактором; если Вы дважды щелкнете
мышкой на правую сторону
какого-нибудь пункта, то
соответствующий данному событию
код автоматически запишется в
Редактор, сам Редактор немедленно
получит фокус, и Вы сразу же имеете
возможность добавить код
обработчика данного события.
Данный аспект среды
программирования Delphi будет еще
обсуждаться позднее.
Последняя важная часть среды Delphi -
Справочник (on-line help). Для доступа к
этому инструменту нужно просто
выбрать в системном меню пункт Help и
затем Contents. На экране появится
Справочник, показанный на рис.5
Рис.5: Справочник - быстрый поиск любой информации.
Справочник является
контекстно-зависимым; при нажатии
клавиши F1, Вы получите подсказку,
соответствующую текущей ситуации.
Например, находясь в Инспекторе
Объектов, выберите какое-нибудь
свойство и нажмите F1 - Вы получите
справку о назначении данного
свойства. Если в любой момент
работы в среде Delphi возникает
неясность или затруднение - жмите F1
и необходимая информация появится
на экране.
Дополнительные элементы
В данном разделе внимание
фокусируется на трех инструментах,
которые можно воспринимать как
вспомогательные для среды
программирования:
Меню предоставляет быстрый и
гибкий интерфейс к среде Delphi,
потому что может управляться по
набору “горячих клавиш”. Это
удобно еще и потому, что здесь
используются слова или короткие
фразы, более точные и понятные,
нежели иконки или пиктограммы. Вы
можете использовать меню для
выполнения широкого круга задач;
скорее всего, для наиболее общих
задач вроде открытия и закрытия
файлов, управления отладчиком или
настройкой среды программирования.
SpeedBar находится непосредственно
под меню, слева от Палитры
Компонент (рис.6). SpeedBar выполняет
много из того, что можно сделать
через меню. Если задержать мышь над
любой из иконок на SpeedBar, то Вы
увидите что появится подсказка,
объясняющая назначение данной
иконки.
Рис.6: SpeedBar находится слева от Палитры Компонент.
Редактор Картинок, показанный на
рис.7, работает аналогично
программе Paintbrush из Windows. Вы можете
получить доступ к этому модулю
выбрав пункт меню Tools | Image Editor.
Рис.7: Редактор Картинок
можно использовать для создания
картинок для кнопок, иконок и др.
визуальных частей для программы.
А теперь нужно рассмотреть те
элементы, которые программист на
Delphi использует в повседневной
жизни.
Инструментальные средства
В дополнение к инструментам,
обсуждавшимся выше, существуют
пять средств, поставляемых вместе с
Delphi. Эти инструментальные средства:
· · Встроенный отладчик
· · Внешний отладчик (поставляется
отдельно)
· · Компилятор командной строки
· · WinSight
· · WinSpector
Данные инструменты собраны в
отдельную категорию не потому, что
они менее важны, чем другие, но
потому, что они играют достаточно
абстрактную техническую роль в
программировании.
Чтобы стать сильным
программистом на Delphi, Вам
понадобится понять, как
использовать отладчик Delphi.
Отладчик позволяет Вам пройти
пошагово по исходному тексту
программы, выполняя по одной строке
за раз, и открыть просмотровое окно
(Watch), в котором будут отражаться
текущие значения переменных
программы.
Встроенный отладчик, который
наиболее важен из пяти
вышеперечисленных инструментов,
работает в том же окне, что и
Редактор. Внешний отладчик делает
все, что делает встроенный и кое-что
еще. Он более быстр и мощен, чем
встроенный. Однако он не так удобен
в использовании, главным образом
из-за необходимости покидать среду
Delphi.
Теперь давайте поговорим о
компиляторах. Внешний компилятор,
называется DCC.EXE, полезен, в
основном, если Вы хотите
скомпилировать приложение перед
отладкой его во внешнем отладчике.
Большинство программистов,
наверняка, посчитают, то гораздо
проще компилировать в среде Delphi,
нежели пытаться создать программу
из командной строки. Однако, всегда
найдется несколько оригиналов,
которые будут чувствовать себя
счастливее, используя компилятор
командной строки. Но это факт -
возможно создать и откомпилировать
программу на Delphi используя только
DCC.EXE и еще одну программу CONVERT.EXE,
которая поможет создать формы.
Однако, данный подход неудобен для
большинства программистов.
WinSight и WinSpector интересны
преимущественно для опытных
программистов в Windows. Это не значит,
что начинающий не должен их
запускать и экспериментировать с
ними по своему усмотрению. Но эти
инструменты вторичны и
используются для узких технических
целей.
Из этих двух инструментов WinSight
определенно более полезен.
Основная его функция - позволить
Вам наблюдать за системой
сообщений Windows. Хотя Delphi делает
много для того, чтобы спрятать
сложные детали данной системы
сообщений от неопытных
пользователей, тем не менее Windows
является операционной системой,
управляемой событиями. Почти все
главные и второстепенные события в
среде Windows принимают форму
сообщений, которые рассылаются с
большой интенсивностью среди
различными окнами на экране. Delphi
дает Вам полный доступ к сообщениям
Windows и позволяет отвечать на них,
как только будет нужно. В
результате, опытным пользователям
WinSight становится просто необходим.
WinSpector сохраняет запись о текущем
состоянии машины в текстовый файл;
Вы можете просмотреть этот файл для
того, чтобы узнать, что неправильно
идет в программе. Данный инструмент
полезен, когда программа находится
в опытной эксплуатации - можно
получить важную информацию при
крушении системы.
Стандартные компоненты
Для дальнейшего знакомства со
средой программирования Delphi
потребуется рассказать о составе
первой страницы Палитры Компонент.
На первой странице Палитры
Компонент размещены 14 объектов
(рис.8) определенно важных для
использования. Мало кто обойдется
длительное время без кнопок,
списков, окон ввода и т.д. Все эти
объекты такая же часть Windows, как
мышь или окно.
Набор и порядок компонент на
каждой странице являются
конфигурируемыми. Так, Вы можете
добавить к имеющимся компонентам
новые, изменить их количество и
порядок.
Рис.8: Компоненты,
расположенные на первой странице
Палитры.
Стандартные компоненты Delphi
перечислены ниже с некоторыми
комментариями по их применению. При
изучении данных компонент было бы
полезно иметь под рукой компьютер с
тем, чтобы посмотреть, как они
работают и как ими манипулировать.
· TMainMenu позволяет Вам поместить
главное меню в программу. При
помещении TMainMenu на форму это
выглядит, как просто иконка.
Иконки данного типа называют
"невидимыми компонентом",
поскольку они невидимы во
время выполнения программы.
Создание меню включает три
шага: (1) помещение TMainMenu на
форму, (2) вызов Дизайнера Меню
через свойство Items в Инспекторе
Объектов, (3) определение
пунктов меню в Дизайнере Меню. ·
TPopupMenu позволяет создавать
всплывающие меню. Этот тип меню
появляется по щелчку правой
кнопки мыши.
· TLabel служит для отображения
текста на экране. Вы можете
изменить шрифт и цвет метки,
если дважды щелкнете на
свойство Font в Инспекторе
Объектов. Вы увидите, что это
легко сделать и во время
выполнения программы, написав
всего одну строчку кода.
· TEdit - стандартный
управляющий элемент Windows для
ввода. Он может быть
использован для отображения
короткого фрагмента текста и
позволяет пользователю
вводить текст во время
выполнения программы.
· TMemo - иная форма TEdit.
Подразумевает работу с
большими текстами. TMemo может
переносить слова, сохранять в
Clipboard фрагменты текста и
восстанавливать их, и другие
основные функции редактора. TMemo
имеет ограничения на объем
текста в 32Кб, это составляет 10-20
страниц. (Есть VBX и “родные”
компоненты Delphi, где этот предел
снят).
· TButton позволяет выполнить
какие-либо действия при
нажатии кнопки во время
выполнения программы. В Delphi все
делается очень просто.
Поместив TButton на форму, Вы по
двойному щелчку можете создать
заготовку обработчика события
нажатия кнопки. Далее нужно
заполнить заготовку кодом
(подчеркнуто то, что нужно
написать вручную):
procedure TForm1.Button1Click(Sender:
TObject);
begin
MessageDlg('Are you
there?',mtConfirmation,mbYesNoCancel,0);
end;
· TCheckBox отображает строку
текста с маленьким окошком
рядом. В окошке можно поставить
отметку, которая означает, что
что-то выбрано. Например, если
посмотреть окно диалога
настроек компилятора (пункт
меню Options | Project, страница Compiler),
то можно увидеть, что оно
состоит преимущественно из
CheckBox’ов. · TRadioButton позволяет
выбрать только одну опцию из
нескольких. Если Вы опять
откроете диалог Options | Project и
выберете страницу Linker Options, то
Вы можете видеть, что секции Map
file и Link buffer file состоят из
наборов RadioButton.
· TListBox нужен для показа
прокручиваемого списка.
Классический пример ListBox’а в
среде Windows - выбор файла из
списка в пункте меню File | Open
многих приложений. Названия
файлов или директорий и
находятся в ListBox’е.
· TComboBox во многом напоминает
ListBox, за исключением того, что
позволяет водить информацию в
маленьком поле ввода сверху
ListBox. Есть несколько типов ComboBox,
но наиболее популярен
выпадающий вниз (drop-down combo box),
который можно видеть внизу
окна диалога выбора файла.
· TScrollbar - полоса прокрутки,
появляется автоматически в
объектах редактирования,
ListBox’ах при необходимости
прокрутки текста для
просмотра.
· TGroupBox используется для
визуальных целей и для
указания Windows, каков порядок
перемещения по компонентам на
форме (при нажатии клавиши TAB).
· TPanel - управляющий элемент,
похожий на TGroupBox, используется
в декоративных целях. Чтобы
использовать TPanel, просто
поместите его на форму и затем
положите другие компоненты на
него. Теперь при перемещении
TPanel будут передвигаться и эти
компоненты. TPanel используется
также для создания линейки
инструментов и окна статуса.
TScrollBox представляет место на
форме, которое можно
скроллировать в вертикальном и
горизонтальном направлениях.
Пока Вы в явном виде не
отключите эту возможность,
форма сама по себе действует
так же. Однако, могут быть
случаи, когда понадобится
прокручивать только часть
формы. В таких случаях
используется TScrollBox.
Это полный список объектов на
первой странице Палитры Компонент.
Если Вам нужна дополнительная
информация, то выберите на Палитре
объект и нажмите клавишу F1 -
появится Справочник с полным
описанием данного объекта.
Подробнее об Инспекторе Объектов
Ранее мы вкратце рассмотрели
Инспектор Объектов (Object Inspector).
Теперь нужно исследовать этот
важный инструмент глубже. Основное
для понимания Инспектора Объектов
состоит в том, что он используется
для изменения характеристик любого
объекта, брошенного на форму. Кроме
того, и для изменения свойств самой
формы.
Лучший путь для изучения
Инспектора объектов - поработать с
ним. Для начала откройте новый
проект, выбрав пункт меню File | New
Project. Затем положите на форму
объекты TMemo, TButton, и TListBox, как
показано на рис.9.
Рис.9: Простой объект TForm с компонентами TMemo, TButton, и TListBox.
Сперва рассмотрим работу со
свойствами на примере свойства Ctl3D
(по умолчанию включено). Выберите
форму, щелкнув на ней мышкой,
перейдите в Инспектор Объектов и
несколько раз с помощью двойных
щелчков мышью переключите значение
свойства Ctl3D. Заметьте, что это
действие радикально меняет внешний
вид формы. Изменение свойства Ctl3D
формы автоматически изменяет
свойство Ctl3D каждого дочернего
окна, помещенного на форму.
Вернитесь на форму и поставьте
значение Ctl3D в True. Теперь нажмите
клавишу <Shift> и щелкните на TMemo и
затем на TListBox. Теперь оба объекта
имеют по краям маленькие
квадратики, показывающие, что
объекты выбраны.
Выбрав два или более
объектов одновременно, Вы можете
выполнить большое число операций
над ними. Например, передвигать по
форме. Затем попробуйте выбрать
пункт меню Edit | Size и установить оба
поля Ширину(Width) и Высоту(Height) в Grow to
Largest, как показано на рис.10. Теперь
оба объекта стали одинакового
размера. Затем выберите пункт меню
Edit | Align и поставьте в выравнивании
по горизонтали значение Center (см.
рис.11).
Поскольку
Вы выбрали сразу два компонента, то
содержимое Инспектора Объектов
изменится - он будет показывать
только те поля, которые являются
общими для объектов. Это означает
то, что изменения в свойствах,
произведенные Вами повлияют не на
один, а на все выбранные объекты.
Рассмотрим изменение свойств
объектов на примере свойства Color.
Есть три способа изменить его
значение в Инспекторе Объектов.
Первый - просто напечатать имя
цвета (clRed) или номер цвета. Второй
путь - нажать на маленькую стрелку
справа и выбрать цвет из списка.
Третий путь - дважды щелкнуть на
поле ввода свойства Color. При этом
появится диалог выбора цвета.
Свойство Font работает на манер
свойства Color. Чтобы это посмотреть,
сначала выберите свойство Font для
объекта TMemo и дважды щелкните
мышкой на поле ввода. Появится
диалог настройки шрифта, как
показано на рис.12. Выберите,
например, шрифт New Times Roman и
установите какой-нибудь очень
большой размер, например 72. Затем
измените цвет фонта с помощью
ComboBox’а в нижнем правом углу окна
диалога. Когда Вы нажмете кнопку OK,
Вы увидите, что вид текста в объекте
TMemo радикально изменился.
Рис.12: Диалог выбора
шрифта позволяет Вам задать тип
шрифта, размер, и цвет.
В завершение краткого экскурса по
Инспектору Объектов дважды
щелкните на свойство Items объекта
ListBox. Появится диалог, в котором Вы
можете ввести строки для
отображения в ListBox. Напечатайте
несколько слов, по одному на каждой
строке, и нажмите кнопку OK. Текст
отобразится в ListBox’е.
Сохранение программы
Вы приложили некоторые усилия по
созданию программы и можете
захотеть ее сохранить. Это позволит
загрузить программу позже и снова с
ней поработать.
Первый шаг - создать
поддиректорию для программы. Лучше
всего создать директорию, где будут
храниться все Ваши программы и в
ней - создать поддиректорию для
данной конкретной программы.
Например, Вы можете создать
директорию MYCODE и внутри нее - вторую
директорию TIPS1, которая содержала
бы программу, над которой Вы только
что работали.
После создания поддиректории для
хранения Вашей программы нужно
выбрать пункт меню File | Save Project.
Сохранить нужно будет два файла.
Первый - модуль (unit), над которым Вы
работали, второй - главный файл
проекта, который "владеет"
Вашей программой. Сохраните модуль
под именем MAIN.PAS и проект под именем
TIPS1.DPR. (Любой файл с расширением PAS и
словом “unit” в начале является
модулем.)
TButton, исходный текст,
заголовки и Z-упорядочивание
Еще несколько возможностей
Инспектора Объектов и Дизайнера
Форм.
Создайте новый проект. Поместите на
форму объект TMemo, а затем TEdit так,
чтобы он наполовину перекрывал TMemo,
как показано на рис.13. Теперь
выберите пункт меню Edit | Send to Back, что
приведет к перемещению TEdit вглубь
формы, за объект TMemo. Это называется
изменением Z-порядка компонент.
Буква Z используется потому, что
обычно математики обозначают
третье измерение буквой Z. Так, X и Y
используются для обозначения
ширины и высоты, и Z используется
для обозначения глубины.
Рис. 13: Объект TEdit
перекрывается наполовину объектом
TMemo.
Если Вы “потеряли” на форме
какой-то объект, то найти его можно
в списке Combobox’а, который находится
в верхней части Инспектора
Объектов.
Поместите кнопку TButton в нижнюю
часть формы. Теперь растяните
Инспектор Объектов так, чтобы
свойства Name и Caption были видны
одновременно на экране. Теперь
измените имя кнопки на Terminate.
Заметьте, что заголовок (Caption)
поменялся в тот же момент. Такое
двойное изменение наблюдается
только если ранее не изменялось
свойство Caption.
Текст, который Вы видите на
поверхности кнопки - это содержимое
свойства Caption, свойство Name служит
для внутренних ссылок, Вы будете
использовать его при написании
кода программы. Если Вы откроете
сейчас окно Редактора, то увидите
следующий фрагмент кода:
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Terminate: TButton;
private
{ Private
declarations }
public
{ Public
declarations }
end;
В этом фрагменте кнопка TButton
называется Terminate из-за того, что Вы
присвоили это название свойству Name.
Заметьте, что TMemo имеет имя, которое
присваивается по умолчанию.
Перейдите на форму и дважды
щелкните мышкой на объект TButton. Вы
сразу попадете в окно Редактора, в
котором увидите фрагмент кода
вроде этого:
procedure
TForm1.TerminateClick(Sender: TObject);
begin
end;
Данный код был создан
автоматически и будет выполняться
всякий раз, когда во время работы
программы пользователь нажмет
кнопку Terminate. Вдобавок, Вы можете
видеть, что определение класса в
начале файла теперь включает
ссылку на метод TerminateClick:
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Terminate: TButton;
procedure TerminateClick(Sender: TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
Потратьте немного времени на
усвоение последовательности
действий, описанных выше.
Изначально Вы смотрите на кнопку на
форме. Вы делаете двойной щелчок на
эту кнопку, и соответствующий
фрагмент кода автоматически
заносится в Редактор.
Теперь самое время написать
строчку кода. Это очень простой код,
состоящий из одного слова Close:
procedure
TForm1.TerminateClick(Sender: TObject);
begin
Close;
end;
Когда этот код исполняется, то
главная форма (значит и все
приложение) закрывается. Для
проверки кода запустите программу
и нажмите кнопку Terminate. Если все
сделано правильно, программа
закроется и Вы вернетесь в режим
дизайна.
Прежде, чем перейти к следующему
разделу, перейдите в Инспектор
Объектов и измените значение
свойства Name для кнопки на любое
другое, например OK. Нажмите Enter для
внесения изменений. Посмотрите в
Редактор, Вы увидите, что код,
написанный Вами изменился:
procedure
TForm1.OkClick(Sender: TObject);
begin
Close;
end;
Заметьте, что аналогичные
изменения произошли и в
определении класса:
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Ok: TButton;
procedure OkClick(Sender: TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
Тьюторы (интерактивные
обучающие программы)
Delphi предоставляет тьютор,
содержащий несколько тем и который
можно запустить из пункта меню Help |
Interactive Tutors. Тьютор запускается
только если среда Delphi имеет все
установки по умолчанию. Если
конфигурация была изменена, то
проще всего сохранить файл DELPHI.INI
под другим именем и скопировать
файл DELPHI.CBT в DELPHI.INI.
В первых двух темах дается
краткий обзор Delphi и происходит
обучение построению простейшего
приложения.
Остальные темы посвящены
построению пользовательского
интерфейса: размещению объектов на
форме, настройке их свойств и
написанию обработчиков событий. А
также созданию приложений,
работающих с базами данных.
[ Предыдущий урок | Содержание | Следующий урок ]
|