Мультиэлементы, или элементы-контейнеры, это компоненты, содержащие в себе другие компоненты, которые для контерйнеров являются дочерними
Один из самых важных таких компонентов - это дочерняя форма. Более или менее сложная программа обязательно содержит хотя бы одну дочернюю форму.
Этот компонент находится на вкладке "Интерфейс". Нажмите на нём левой кнопкой, а затем отпустите её и нажмите левой кнопкой на рабочем поле HiAsm.
У неё нет никаких точек, потому что для мультиэлементов вы сами должны их создать.
Сначала нужно войти в этот компонент. Прочто дважды щёлкните на нём, и вы уже внутри.
Здесь вы увидите обычную форму, но она является дочерней.
Белый прямоугольник - это редактор мультиэлемента. Если вы нажмёте на его границе, то увидите его параметры. Первые 4 параметра и определяют точки компонента снаружи. Но пока ничего здесь не меняйте.
Сейчас вы можете перейти в редактор форм и изменить размеры дочерней формы. Желательно их уменьшить. А затем запустите программу. Вы видите, что появляются сразу две формы: главная и дочерняя. Но дочерние формы обычно вызываются при нажатии на кнопку, например.
Сделаем так и мы.
Закройте программы и выделите форму (внутри мультиэлемента). Установите её параметр Visible в False. После этого форма станет невидимой (при запуске программы).
Теперь щёлкните у этого параметра белый квадратик - у формы сразу появится новый метод. Именно он будет управлять видимостью формы.
А сейчас ведите свзяь от этого метода до левой границы редактора мультиэлемента и там отпустите. Видите, точка здесь создаётся автоматически.
Помните, что мультиэлемент подключается к компонентам не так, другие компоненты, а наоборот: левые точки соединяются с левыми, правые - с правыми. То же самое и для верхних/нижних точек.
Вернитесь на главную форму. Это делается с помощью чёрной стрелки на панели инструментов. Видите: теперь у мультиэлемента появился один метод. И он как раз связан с методом doVisible нашей дочерней формы. То есть, мы сможем им управлять с главной формы.
Ну а сейчас можно поставить на рабочее поле кнопку и соединить её событие с методом мультиэлемента (кстати, обратите внимание, что наш метод мультиэлемента не имеет произвольного названия). Должно получиться примерно так:
Запустите программу и нажмите кнопку. Сразу же появится дочерняя форма. Однако при открытой дочерней форме доступна и главная, а частенько нужно, чтобы главная в это время была недоступной. Сейчас мы так и сделаем.
Вновь зайдите в мультиэлемент и отсоедините связь формы с редактором мультиэлемента. Затем выделите форму и на панели параметров перейдите во вкладку "Точки". Там, в самом низу, найдите точку doShowModal и отметьте её. Этот метод как раз и показывает форму "модально", т.е. так, что главная орма становится недоступной.
Ну а как соединять точки, вы уже знаете.
Попробовал сделать матрешку из дочерних форм: открывал дочернюю форму, вставлял в нее новую дочернюю форму, открывал ее и т.п.
ОтветитьУдалитьПри запуске показывались основная и 1 дочерняя формы, причем когда закрывал дочернюю, то закрывалась и основная. После чего в HiAsmе вырубалась возможность запуска этого проекта.
Какое правило я нарушил?
Поправлюсь - возможность в HiAsmе не вырубалась. Просто работа программы была не завершена. Вложенные матрешкой формы открывались парами. Когда я закрывал одну пару, другие оставались активными, только свернутыми в кнопку панели быстрого доступа.
ОтветитьУдалитьМне нужно видеть код.
ОтветитьУдалитьСпасибо, ответ получен в комментарии к выпуску Мультиэлементы-2
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьДень добрый!
ОтветитьУдалитьЕсли есть возможность, помогите пожалуйста!
есть такой исходник:
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
интересует возможность после закрытия формы сбрасывать все значения кнопок как при первом открытии, т.е. делать их не активными.
Заранее очень благодарен!
В данном случае лучше использовать 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)])
}
превелико благодарю!
ОтветитьУдалитьвроде все компоненты знаю, их свойства, а тут тебе на!
ChildFormEx даже не знал о его существовании!
Век живи, век учись.
У меня проблема с дочерними формами.
ОтветитьУдалитьНужно сделать игру 100 к 1. Я сделала программу, выглядит примерно так: при запуске программы появляется окно с кнопками "1 тур", "2 тур" и "3 тур". При нажатии на любую из них появляется окно с 5 кнопками - "1\2\3\4\5 вопрос". При нажатии на любую из этих появляется окно с 6 надписям, у 5 из которых меняется параметр Visible при нажатии на светодиод (сам светодиод при этом ещё и загорается\выключается). Проблема в том, что когда я запускаю программу, открывается только 1 тур, а в 1 туре - только 1 вопрос. Что делать?
Без схемы трудно что-то сказать. Вариантов может быть множество.
УдалитьМогу ещё сказать, что все срабатывает когда я убираю формы со 2 и 3 туром.
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЗдравствуйте! У меня такая проблема: можно взаимодействовать с дочерней формой из родительской или главной, например нажатием кнопки. А наоборот, то есть, из дочерней взаимодействовать с родительской или главной невозможно. Подскажите, пожалуйста, как это можно реализовать, если это возможно. Спасибо!
ОтветитьУдалить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
}
Уже разобрался, спасибо!)
УдалитьКак соединять серые точки через дочернюю форму?
ОтветитьУдалить