вторник, 15 сентября 2009 г.

Memory и DoData

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

Взять тот же список строк (ListBox). У него есть метод doDelete, которому в потоке нужно передать индекс удаляемой строки. А если этот индекс является жёстко установленным, например удаляться всегда должна только первая строка (её индекс 0)? Поле ввода здесь явно не нужно - выбора здесь как раз быть не должно. Значит, нужен какой-то компонент, который будет хранить в себе число и выдавать его в поток по требованию.

Этот компонент - DoData. Он - третий на вкладке "Инструменты". У него есть параметр Data, который может содержать строку, целое число или дробное число. Если вы его начнёте редактировать, то увидите 4 кнопки: NULL, integer, string, real.

NULL - это отсутствие данных. То есть пустота.
Integer - число целого типа.
String - строка.
Real - дробное число (разделитель - точка, а не запятая!).

Поскольку нам необходим индекс строки, а он - целое число, то и выбрать нужно тип integer. Посе этого в поле ввода нужно написать нужное значение, например 0. И нажать ОК.

Метод doData этого компонента производит запись в компонент данных. Как вы помните из предыдущего поста, сначала данные проверяются на верхней точке. Но к ней мы ничего не подключили. Тогда данные берутся из параметра (если бы в параметре тип был NULL, то данные брались бы из потока). Это наш 0.
Затем данные выдаются в поток на событие onEventData. Это событие можно подключать в методу списка строк doDelete. У нас получится следующее.



Нажатие кнопки приведёт к удалению первой строки, пока список не будет пуст.


Теперь рассмотрим такую ситуацию, когда для работы метода необходимо несколько данных. Например, метод того же списка строк doReplace (он находится на вкладке "Точки" панели параметров). Для работы ему нужно в потоке передать индекс заменяемой строки, а заменяющая строка должна подаваться на точку данных Str.

Индекс передавать в поток мы только что научились. А вот как подать строку на точку данных, не используя уже известное поле ввода (допустим, строка у нас постоянная)?
Это решается с помощью невизуального компонента Memory (вкладка панели компонентов "Инструменты".).

Параметр Default у него аналогичен параметру Data компонента DoData. Так что выбирайте тип String и вводите желаемую строку. А после точку свойства Value подключайте к точке данных списка строк Str.
Вот результат.



Причём эти два компонента (Memory и DoData) можно использовать в связке, что придаст ещё больше гибкости в построении схем HiAsm.

3 комментария:

  1. В видеоуроке показаны инструменты, придающие многовариантность (гибкость) программам. Кроме Memory и DoData Вас познакомят также с Разветвителем, зеркальными "Канал в индекс" и "Индекс в канал", а также Case (условным переходом по совпадению).

    ОтветитьУдалить
  2. Вспомнил фильм "Великолепная семерка" и добавил к DoData его зеркальный компонент, после чего сочинил программу-запоминалку этих "бойцов невидимого фронта", связав их с гоголевскими персонажами.
    Может, кого позабавит, а кому-то и пригодится:

    Add(BitBtn,7549596,140,77)
    {
    Left=20
    Top=70
    Width=80
    Caption="DoData"
    link(onClick,290434:doMessage,[])
    }
    Add(BitBtn,16561584,140,126)
    {
    Left=20
    Top=110
    Width=80
    Caption="EventFromData"
    link(onClick,8156538:doMessage,[])
    }
    Add(BitBtn,774184,140,175)
    {
    Left=20
    Top=150
    Width=80
    Caption="Memory"
    link(onClick,9409667:doMessage,[])
    }
    Add(BitBtn,9133032,140,224)
    {
    Left=20
    Top=190
    Width=80
    Caption="Hub"
    link(onClick,4254901:doMessage,[])
    }
    Add(BitBtn,16567194,140,273)
    {
    Left=20
    Top=230
    Width=80
    Caption="ChanelToIndex"
    link(onClick,15099585:doMessage,[])
    }
    Add(BitBtn,14963416,140,322)
    {
    Left=20
    Top=270
    Width=80
    Caption="IndexToChanel"
    link(onClick,3792482:doMessage,[])
    }
    Add(BitBtn,12632804,140,378)
    {
    Left=20
    Top=313
    Width=80
    Caption="Case"
    link(onClick,8073083:doMessage,[])
    }
    Add(Label,1093326,77,14)
    {
    Left=175
    Top=15
    Width=267
    Height=17
    Caption="Великолепная семерка бойцов невидимого фронта"
    }
    Add(Label,16233664,77,77)
    {
    Left=110
    Top=70
    Width=137
    Height=17
    Caption="Делает данные событием"
    }
    Add(Label,8045883,77,126)
    {
    Left=110
    Top=110
    Width=184
    Height=17
    Caption="Делает событием нехватку данных"
    }
    Add(Label,2426371,77,175)
    {
    Left=110
    Top=150
    Width=231
    Height=17
    Caption="Хранит данные и сообщает об их изменении"
    }
    Add(Label,688609,77,224)
    {
    Left=110
    Top=190
    Width=355
    Height=17
    Caption="Объединяет события и переводит их в последовательность событий"
    }
    Add(Label,14341370,77,273)
    {
    Left=110
    Top=230
    Width=309
    Height=17
    Caption="На событие выдает номер канала, по которому оно пришло"
    }
    Add(Label,3541835,77,322)
    {
    Left=110
    Top=270
    Width=286
    Height=17
    Caption="По номеру канала инициирует событие на этом канале"
    }
    Add(Label,13851910,76,378)
    {
    Left=110
    Top=313
    Width=418
    Height=17
    Caption="Сравнивает событие с эталоном; не совпало - пропускает, иначе подает сигнал "
    }
    Add(Message,290434,210,77)
    {
    Caption="Собакевич: делает из мертвых душ товар"
    }
    Add(Message,8156538,210,126)
    {
    Caption="Чичиков: запрос на души"
    }
    Add(Message,9409667,210,175)
    {
    Caption="Плюшкин: хранит что ни попадя"
    }
    Add(Message,4254901,210,224)
    {
    Caption="Гоголь-сочинитель"
    }
    Add(Message,15099585,210,273)
    {
    Caption="Добчинский, Бобчинский: к нам приехал ревизор"
    }
    Add(Message,3792482,210,322)
    {
    Caption="Городничий: ревизора надобно обкрутить"
    }
    Add(Message,8073083,210,378)
    {
    Caption="Хлестаков: хорошо быть ревизором!"
    }
    Add(Label,2005734,133,14)
    {
    Left=202
    Top=32
    Width=202
    Height=17
    Caption="Гоголевские персонажи - за кнопками"
    }

    ОтветитьУдалить
  3. Да вы батюшка интеллектуал)

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