Как работать с HiAsm
Содержание :
  1. Вступление
  2. Что мы видим?
  3. Состав программы в HiAsm
  4. Обобщение
Вступление
Тут будут изложены основные понятия и принципы построения программ в оболочке HiAsm, на примере приложения Media Player из стандартного пакета. Те навыки и знания, которые вы приобретете, прочтя этот раздел, помогут вам прежде всего самостоятельно собирать программы и без проблем ориентироваться в таких понятиях, как Элемент(Компонент), Поток, Событие, Данные и прочее, которые являются основными в Высокоуровневом Конструкторе, и на основе которых написана существующая справка.
Что мы видим?
Откройте пример MediaPlayer из стандартного пакета программы. В главном окне редактора вы увидите такую картинку(без стрелок и кружков с цифрами конечно):


Любой проект в HiAsm, как видно из рисунка, состоит всего из 4-х основных частей:
  1. Элементы (или другое название - Компоненты) - это основные кирпичики или точнее детали конструктора, из которых и собирается программа в HiAsm.
  2. Точки входа - События(справа), Методы(слева), Данные(сверху) и Св-ва(снизу) компонента, посредством которых он может общаться с другими компонентами программы.
  3. Поток "События-Данные" - это основной тип потока между компонентами, который собственно и заставляет их что-то делать, а как следствие - обеспечивает всю работу программы.
  4. Поток "Данные" - неосновной поток, через который ведется исключительно обмен данными между элементами программы.
Теперь рассмотрим подробно, что из себя представляет каждый пункт и какими св-вами обладает.
Элементы
Как было упомянуто выше Элементы - это основные детали конструктора, из которых собирается программа. Все доступные элементы HiAsm находятся на нескольких вкладках окна Element palette, разделенных по их назначению. Так, например, на вкладке WinControls расположены компоненты, относящиеся к интерфейсу формы( Кнопка, Поле редактирования, Список, Панель, сама Форма и прочие ). Каждый такой элемент может иметь:
св-ва по умолчанию, т.е. св-ва которые пользователь может изменять только во время сборки программы, но не во время её выполнения
точки входа( о них речь пойдет ниже)
потоки для связи с другими компонентами
Кроме этого, все интерфейсные компоненты могут быть настроены(позиция на форме и их размер) с помощью визуального редактора, открыть который можно с панели Инструментов, нажав кнопку . Такими компонентами в нашем случае являются: Button, Edit, Label и MainForm.
Точки входа
Точки входа в HiAsm могут быть 4-х типов:
  • События(справа)
  • Методы(слева)
  • Данные(сверху)
  • Свойства(снизу)
(в скобках указано физическое расположение точек относительно компонента)
Так если вы посмотрите на рисунок, то нетрудно заметить, что не все компоненты содержат сразу 4 типа точек. Так например у Кнопки(Button) есть только Событие и Метод, у Надписи(Label) - Метод и Св-во, и только у компонента Медиа(Media) присутствуют сразу все.
Вызвано это очевидно тем, что некоторые компоненты в виду своей простоты не нуждаются в большом кол-ве Входов/Выходов и содержат только то, что непосредственно относиться к их прямому назначению. Да, конечно, всегда можно в один компонент засунуть сразу 3 или лучше 10 других, но в таком случае получить представление о программе, глядя только на её схему, станет просто не реально.
События - или действия, которые могут выполнять компоненты. Почему Могут, а не Должны? Потому что есть элементы, которые не выполняют вообще никаких действий и нужны только для предоставления пользователю каких-то данных. Например, компонент Time ничего не умеет делать, зато дает возможность узнать системное время компьютера. Тут же следует обратить особое внимание на то, что эти самые события происходят только ПОСЛЕ выполнения каких-то действий. Например событие Кнопки onClick происходит после нажатия на эту кнопку, событие Диалога onExecute происходит после выбора файла и т.д.
Именно события формируют поток "События-Данные"(об этом будет рассказано ниже).
Методы - это говоря на простом языке та работа, которую умеют делать компоненты. Обычно События являются результатом этой работы, но не всегда. Скажем, Метод Формы doClose выполняет закрытие окна и не вызывает никаких событий. Так же важным является, то что после выполнения Метода(работы) результат обычно возвращается в поток вместе с Событием, которое формирует в этом случае, как было сказано выше, поток "События-Данные". Отсутствия данных в потоке как такового в HiAsm нет, просто в этом случае считается, что поток содержит нулевые или пустые данные(о том, что компонент возвращает в поток вместе с событием указано в справке по этому компоненту).
Как правило, большинство Методов перед выполнением работы проверяют поток на наличие данных и если данные есть(и их формат совпадает с требуемым), то Метод использует эти данные (пример см. ниже).
Чтобы понять, о чем это только что шла речь, о каких таких потоках с данными и без них, обратимся к нашему примеру. Запустите открытый в HiAsm пример программы Media Player, нажав кнопку Run .
Теперь нажмите кнопку Open:

