Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля для инженера - выпуск 4


Информационный Канал Subscribe.Ru

Программирование с нуля для инженера - компоненты в среде Delphi, библиотека компонентов (выпуск 4)
  • Архив рассылки: ssdg.h15.ru/resources.php?internalpart=maillist
  • Автор рассылки: Седлярский Илья
  • Периодичность выхода: раз в неделю
  • Содержание
    Предисловие.
    Внимательно проанализировав материал третьего выпуска, я понял, что его материал содержит в себе ответы на многие вопросы. Ещё я понял, что нужно обладать определённым опытом и уверенностью в себе, чтобы увидеть, какая именно строчка содержит ответ на возникший вопрос.
    Я попросил инженера, который учится программировать, прочитать выпуск и посмотреть примеры. У него возникли сложности. Но не те, какие я ожидал. При попытке целиком понять суть работы примеров он пользовался своим опытом в других областях, проводил верные по его мнению аналогии, и в результате пришёл к ошибочным выводам. Не пытайтесь понять всё сразу! Если какой-либо участок кода выходит за пределы изложенного материала, не пытайтесь с ходу "переварить" его. Старайтесь обращать больше внимания на то, что относится к тому выпуску, к которому приложены примеры. Но если вы чувствуете, что в материале чего-то не хватает, он плохо изложен, или просто хотите задать вопрос на интересующую вас тему, пишите.
    Ещё небольшое дополнение к третьему выпуску. В настройках редактора кода, на вкладке "Display", флаг Preserve line ends не был корректно описан. При установке флага редактор кода удаляет лишние пробелы, табуляции в концах строк (так как они не имеют никакого смысла).

    У некоторых людей возникли проблемы при скачивании примеров. Я не знал об одной неприятной особенности бесплатного хостинга, где расположен наш сайт: при попытке скачать файл с сайта, но не со страниц этого же сайта, сервер сначала направляет вас на свою специальную страницу, где создаёт ссылку на файл. В связи с этим вводить адрес файла в менеджер закачек и сразу качать файл не удаётся. Иначе говоря, скачать файл по прямой ссылке просто так не получится. Некоторые люди отписались от рассылки по этой причине.
    Вторая проблема - блокирование файрволом поля REFERRER (адрес ссылающейся страницы). Причиной невозможности скачать файл фактически является опять-таки вышеописанная особенность хостинг-сервера. Если в поле REFERRER находится не страница нашего сайта, сервер не даст скачать файл, сколько бы вы ни пытались. Несколько раз уже замечал, что посетители, пользующиеся файрволом Outpost, не могут ничего скачать с сайта. Простейший выход - отключить файрвол на время закачки файла.
    Чтобы отключить блокирование поля REFERRER в Outpost Firewall, выберите сначала пункт меню "Options" -> "Plug-Ins Setup...". Там выберите плагин "Active Content" и нажмите кнопку "Settings" справа. В открывшемся окне на вкладке "Web Pages" есть элемент списка "Referrers". Выделите его. Справа появится группа радиокнопок для изменения настройки. Выберите пункт "Permit". Жмите "OK".
    Рассылка выходит в трёх системах подписок, и я планировал, что все подписчики будут получать одинаковые выпуски. Подписчики системы Subscribe не могут получать вложения, так как для бронзовых рассылок, к числу которых принадлежит эта, такая услуга отключена. Поэтому я хотел выкладывать примеры и другие файлы на сайте. Но теперь решено прикладывать файлы к выпускам для подписчиков систем Content и Maillist. Подписавшимся в системе Subscribe придётся скачивать файлы с сайта.
    Что представляют из себя компоненты. Библиотека компонентов.
    Представьте себе, что ваша программа - дом. Чтобы построить дом, необходимо иметь готовые материалы для строительства. Вы не будете строить дом голыми руками, из глины, а возьмёте плиты, панели, краны и начнёте спокойно строить, будучи в полной уверенности, что дом не свалится в один прекрасный момент.
    Конечно, гораздо удобнее строить из готовых материалов и с помощью специальных инструментов. Компоненты и есть такие готовые материалы в совокупности с готовыми инструментами. Запустите Delphi, если она ещё не запущена. На палитре компонентов на вкладке "Standart" выберите мышкой пиктограмму с рамкой, внутри которой написано "ab". Выберите место для помещения компонента на форме и поместите его. Вы видите перед собой компонент TEdit - простое текстовое поле. Это один из наиболее часто используемых компонентов. Для ввода и удаления текста, контроля максимальной длины строки, введённой в поле, вставки текста из буфера, а также использования других функций вам не придётся делать практически ничего. В этом и заключается одна из идей современного программирования - при написании программы каждый раз не надо изобретать велосипед, а можно воспользоваться уже готовым и приспособить его для своих нужд.

    Объекты и компоненты
    Компонент, как и сама программа, в исходном виде представляет из себя код на языке программирования. Исходный код компонента располагается как минимум в одном модуле. В большинстве языков программирования есть понятие объекта. Компоненты также являются объектами. Объекты состоят из свойств и методов.
    Что такое свойство, думаю, понятно. Например, у принтера есть такие свойства, как тип (матричный, струйный, лазерный), скорость печати, поддерживаемые форматы бумаги. Метод - это подпрограмма, воздействующая на объект. То, что подпрограмма - часть программы, вам уже известно. Метод, в отличие от простой, не связанной с каким-либо объектом подпрограммы, должен изменять свойства объекта либо использовать свойства объекта для возврата значения или других целей. Также есть отдельные виды методов для создания и уничтожения объектов. Методы могут быть открытыми или закрытыми. Закрытые методы могут неявно вызываться при изменении свойств компонента.
    Каждый объект имеет свой класс. В описании класса определяются свойства, методы компонента. Вы можете создавать любое число объектов одного класса. Они называются экземплярами класса. Методы объектов могут воздействовать только на "свои" экземпляры.
    Например, у вас есть объект Printer (имеется в виду имя объекта). Он имеет свойства PrintSpeed (скорость печати, измеряется в страницах в минуту), Buffer (буфер печати), методы GetPrintSpeed (получить скорость печати), SetPrintSpeed (задать скорость печати), SetBuffer (задать буфер печати), PrintDocument (распечатать документ). Вот такой хороший принтер, позволяет регулировать скорость печати. Чтобы узнать скорость печати принтера, обращаемся к свойству PrintSpeed. Это выглядит так: Printer.PrintSpeed. Используя этот идентификатор, можно прочитать значение переменной или изменить его. Точка позволяет выбрать свойство или метод объекта. Printer.GetPrintSpeed() - вызов метода объекта. Этот метод возвращает нам значение свойства Printer.PrintSpeed. Пустые скобки после имени метода можно не писать, но так легче отличить метод от свойства. В общем случае в скобках должен находиться список передаваемых подпрограмме-методу параметров.
    Возникает вопрос: а можно ли разрешить напрямую менять значение переменной PrintSpeed? Захотите вы установить скорость 150 страниц в минуту, так вам никто не запретит. Что с принтером случится при попытке распечатать что-то с такой скоростью... Поэтому мы будем обращаться к методу SetPrintSpeed, а он будет решать, разрешить нам установить желаемую скорость или нет. Если она находится в интервале, например, от 2 до 10 страниц в минуту, он изменит значение переменной PrintSpeed и скажет вам об этом (вернёт 1 в качестве результата). Если вы передали методу "неправильное" значение скорости печати, он не изменит текущую скорость и передаст вам 0.
  • Printer.SetPrintSpeed(150) - попытка установить слишком высокую скорость прошла безуспешно.
  • Printer.SetPrintSpeed(6) - успешная попытка установить приемлемую скорость.

  • Предположу, что о полезности метода PrintDocument не стоит писать: сможете (и захотите ли) вы сами написать код для управления печатью? Метод SetBuffer используется для связывания буфера печати с принтером.
    Свойства компонентов можно изменять только с помощью методов. Таково правило языка Object Pascal, который используется в среде Delphi. Другое дело, что при кажущемся вам прямом изменении значения свойства участвует метод. Если вы пишете Printer.PrintSpeed := 10;, программа будет содержать код, эквивалентный вызову Printer.SetPrintSpeed(10);.

    Компоненты делятся на визуальные и невизуальные. Визуальные - те, которые мы можем видеть при работе программы. Невизуальные, соответственно, видеть не можем, но использовать их в программе также можем. Пример невизуального компонента - таймер. Через определённые промежутки времени он вызывает обработчик события OnTimer.
    Кроме методов у компонентов есть события. Событие - реакция на определённое действие. Например, пользователь подвёл мышь к полю ввода, или нажал клавишу на клавиатуре. Вы можете вызвать обработчик события сами, не дожидаясь, когда событие произойдёт и он будет вызван автоматически. Методы заранее предопределены (написаны), а обработчики событий вы пишете сами. В этом их основное различие.

    Иерархическая структура компонентов
    Компоненты не являются обособленными объектами. Они образуют большую иерархическую структуру с классом TObject во главе. Компоненты обладают возможностью наследования. Компонент-потомок содержит те же свойства, методы и события, что и его родитель. Кроме этого, вы можете добавить к нему новые свойства, методы или события. У потомка возможна замена методов предка на новые.
    Поскольку некоторые свойства определены на верхушке дерева компонентов, они присутствуют почти у всех компонентов. К примеру, у визуальных компонентов есть свойство Visible, определяющее видимость компонента. Оно имеет одинаковый смысл для всех визуальных компонентов.
    Многие элементы программы являются компонентами. Даже окна приложения - тоже компоненты, принадлежащие компоненту Application (приложение!). Некоторые визуальные компоненты могут являться родителями для других. Имеется в виду помещение одного компонента (дочернего) в область, занимаемую вторым (родительским). При этом наследованные свойства потомка по умолчанию принимают те же значения, что и у его родителя. В примерах, приложенных к выпуску, это выглядит нагляднее и понятнее.

    VCL - библиотека визуальных компонентов.
    VCL расшифровывается как Visual Component Library. Компоненты VCL вы видите на палитре компонентов. Они являются конечными звеньями в дереве компонентов. По умолчанию в Delphi 5 19 вкладок с компонентами. Первые три вкладки - Standart, Additional, Win32 - содержат наиболее часто используемые компоненты, которые необходимы при проектировании интерфейса программы.

    Объекты, компоненты, иерархические связи между ними - всё это придумано для облегчения труда программистам. Человеку проще мыслить, опираясь на компоненты и объекты, их связи, поскольку структура - привычный и эффективный способ организации. К тому же использование таких элементов в программировании существенно снижает объём кода, а следовательно, и вероятность ошибок.
    Разделение кода программы на подпрограммы и модули стало первым шагом к облегчению труда разработчика. Такой тип программирования, использующий разделение на подпрограммы и модули, называется структурным.
    Языки, содержащие понятия объектов и им сопутствующие, называются объектно-ориентированными, а программирование, соответственно, объектно-ориентированным (аббревиатура ООП).
    Но программа так и остаётся последовательностью команд. На уровне процессора не существует объектов, компонентов, связей. Нагрузка по переведению исходного кода в исполняемый ложится на компиляторы.
    Работа с компонентами.
    Визуальные компоненты используются для построения графического интерфейса программы. Никаких особых навыков для работы с компонентами не требуется, зато надо знать их свойства, методы, события. Привычка работы в Delphi приходит со временем.
    Главный инструмент для работы с компонентами - инспектор объектов (Object Inspector). Для перехода в его окно используется клавиша F11.
    В самом верху окна находится выпадающий список, содержащий список всех компонентов, установленных на выделенной форме. Когда вы раскрываете список, вы видите в нём имена компонентов. После выбора компонента показывается ещё и его класс. Например, Button1: TButton. Хочу отметить, что по отношению к компонентам понятия "тип" и "класс" употребляются оба, наравне, хотя между типом и классом есть существенные различия.
    Ниже находятся 2 вкладки - Properties (свойства) и Events (события). На первой вам предлагается редактировать свойства компонента, на второй - его события. Информация о свойствах расположена в виде таблицы. Слева находятся имена свойств, справа - текущие значения. В правой колонке вы можете редактировать значения свойств. Свойства компонентов могут в свою очередь являться объектами, которые содержат вложенные свойства и методы. В случае наличия вложенных свойств слева от имени свойства находится плюсик, при нажатии на который свойство раскрывается в список подсвойств. К таким относится, например, шрифт компонента (Font). Каждое простое (не имеющее вложенных) свойство компонента соответственно имеет простой тип. Подробнее о типах свойств компонентов будет написано в следующем выпуске.
    Вкладка Events содержит список обработчиков событий для выбранного компонента. Данные представлены в том же виде, что и свойства. Но событие - не свойство, его обработчик нужно писать вручную. По двойному щелчку на выбранной строчке правой колонки среда автоматически создаст пустую заготовку обработчика и пропишет её там, где надо (в открытой части описания класса текущей формы). У редактора есть интересная особенность - если вы попытаетесь сохранить модуль с пустыми обработчиками событий, перед сохранением он их удалит за ненадобностью!
    У каждого компонента есть один основной обработчик. При двойном щелчке на компоненте редактор кода создаст заготовку основного обработчика кода и переместит вас туда. Клавиша F12 служит для быстрого переключения между окнами редактора кода и окном выбранной формы.
    На каждой из двух вкладок данные по умолчанию отсортированы в алфавитном порядке по левому столбцу. Вызвав контекстное меню на таблице, вы можете настроить инспектор объектов для более удобного вам представления. Опишу некоторые пункты этого меню.
    • Пункт View - позволяет выбрать категории компонентов, которые нужно показывать. Рекомендую выбирать пункт "All", чтобы видеть все свойства/методы, даже если вы их не знаете.
    • Пункт Arrange - тип представления данных. По умолчанию выбрано "by Name". При выборе "by Category" свойства/методы будут отображены по категориям. Мне больше нравится сортировка по имени (вариант по умолчанию).
    • Пункт Dockable - при включённом флажке окно инспектора сможет встраиваться в окно редактора кода. Иногда бывает очень полезно.
    Заключение
    Честно говоря, я планировал в этом выпуске описать компоненты со вкладки "Standart", но затем решил сделать отдельный выпуск, посвящённый описанию компонентов с первых трёх вкладок. Он и будет следующим, а в шестом выпуске я хочу приступить к рассмотрению языка Object Pascal, использующегося в среде Delphi.
    Для тех, кто не получил вложение с примерами, ссылка на примеры.

    Subscribe.Ru
    Поддержка подписчиков
    Другие рассылки этой тематики
    Другие рассылки этого автора
    Подписан адрес:
    Код этой рассылки: comp.soft.others.prog2eng
    Отписаться
    Вспомнить пароль

    В избранное