понедельник, 14 сентября 2009 г.

Мультиэлементы

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

Один из самых важных таких компонентов - это дочерняя форма. Более или менее сложная программа обязательно содержит хотя бы одну дочернюю форму.
Этот компонент находится на вкладке "Интерфейс". Нажмите на нём левой кнопкой, а затем отпустите её и нажмите левой кнопкой на рабочем поле HiAsm.

У неё нет никаких точек, потому что для мультиэлементов вы сами должны их создать.
Сначала нужно войти в этот компонент. Прочто дважды щёлкните на нём, и вы уже внутри.
Здесь вы увидите обычную форму, но она является дочерней.

Белый прямоугольник - это редактор мультиэлемента. Если вы нажмёте на его границе, то увидите его параметры. Первые 4 параметра и определяют точки компонента снаружи. Но пока ничего здесь не меняйте.

Сейчас вы можете перейти в редактор форм и изменить размеры дочерней формы. Желательно их уменьшить. А затем запустите программу. Вы видите, что появляются сразу две формы: главная и дочерняя. Но дочерние формы обычно вызываются при нажатии на кнопку, например.
Сделаем так и мы.

Закройте программы и выделите форму (внутри мультиэлемента). Установите её параметр Visible в False. После этого форма станет невидимой (при запуске программы).
Теперь щёлкните у этого параметра белый квадратик - у формы сразу появится новый метод. Именно он будет управлять видимостью формы.

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

Помните, что мультиэлемент подключается к компонентам не так, другие компоненты, а наоборот: левые точки соединяются с левыми, правые - с правыми. То же самое и для верхних/нижних точек.

Вернитесь на главную форму. Это делается с помощью чёрной стрелки на панели инструментов. Видите: теперь у мультиэлемента появился один метод. И он как раз связан с методом doVisible нашей дочерней формы. То есть, мы сможем им управлять с главной формы.

Ну а сейчас можно поставить на рабочее поле кнопку и соединить её событие с методом мультиэлемента (кстати, обратите внимание, что наш метод мультиэлемента не имеет произвольного названия). Должно получиться примерно так:



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

Вновь зайдите в мультиэлемент и отсоедините связь формы с редактором мультиэлемента. Затем выделите форму и на панели параметров перейдите во вкладку "Точки". Там, в самом низу, найдите точку doShowModal и отметьте её. Этот метод как раз и показывает форму "модально", т.е. так, что главная орма становится недоступной.

Ну а как соединять точки, вы уже знаете.