Как видите открылся диалог выбора файла:

Если же выбрать теперь MP3 файл и нажать кнопку Открыть, то начнется проигрывание музыки:

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

onClick(Кнопка) - doExecute(Диалог) - onExecute(Диалог) - doText(Поле вода) - onChange (Поле вода) - doPlay (Медиа)
Все 6 точек из этой цепочки показаны на рисунке:

где: onClick (Кнопка) - событие, которое произошло после нажатия кнопки Открыть(Open) с нулевыми данными в потоке
doExecute (Диалог) - Метод компонента Диалог, вызванный событием onClick
onExecute (Диалог) - событие, которое произошло после выбора файла и нажатия кнопки Открыть уже в окне диалога. Вот оно-то и создает поток "События-Данные", где данными является имя выбранного файла(а именно строка символов)
doText (Поле вода) - Метод компонента Поле ввода, вызванный событием onExecute. Этот метод перед выводом строки в поле проверяет поток на наличие данных строкового типа(в нашем случае это имя файла) и если таковые есть, то они же и выводятся.
onChange (Поле вода) - событие, которое произошло после изменения текста в Поле ввода. Оно тоже формирует поток с данными, где данные - это новый текст из поля ввода.
doPlay(Медиа) - Метод компонента Медиа, как и метод doText проверяет поток на наличие строковых данных, затем проверяет является ли полученная из потока строка файлом и если да, то проигрывает его.
Точно так же поступают и все другие компоненты. Вообще при использование компонент нужно руководствоться интуитивно понятной логикой их устройства. А логика такая: ну например кнопка, что может выдать кнопка при её нажатие? Подумав немного мы придем к выводу, что ничего, потому что смысл кнопки - создать событие, начать действие и больше ничего. Но другое дело поле ввода. Его смысл в получение текста от пользователя(так например вы могли не выбирать файл через диалог, а ввести его адрес(путь) вручную). А раз так, то я сразу говорю себе: "Ага нас интересует в этом компоненте только текст, значит вполне логично его и выдавать в поток". Кроме того, вы ВСЕГДА можете легко проверить, что выдает то или иное событие компонента присоединив к нему( к событию ) метод компонента Label doText. Соберите простую схемку на рисунке ниже и понажимайте кнопку и флажок:

Как видите при нажатие на кнопку верхняя надпись выводит: "Unknow data format" ( Неизвестный формат данных ). Это значит, что в потоке нет данных. При установки и снятие флажка, нижняя надпись меняется с 1(установлен) на 0(снят) и обратно.
Данные - эта точка входа используется компонентом перед выполнением работы для получения каких-то внешних данных. Например, в программе Media Player компонент Math(Математика) использует в качестве первого операнда текущую позицию(Position) проигрывания файла. Так как позиция храниться в миллисекундах, то желательно перевести её в секунды, что и делает компонент Math, деля на 1000(операнд 2, который задан по-умолчанию) первый операнд.
Важно запомнить следующее: как компонент определяет, какие данные брать из потока, какие с точки входа Данные, а какие из св-ств по-умолчанию? Эта неоднозначность решается благодаря приоритету, т.е.:
Если в потоке есть данные нужного формата, то используются эти данные
Если поток пустой, то проверяется доступность внешних данных(через точку Данные)
В случае их доступности, используются они.
И в самую последнюю очередь используются параметры по-умолчанию
Свойства - это данные, предоставляемые компонентом. Например, св-во Position предоставляет нам информацию о текущей позии проигрывания файла.
Обобщение
Для доступа нескольких Событий к одному Методу(и наоборот) используйте компонент Hub. Для доступа нескольких точек Данных к одному Свойству(но не наоборот!) используйте компонент GetData.
От себя, как от автора могу добавить: единственный способ действительно вникнуть в то, что написано выше, это самому пытаться строить программы с использованием справки по компонентам. Тем более, что эта справка максимально интегрирована в среду и всегда находиться "под рукой". Невозможно(да и не нужно) описать все тонкости при работе с компонентами в среде, поэтому нужно пытаться делать что-то самому и тогда вы поймете, насколько легко и быстро пишутся такие программки, как Media Player!