суббота, 20 февраля 2010 г.

Точки и переменные в IC

Продолжаем тему InlineCode в HiAsm. Сегодня нам предстоит познакомиться с остальными точками компонента InlineCode (в прошлой статье я рассказывал только про методы), а также с использованием переменных в IC.

Сначала познакомимся с переменными. Это проще.

Если в на рабочем поле HiAsm компонент Memory (который как раз и является компонентом-переменной) можно поставить в любое место, то в коде Pascal переменные объявляются в строго отведённых для этого местах. Переменные в коде Pascal бывают глобальные и локальные. В HiAsm тоже есть глобальные переменные, но там они носят чисто условный характер, потому что тот же компонент Memory можно использовать в любой части схемы (через нижнюю его точку).

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

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

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



Как видите, локальные переменные объявляются в разделе var для каждой процедуры/функции перед begin…end. Процедура и функция используют переменную i, но для каждой из них эта переменная имеет разные значения. Сначала переменной присваивается значение 10 в процедуре Proba. В сообщении же вызывается функция mat, у которой своя переменная i, и значение там совсем другое. И следует понимать, что это две разные переменные, несмотря на одинаковое имя.


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

Но давайте теперь рассмотрим глобальную переменную.



Глобальная переменная объявлена в разделе Private. Причём очень важно, что объявлена она до объявления там же функции. Это следует помнить: сначала объявляются переменные, потом - процедуры и функции.

К этой переменной мы обращаемся и из процедуры, и из функции. Она одна для всех.


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

Для начала создадим наше первое событие.



ev:THI_Event; - это и есть та самая переменная. Тип у неё - THI_Event. Это специальный тип в HiAsm, как раз предназначенный для событий. ev - это, конечно, имя, которое вы выбираете произвольно.

В процедуре больше сообщение не вызывается, я и библиотеку windows из uses убрал, чтобы не мешала. Зато мы вызываем здесь процедуру _hi_OnEvent. Это специальная процедура в HiAsm и генерирует событие. Процедура описана в модуле Share, он уже есть в HiAsm, поэтому нам ни о чем больше заботиться не нужно.

Но процедура эта имеет два параметра: имя переменной и выдаваемые данные. Второй параметр необязателен. Как видите, первый параметр у нас как раз эта самая переменная ev (и событие произойдёт на соответствующей точки IC), а данные для выдачи - это результат функции mat.

Теперь зададим ещё точку данных для нашего IC.



Как видите, точки данных задаются почти так же, как события: через переменную типа THI_Event. У нас это переменная d.

Самое главное здесь - это обращение к точке. Мы ведь не указываем, какие данные будут передаваться на точку данных: число, строка или массив, например. И здесь всё определяется функцией чтения. У нас используется ToInegerEvent(d). Эта функция прописана также в модуле Share. Она читает данные с точки d как число. Существуют следующие функции чтения с точек данных:
ToStringEvent - читает строку
ToIntegerEvent - читает целое число
ToRealEvent - читает число с точкой
ToStreamEvent - читает файловый поток Stream
ToBitmapEvent - читает картинку bmp
ToIconEvent - читает иконку


Для разных типов данных - свои функции. Но все эти функции читают данные только с точек данных. А у нас ведь ещё есть поток, в который также можно передавать данные. Для выемки информации из потока существуют следующие функции:

ToString
ToInteger
ToReal
ToStream
ToBitmap
ToIcon
ToObject
ToFont


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

Эти функции читают данные только из потока. А вот если данные могут поступать и в потоке, и через точки данных существует третья группа функций:

ReadString
ReadInteger
ReadReal
ReadBool
ReadMTData
ReadData
ReadStream
ReadBitmap
ReadIcon
ReadMatrix
ReadArray


Здесь уже добавлены функции для чтения матрицы и массивов, также MT-потока. Но всё это на данном этапе пока нам не нужно. Это пока всего лишь обзор.



Здесь применена функция

ReadInteger(dt,d,0);

У неё три параметра. Первый - это переменная dt. Посмотрите-ка в раздел Public, на объявление нашей процедуры Proba. Увидели в параметрах переменную dt? Вот это она и есть. При вызове процедуры ей передаются данные через эту переменную. Так что из потока данные извлекаются через эту переменную.

d - это наша точка данных. Ну а 0 это значение по умолчанию, когда ничего не передано ни на точку данных, ни в поток. У нас тогда используется ноль. Кстати, не забывайте про приоритет извлечения данных: сначала - с точек данных, потом - из параметров (в данном случае - это последний параметр, который у нас=0) и только затем уже из потока.

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



Здесь точка свойств - это процедура с именем v.

dtInteger - записывает данные в переменную dt (просто присвоить значение переменной dt нельзя, поскольку она имеет особый тип, к которому сначала нужно привести желаемые данные). Данные берутся из второго параметра, где у нас стоит функция. Записывается, естественно, её результат.

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






Защитите себя и свой компьютер: скачайте бесплатно антивирус и будьте под его надёжной защитой. Самые разные антивирусные программы.

1 комментарий:

  1. Спасибо за отличные уроки с примерами! Очень быстро понял , что к чему т.к информация подается не разбавленная "водой". Ждем продолжения.

    ОтветитьУдалить