16 комментариев:

  1. Попробовал сделать матрешку из дочерних форм: открывал дочернюю форму, вставлял в нее новую дочернюю форму, открывал ее и т.п.
    При запуске показывались основная и 1 дочерняя формы, причем когда закрывал дочернюю, то закрывалась и основная. После чего в HiAsmе вырубалась возможность запуска этого проекта.
    Какое правило я нарушил?

    ОтветитьУдалить
  2. Поправлюсь - возможность в HiAsmе не вырубалась. Просто работа программы была не завершена. Вложенные матрешкой формы открывались парами. Когда я закрывал одну пару, другие оставались активными, только свернутыми в кнопку панели быстрого доступа.

    ОтветитьУдалить
  3. Спасибо, ответ получен в комментарии к выпуску Мультиэлементы-2

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. День добрый!
    Если есть возможность, помогите пожалуйста!

    есть такой исходник:

    Make(delphi)
    ver(4.04 build 184)
    Add(MainForm,2953706,21,105)
    {
    Width=690
    Height=507
    Position=1
    }
    Add(Button,11331008,315,133)
    {
    Left=205
    Top=185
    Width=260
    Height=100
    Caption="НАжать"
    link(onClick,2620869:doWork1,[])
    }
    Add(ChildForm,2620869,406,133)
    {
    }
    BEGIN_SDK
    Add(EditMulti,6523336,21,21)
    {
    WorkCount=1
    Height=298
    link(doWork1,1125012:doShowModal,[(28,27)(28,90)])
    }
    Add(MainForm,1125012,63,56)
    {
    Left=35
    Top=105
    Visible=1
    Position=1
    Point(doShowModal)
    }
    Add(Button,940477,140,98)
    {
    Left=155
    Top=75
    Enabled=1
    Point(doEnabled)
    link(onClick,15032747:doEnabled,[(183,104)(183,141)(128,141)(128,160)])
    }
    Add(Button,15032747,140,154)
    {
    Left=155
    Top=120
    Enabled=1
    Data=String(Hello world!)
    Point(doEnabled)
    link(onClick,13215654:doEvent1,[(188,160)(188,167)])
    }
    Add(CheckBox,6751669,140,42)
    {
    Left=150
    Top=40
    Width=65
    Caption="Нажать!"
    link(onCheck,940477:doEnabled,[(184,48)(184,85)(128,85)(128,104)])
    }
    Add(Label,12269530,203,259)
    {
    Left=155
    Top=185
    Width=4
    Height=4
    Caption=""
    }
    Add(Timer,15595609,245,133)
    {
    Interval=5000
    Enable=1
    AutoStop=1
    link(onTimer,1125012:doClose,[(290,139)(290,29)(51,29)(51,83)])
    }
    Add(Hub,13215654,203,161)
    {
    OutCount=3
    link(onEvent1,15595609:doTimer,[(231,167)(231,139)])
    link(onEvent2,12269530:doText,[(229,174)(229,220)(191,220)(191,265)])
    link(onEvent3,4920373:doVisible,[(223,181)(223,213)(142,213)(142,272)])
    }
    Add(Label,4920373,154,259)
    {
    Left=105
    Top=240
    Width=180
    Height=17
    Visible=1
    Caption="Форма будет закрыта через 5 сек"
    Point(doVisible)
    }
    END_SDK

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

    Заранее очень благодарен!

    ОтветитьУдалить
    Ответы
    1. В данном случае лучше использовать ChildFormEx и установить свойство Mode=Dynamic. После закрытия формы происходит очищение, при нажатии же кнопки - создание новой формы с установками по умолчанию.

      Add(MainForm,4128789,126,154)
      {
      Width=690
      Height=507
      Position=1
      }
      Add(Button,11331008,406,182)
      {
      Left=205
      Top=185
      Width=260
      Height=100
      Caption="НАжать"
      Data=Integer(1)
      link(onClick,10294071:##add,[])
      }
      Add(ChildFormEx,10294071,476,182)
      {
      Mode=1
      link(onEvent2,6306703:doTimer,[])
      }
      BEGIN_SDK
      Add(EditMultiEx,13519495,21,21)
      {
      WorkCount=#5:##add|7:##clear|
      EventCount=#8:onEvent2|
      Width=356
      Point(##add)
      Point(##clear)
      link(##add,12364763:doShowModal,[(45,27)(45,104)])
      }
      Add(MainForm,12364763,70,70)
      {
      Left=35
      Top=105
      Visible=1
      Position=1
      Point(doShowModal)
      }
      Add(Button,5308063,147,112)
      {
      Left=155
      Top=75
      Enabled=1
      Point(doEnabled)
      link(onClick,13541977:doEnabled,[(190,118)(190,155)(135,155)(135,174)])
      }
      Add(Button,13541977,147,168)
      {
      Left=155
      Top=120
      Enabled=1
      Data=String(Hello world!)
      Point(doEnabled)
      link(onClick,3499981:doEvent1,[(195,174)(195,181)])
      }
      Add(CheckBox,6586989,147,56)
      {
      Left=150
      Top=40
      Width=65
      Caption="Нажать!"
      link(onCheck,5308063:doEnabled,[(191,62)(191,99)(135,99)(135,118)])
      }
      Add(Label,661017,210,273)
      {
      Left=155
      Top=185
      Width=4
      Height=4
      Caption=""
      }
      Add(Timer,7211206,252,147)
      {
      Interval=5000
      Enable=1
      AutoStop=1
      link(onTimer,12380081:doEvent1,[])
      }
      Add(Hub,3499981,210,175)
      {
      OutCount=3
      link(onEvent1,7211206:doTimer,[(238,181)(238,153)])
      link(onEvent2,661017:doText,[(236,188)(236,234)(198,234)(198,279)])
      link(onEvent3,11860769:doVisible,[(230,195)(230,227)(149,227)(149,286)])
      }
      Add(Label,11860769,161,273)
      {
      Left=105
      Top=240
      Width=180
      Height=17
      Visible=1
      Caption="Форма будет закрыта через 5 сек"
      Point(doVisible)
      }
      Add(Hub,12380081,301,147)
      {
      link(onEvent1,12364763:doClose,[(326,153)(326,42)(58,42)(58,97)])
      link(onEvent2,13519495:onEvent2,[(346,160)(346,27)])
      }
      END_SDK
      Add(Timer,6306703,525,182)
      {
      Interval=10
      Enable=1
      AutoStop=1
      link(onTimer,10294071:##clear,[(569,188)(569,223)(463,223)(463,195)])
      }

      Удалить
  6. превелико благодарю!
    вроде все компоненты знаю, их свойства, а тут тебе на!
    ChildFormEx даже не знал о его существовании!
    Век живи, век учись.

    ОтветитьУдалить
  7. У меня проблема с дочерними формами.
    Нужно сделать игру 100 к 1. Я сделала программу, выглядит примерно так: при запуске программы появляется окно с кнопками "1 тур", "2 тур" и "3 тур". При нажатии на любую из них появляется окно с 5 кнопками - "1\2\3\4\5 вопрос". При нажатии на любую из этих появляется окно с 6 надписям, у 5 из которых меняется параметр Visible при нажатии на светодиод (сам светодиод при этом ещё и загорается\выключается). Проблема в том, что когда я запускаю программу, открывается только 1 тур, а в 1 туре - только 1 вопрос. Что делать?

    ОтветитьУдалить
    Ответы
    1. Без схемы трудно что-то сказать. Вариантов может быть множество.

      Удалить
    2. Могу ещё сказать, что все срабатывает когда я убираю формы со 2 и 3 туром.

      Удалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Здравствуйте! У меня такая проблема: можно взаимодействовать с дочерней формой из родительской или главной, например нажатием кнопки. А наоборот, то есть, из дочерней взаимодействовать с родительской или главной невозможно. Подскажите, пожалуйста, как это можно реализовать, если это возможно. Спасибо!

    ОтветитьУдалить
    Ответы
    1. Add(MainForm,7026624,336,259)
      {
      Width=201
      Height=118
      Caption="Введите пароль"
      BorderStyle=3
      Position=1
      }
      Add(ChildForm,4677379,1001,259)
      {
      }
      BEGIN_SDK
      Add(EditMulti,5250268,21,21)
      {
      WorkCount=4
      VarCount=1
      Width=517
      Height=438
      link(doWork1,3627141:doVisible,[(207,27)(207,321)])
      link(doWork3,2290023:doWork2,[(399,41)(399,195)])
      }
      Add(Registry,14774459,231,112)
      {
      HKey=1
      Key="Software\ShaklovAA\Notes"
      Value="notes"
      link(onRead,13370911:doAdd,[(275,118)(275,142)(37,142)(37,167)])
      }
      Add(RichEdit,13370911,49,161)
      {
      Width=800
      Height=614
      Align=5
      Font=[Arial,8,0,0,204]
      link(onChange,14774459:doWrite,[(163,167)(163,125)])
      }
      Add(MainForm,3627141,392,287)
      {
      Visible=1
      Caption="Записная книжка с паролем"
      WindowsState=2
      Point(doVisible)
      link(onCreate,14774459:doRead,[(436,307)(436,213)(219,213)(219,118)])
      }
      Add(Menu,126380,168,273)
      {
      Menu=#6:Пароль|1:(|8:Изменить|1:-|8:Сбросить|1:)|11:О программе|5:Выход|
      Point(onSelectNum)
      link(onSelectNum,2345105:doEvent,[(212,286)(212,356)])
      }
      Add(IndexToChanel,2345105,224,350)
      {
      Count=6
      link(onEvent2,2290023:doWork1,[(516,363)(516,188)])
      link(onEvent4,14746715:doMessage,[(301,377)(301,251)])
      link(onEvent6,3627141:doClose,[(324,391)(324,314)])
      }
      Add(Message,3547710,315,203)
      {
      Message="Open"
      }
      Add(Message,14746715,315,245)
      {
      Message="Open 2"
      }
      Add(ChildForm,2290023,777,182)
      {
      }
      BEGIN_SDK
      Add(EditMulti,9498223,21,21)
      {
      WorkCount=2
      Width=713
      Height=557
      link(doWork1,5825787:doVisible,[(28,27)(28,139)])
      }
      Add(MainForm,5825787,35,105)
      {
      Left=35
      Top=105
      Width=210
      Height=118
      Visible=1
      Caption="Введите новый пароль"
      BorderStyle=3
      Position=1
      Point(doVisible)
      }
      Add(Edit,13893252,273,112)
      {
      Left=25
      Top=20
      Width=145
      Font=[Arial,8,0,0,204]
      Text=""
      Alignment=2
      Password=0
      }
      Add(Button,6018500,350,175)
      {
      Left=30
      Top=50
      Width=62
      Caption="Сохранить"
      }
      Add(DoData,6637366,413,357)
      {
      link(onEventData,13893252:doText,[(457,363)(457,241)(261,241)(261,118)])
      link(Data,13154506:Value,[(419,345)(451,345)(451,450)(482,450)])
      }
      Add(Memory,13154506,476,406)
      {
      }
      Add(Button,12231887,322,392)
      {
      Left=95
      Top=50
      Width=57
      Caption="Отмена"
      link(onClick,3796190:doEvent1,[(366,398)(366,377)(331,377)(331,356)])
      }
      Add(Hub,3796190,343,350)
      {
      link(onEvent1,6637366:doData,[(385,356)(385,363)])
      link(onEvent2,5825787:doClose,[(369,363)(369,247)(23,247)(23,132)])
      }
      END_SDK
      END_SDK
      Add(Edit,14250624,609,224)
      {
      Left=25
      Top=20
      Width=145
      Font=[Arial,8,0,0,204]
      Text=""
      Alignment=2
      Password=0
      }
      Add(Button,3410488,686,287)
      {
      Left=95
      Top=50
      Width=57
      Caption="Ввод"
      link(onClick,1565365:doCompare,[(562,293)(562,370)])
      }
      Add(DoData,3501149,749,469)
      {
      link(onEventData,14250624:doText,[(793,475)(793,353)(597,353)(597,230)])
      link(Data,14816449:Value,[(755,457)(787,457)(787,562)(818,562)])
      }
      Add(If_else,1565365,770,364)
      {
      Op2=String(1234)
      link(onTrue,4677379:doWork1,[(902,370)(902,265)])
      link(onFalse,8913662:doMessage,[(856,377)(856,391)])
      link(Op1,14250624:Text,[(776,250)(615,250)])
      }
      Add(Message,8913662,924,385)
      {
      Message="Пароль введён неверно!"
      Caption="Неверный пароль"
      Icon=1
      }
      Add(Memory,14816449,812,518)
      {
      }
      Add(Button,4069266,658,504)
      {
      Left=35
      Top=50
      Width=57
      Caption="Очистить"
      link(onClick,3501149:doData,[(720,510)(720,475)])
      }
      Add(StyleXP,15169779,1036,364)
      {
      }
      Add(Edit,6509403,763,140)
      {
      Left=770
      Top=115
      }

      Удалить
  10. Как соединять серые точки через дочернюю форму?

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