*Эта демка использует с большой пользой точки контролла WidthControls, HeightControls, OnSplitUp :)#13#10И еще - doAlign... Make(delphi) Add(MainForm,3598454,182,287) { Left=20 Top=105 Width=676 Caption="MultiPanels" Point(WidthControls) Point(HeightControls) link(onCreate,11599535:doWork3,[(224,307)(224,340)(102,340)]) link(WidthControls,7744240:reCalc,[(188,279)(132,279)]) link(HeightControls,13728771:reCalc,[]) } Add(Menu,354214,49,301) { @Hint=#54:Да просто так стоит, чтобы форма "голой" не смотрелась| Menu=#4:File|1:(|3:New|4:Open|5:Close|4:Exit|1:)|4:Edit|1:(|4:Copy|4:Past|1:)|6:Option| Point(onSelectNum) link(onSelectStr,14380743:doCase,[]) } Add(HubEx,14890060,273,119) { Angle=2 link(onEvent,9636835:##delete,[(116,132)(116,153)]) } Add(ChildPanelEx,5023674,49,168) { @Hint=#44:Вспомогательная панель со SplitterCreator-ом|27:Он же -- "Голубой Сплиттер"| link(onTopAlign,9636835:doTopAlign,[]) link(onNewEdit,11599535:doWork2,[]) link(HeightControls,4247517:reCalc,[]) } BEGIN_SDK Add(EditMultiEx,2357158,21,21) { EventCount=#10:onTopAlign|9:onNewEdit| DataCount=#5:dummy|14:HeightControls| Width=279 Height=102 } Add(Panel,4648921,98,49) { Left=667 Width=1 Height=1 Align=4 BorderWidth=0 BevelInner=0 BevelWidth=0 ModeSp=2 ColorSp=16776960 Point(onSplitUp) Point(Height) Point(doHeight) Point(HeightControls) link(onSplitUp,15053159:doTimer,[]) link(HeightControls,2357158:HeightControls,[(104,21)]) } Add(DoData,14470531,49,56) { Data=Integer(-1) link(onEventData,4648921:doHeight,[]) } Add(If_else,9138566,196,56) { Type=2 Op2=Integer(50) link(onTrue,1363487:doEvent1,[]) link(onFalse,8803793:doWork1,[(235,69)]) link(Op1,4648921:Height,[(202,45)(140,45)(140,90)(111,90)]) } Add(Hub,1363487,245,56) { OutCount=3 link(onEvent1,2357158:onTopAlign,[(282,62)(282,27)]) link(onEvent2,8803793:doWork2,[(289,69)(289,97)]) link(onEvent3,2357158:onNewEdit,[(300,76)]) } Add(HubEx,8803793,231,84) { Angle=2 link(onEvent,14470531:doData,[(36,97)(36,62)]) } Add(Timer,15053159,154,56) { @Hint=#52:Для фиксенного KOL-а этот таймер - нафиг не нужен!!!|36:Соединяй напрямую, и всего делов....| Interval=0 Enable=1 AutoStop=1 link(onTimer,9138566:doCompare,[]) } END_SDK Add(MultiElementEx,7744240,126,238) { @Hint=#67:Ограничиваем ширину минимальной (111) шириной самого узкого клиента|56:Чтобы найти самый узкий - и делаем перебор всего массива| link(onSelect,2623429:doWork3,[(166,244)(166,225)(109,225)]) link(Count,6942807:Var2,[]) link(CientWidth,9636835:ClientWidth,[]) } BEGIN_SDK Add(EditMultiEx,14692184,21,21) { EventCount=#8:onSelect| VarCount=#6:reCalc| DataCount=#5:Count|10:CientWidth| Width=279 Height=137 link(reCalc,13728771:reCalc,[(62,158)]) } Add(EventFromData,8648251,49,56) { link(onEvent,3646803:doEvent1,[]) link(Data,6013614:Var1,[(55,41)(146,41)(146,100)]) } Add(Hub,3646803,98,56) { OutCount=3 link(onEvent1,16384111:doClear,[]) link(onEvent2,1485221:doFor,[(138,69)(138,48)]) link(onEvent3,8648251:doData,[(138,76)(138,99)(40,99)(40,62)]) } Add(Math,16384111,252,49) { OpType=38 ResultType=0 Default=1000000000 Point(doClear) link(Op1,14692184:CientWidth,[(258,21)]) link(Op2,6013614:Var3,[(265,39)(291,39)(291,100)]) } Add(For,1485221,154,42) { IncludeEnd=1 link(onEvent,2120627:doEvent1,[]) link(End,14692184:Count,[(167,31)(27,31)]) } Add(MathParse,13728771,49,112) { @Hint=#67:Ограничиваем ширину минимальной (111) шириной самого узкого клиента|38:Для этого делаем перебор всего массива| MathStr="max(%2, 111 - %1)" ResultType=0 Point(reCalc) link(X1,8648251:GetData,[]) } Add(Hub,2120627,203,42) { link(onEvent1,14692184:onSelect,[(245,48)(245,27)]) link(onEvent2,16384111:doOperation,[]) } Add(GetDataEx,6013614,245,91) { link(Data,16384111:Result,[]) } END_SDK Add(ChildPanelEx,9636835,126,147) { @Hint=#37:Клиент - всегда последний и выбранный| Mode=1 link(onKillLast,6015896:doData,[]) link(onKillOwn,3844533:doData,[]) link(onDel,6331706:doNext,[]) link(onAdd,6331706:doPrev,[]) link(HeightControls,11225399:reCalc,[]) } BEGIN_SDK Add(EditMultiEx,12462495,21,21) { WorkCount=#8:##delete|8:##select|13:doClientAlign|10:doTopAlign|5:##add| EventCount=#10:onKillLast|9:onKillOwn|5:onDel|5:onAdd| VarCount=#7:##count|11:ClientWidth|6:Height|12:##eventIndex| DataCount=#5:dummy|14:HeightControls| Width=391 Height=228 Point(##delete) Point(##select) Point(##add) Point(##count) Point(##eventIndex) link(##delete,10491838:##clear,[(41,27)(41,118)]) link(doClientAlign,16715896:doWork6,[(34,41)(34,188)]) link(doTopAlign,16715896:doWork3,[(27,48)(27,167)]) link(##add,9178835:doWork1,[(186,55)]) link(ClientWidth,4443378:Var2,[(34,241)(223,241)]) link(Height,10548451:Var1,[(41,233)]) } Add(Panel,13518130,140,189) { Width=668 Height=266 Align=5 BorderWidth=0 BevelInner=0 BevelWidth=0 ModeSp=3 SizeSp=2 MinRest=2 Point(doAlign) Point(onSplitUp) Point(Height) Point(HeightControls) link(onSplitUp,12598500:doCompare,[]) link(HeightControls,7475373:Var,[]) } Add(MultiElementEx,5010613,266,91) { @Hint=#17:Killer for Source|47:Это вариант уничтожения "внутреннего" контролла|19:Своим же сплиттером| link(onDelete,14890060:doWork3,[(312,97)]) link(Data,10491838:##eventIndex,[(272,81)(255,81)(255,130)(230,130)]) } BEGIN_SDK Add(EditMultiEx,1501251,3,3) { WorkCount=#6:doData| EventCount=#8:onDelete| DataCount=#4:Data| Width=181 Height=81 link(doData,306648:doValue,[(3,27)]) } Add(Timer,6032471,70,21) { Interval=0 Enable=1 AutoStop=1 link(onTimer,11853407:doData,[]) } Add(DoData,11853407,119,21) { link(onEventData,1501251:onDelete,[(184,27)]) link(Data,306648:Value,[(125,11)(112,11)(112,62)(27,62)]) } Add(Memory,306648,21,21) { Point(Data) link(onData,6032471:doTimer,[]) link(Data,1501251:Data,[(27,3)]) } END_SDK Add(ChanelToIndex,16715896,42,147) { @Hint=#6:caNone|6:caLeft|5:caTop|7:caRight|8:caBottom|8:caClient| Count=6 link(onIndex,723467:doEvent1,[]) } Add(If_else,12598500,203,196) { Type=5 Op2=Integer(0) link(onTrue,15053159:doTimer,[]) link(onFalse,12462495:onKillOwn,[(396,209)(396,34)]) link(Op1,10548451:Var3,[(209,186)(188,186)(188,233)]) } Add(GetDataEx,10548451,140,224) { link(Data,13518130:Height,[]) } Add(MultiElementEx,9372368,336,84) { @Hint=#39:DeleteLast + SelectLast + doClientAlign|49:Это вариант уничтожения окна с привязкой caClient|29:Чужим сплиттером, естественно| link(onDelete,14890060:doWork2,[(375,90)(375,69)]) link(onSelect,10491838:##select,[(382,97)(382,60)(194,60)(194,97)]) link(Count,10491838:##count,[(342,77)(328,77)(328,143)(216,143)]) link(Width,16301893:Var3,[(349,30)]) } BEGIN_SDK Add(EditMultiEx,1501251,3,3) { WorkCount=#6:doData| EventCount=#8:onDelete|8:onSelect| DataCount=#5:Count|5:Width| Width=223 Height=88 link(doData,8121016:doCompare,[(3,34)]) } Add(If_else,8121016,28,28) { Type=1 Op2=Integer(50) link(onTrue,5650435:doOperation,[]) link(Op1,1501251:Width,[(34,15)(16,15)]) } Add(Math,5650435,77,28) { OpType=1 Op2=1 link(onResult,9534113:doEvent1,[]) link(Op1,1501251:Count,[(83,7)(9,7)]) } Add(Hub,9534113,126,28) { link(onEvent1,1501251:onDelete,[(217,34)(217,9)]) link(onEvent2,1682916:doOperation,[]) } Add(Math,1682916,175,35) { OpType=1 Op2=1 link(onResult,1501251:onSelect,[(226,41)]) } END_SDK Add(HubEx,14890060,308,56) { Angle=2 link(onEvent,10491838:##delete,[(201,69)(201,90)]) } Add(ChildPanelEx,4016973,140,98) { @Hint=#44:Вспомогательная панель со SplitterCreator-ом|27:Он же -- "Голубой Сплиттер"| link(onLeftAlign,10491838:doLeftAlign,[]) link(onNewEdit,9178835:doWork2,[]) link(WidthControls,4247517:reCalc,[]) } BEGIN_SDK Add(EditMultiEx,2357158,21,21) { EventCount=#11:onLeftAlign|9:onNewEdit| DataCount=#5:dummy|13:WidthControls| Width=279 Height=81 } Add(Panel,4648921,91,35) { Left=667 Width=1 Height=266 Align=3 BorderWidth=0 BevelInner=0 BevelWidth=0 ModeSp=2 ColorSp=16776960 Point(doWidth) Point(Width) Point(onSplitUp) Point(WidthControls) link(onSplitUp,15053159:doTimer,[]) link(WidthControls,2357158:WidthControls,[(97,21)]) } Add(DoData,14470531,42,42) { Data=Integer(-1) link(onEventData,4648921:doWidth,[]) } Add(If_else,9138566,196,42) { Type=2 Op2=Integer(50) link(onTrue,1363487:doEvent1,[]) link(onFalse,15751627:doWork1,[(235,55)]) link(Op1,4648921:Width,[(202,31)(136,31)(136,76)(104,76)]) } Add(Hub,1363487,245,42) { OutCount=3 link(onEvent1,2357158:onLeftAlign,[(289,48)(289,27)]) link(onEvent2,15751627:doWork2,[(289,55)(289,83)]) link(onEvent3,2357158:onNewEdit,[(300,62)]) } Add(HubEx,15751627,231,70) { Angle=2 link(onEvent,14470531:doData,[(33,83)(33,48)]) } Add(Timer,15053159,147,42) { @Hint=#52:Для фиксенного KOL-а этот таймер - нафиг не нужен!!!|36:Соединяй напрямую, и всего делов....| Interval=0 Enable=1 AutoStop=1 link(onTimer,9138566:doCompare,[]) } END_SDK Add(Hub,723467,91,147) { link(onEvent1,7475373:doIndex,[]) link(onEvent2,13518130:doAlign,[(131,160)(131,202)]) } Add(ChildPanelEx,10491838,210,84) { @Hint=#37:Клиент - всегда последний и выбранный| Mode=1 link(onKillLast,9372368:doData,[]) link(onKillOwn,5010613:doData,[]) link(onDel,12462495:onDel,[(404,104)(404,41)]) link(onAdd,12462495:onAdd,[(412,111)]) link(WidthControls,11225399:reCalc,[]) } BEGIN_SDK Add(EditMultiEx,12462495,21,21) { WorkCount=#8:##delete|8:##select|11:doLeftAlign|5:##add|7:##clear| EventCount=#10:onKillLast|9:onKillOwn|5:onDel|5:onAdd| VarCount=#7:##count|5:Width|12:##eventIndex| DataCount=#5:dummy|13:WidthControls| Width=286 Point(##delete) Point(##select) Point(##add) Point(##clear) Point(##count) Point(##eventIndex) link(##delete,14748473:doWork1,[(46,27)]) link(##select,16715896:doWork6,[(38,34)(38,146)]) link(doLeftAlign,16715896:doWork2,[(30,41)(30,118)]) link(##add,572332:doEvent1,[]) link(##clear,14748473:doWork3,[(46,55)]) link(Width,10548451:Var1,[(34,212)]) } Add(Panel,13518130,147,154) { Width=668 Height=266 Align=5 BorderWidth=0 BevelInner=0 BevelWidth=0 ModeSp=3 SizeSp=2 MinRest=2 Point(Width) Point(doAlign) Point(onSplitUp) Point(WidthControls) link(onSplitUp,12598500:doCompare,[]) link(WidthControls,7475373:Var,[]) } Add(Beep,15734348,70,35) { Point(onBeep) link(onBeep,2207221:doBeep,[]) } Add(ChanelToIndex,16715896,49,105) { @Hint=#6:caNone|6:caLeft|5:caTop|7:caRight|8:caBottom|8:caClient| Count=6 link(onIndex,723467:doEvent1,[]) } Add(If_else,12598500,196,161) { Type=5 Op2=Integer(0) link(onTrue,15053159:doTimer,[]) link(onFalse,12462495:onKillOwn,[(299,174)(299,34)]) link(Op1,10548451:Var3,[(202,152)(187,152)(187,212)]) } Add(GetDataEx,10548451,147,203) { link(Data,13518130:Width,[]) } Add(HubEx,14748473,42,28) { link(onEvent,15734348:doBeep,[]) } Add(Beep,2207221,119,35) { Freq=0 Point(onBeep) link(onBeep,12462495:onDel,[]) } Add(Hub,572332,175,42) { link(onEvent1,12462495:onAdd,[]) link(onEvent2,7325087:doLoad,[(226,55)(226,83)]) } Add(GetIndexData,7475373,147,105) { @Hint=#45:Контроль производится только для Align=caLeft| Count=3 link(Data2,12462495:WidthControls,[(160,21)]) } Add(Hub,723467,98,105) { link(onEvent1,7475373:doIndex,[]) link(onEvent2,13518130:doAlign,[(138,118)(138,167)]) } Add(Memo,7325087,245,63) { Top=50 Width=668 Height=216 Align=5 Font=[Courier New,10,1,0,204] FileName="MultiPanels.sha" ScrollBars=3 Point(doLoad) } Add(Edit,4266964,245,105) { Top=30 Width=668 Align=2 Text="=======================================" } Add(Timer,15053159,245,161) { @Hint=#52:Для фиксенного KOL-а этот таймер - нафиг не нужен!!!|36:Соединяй напрямую, и всего делов....| Interval=0 Enable=1 AutoStop=1 link(onTimer,12462495:onKillLast,[(292,167)(292,27)]) } END_SDK Add(GetDataEx,16301893,308,21) { Angle=2 link(Data,4443378:Var3,[(321,135)]) } Add(MathParse,11225399,210,42) { @Hint=#64:Ограничиваем движение сплиттера неотрицательным размером клиента| MathStr="min(%1, %2)" ResultType=0 Point(reCalc) link(X2,1202469:Var2,[]) } Add(HubEx,9178835,182,98) { link(onEvent,10491838:##add,[]) } Add(MathParse,4247517,140,56) { @Hint=#66:Ограничиваем движение сплиттера минимальным (111) размером клиента| MathStr="min(%1, %2 - 111)" ResultType=0 Point(reCalc) link(X2,1202469:Var1,[(153,30)]) } Add(GetDataEx,1202469,210,21) { Angle=1 link(Data,16301893:Var1,[]) } Add(GetDataEx,4443378,210,126) { link(Data,10491838:Width,[]) } Add(GetIndexData,7475373,140,147) { @Hint=#44:Контроль производится только для Align=caTop| Count=3 link(Data3,12462495:HeightControls,[(160,21)]) } Add(Timer,15053159,266,196) { @Hint=#52:Для фиксенного KOL-а этот таймер - нафиг не нужен!!!|36:Соединяй напрямую, и всего делов....| Interval=0 Enable=1 AutoStop=1 link(onTimer,12462495:onKillLast,[(389,202)(389,27)]) } END_SDK Add(GetDataEx,2995331,273,84) { Angle=2 link(Data,10495376:Var3,[(286,205)]) } Add(MathParse,11225399,126,105) { @Hint=#64:Ограничиваем движение сплиттера неотрицательным размером клиента| MathStr="min(%1, %2)" ResultType=0 Point(reCalc) link(X2,14303571:Var2,[]) } Add(MultiElementEx,3844533,238,154) { @Hint=#17:Killer for Source|47:Это вариант уничтожения "внутреннего" контролла|19:Своим же сплиттером| link(onDelete,14890060:doWork3,[(277,160)]) link(Data,9636835:##eventIndex,[(244,145)(168,145)(168,197)(153,197)]) } BEGIN_SDK Add(EditMultiEx,1501251,3,3) { WorkCount=#6:doData| EventCount=#8:onDelete| DataCount=#4:Data| Width=181 Height=81 link(doData,306648:doValue,[(3,27)]) } Add(Timer,6032471,70,21) { Interval=0 Enable=1 AutoStop=1 link(onTimer,11853407:doData,[]) } Add(DoData,11853407,119,21) { link(onEventData,1501251:onDelete,[(184,27)]) link(Data,306648:Value,[(125,11)(112,11)(112,62)(27,62)]) } Add(Memory,306648,21,21) { Point(Data) link(onData,6032471:doTimer,[]) link(Data,1501251:Data,[(27,3)]) } END_SDK Add(MultiElementEx,6015896,301,147) { @Hint=#39:DeleteLast + SelectLast + doClientAlign|49:Это вариант уничтожения окна с привязкой caClient|29:Чужим сплиттером, естественно| link(onDelete,14890060:doWork2,[(341,153)(341,132)]) link(onSelect,2623429:doWork1,[(348,160)(348,124)(109,124)]) link(onClientAlign,9636835:doClientAlign,[(355,167)(355,117)(101,117)(101,167)]) link(Count,6942807:Var3,[(307,138)(293,138)(293,212)]) link(Height,2995331:Var3,[(314,93)]) } BEGIN_SDK Add(EditMultiEx,1501251,3,3) { WorkCount=#6:doData| EventCount=#8:onDelete|8:onSelect|13:onClientAlign| DataCount=#5:Count|6:Height| Width=230 Height=88 link(doData,8121016:doCompare,[(3,34)]) } Add(If_else,8121016,28,28) { Type=1 Op2=Integer(50) link(onTrue,5650435:doOperation,[]) link(Op1,1501251:Height,[(34,3)]) } Add(Math,5650435,77,28) { OpType=1 Op2=1 link(onResult,9534113:doEvent1,[]) link(Op1,1501251:Count,[(83,9)(9,9)]) } Add(Hub,9534113,126,28) { OutCount=3 link(onEvent1,1501251:onDelete,[(217,34)(217,9)]) link(onEvent2,1682916:doOperation,[]) link(onEvent3,1501251:onClientAlign,[(233,48)]) } Add(Math,1682916,175,35) { OpType=1 Op2=1 link(onResult,1501251:onSelect,[(225,41)(225,16)]) } END_SDK Add(HubEx,11599535,98,168) { link(onEvent,9636835:##add,[]) } Add(GetDataEx,6942807,119,203) { link(Data,9636835:##count,[]) } Add(GetDataEx,14303571,126,84) { Angle=1 link(Data,2995331:Var1,[]) } Add(MathParse,4247517,49,119) { @Hint=#66:Ограничиваем движение сплиттера минимальным (111) размером клиента| MathStr="min(%1, %2 - 111)" ResultType=0 Point(reCalc) link(X2,14303571:Var1,[(62,93)]) } Add(Counter,6331706,182,161) { Type=1 link(onNext,11450201:doConvert,[(224,167)(224,260)(116,260)(116,293)]) } Add(MathParse,13728771,182,238) { @Hint=#53:Ограничиваем высоту минимальной (111) высотой клиента| MathStr="max(%2, 111 - %1)" ResultType=0 Point(reCalc) link(X1,10495376:Var2,[]) } Add(GetDataEx,10495376,175,196) { Angle=3 link(Data,9636835:Height,[(146,205)]) } Add(HubEx,2623429,105,147) { link(onEvent,9636835:##select,[]) } Add(Convertor,11450201,126,287) { Mode=16 Word_1="окно" Word_2="окна" Word_5="окон" link(onResult,3598454:doCaption,[]) } Add(Case,14380743,112,301) { Value=String(Exit) link(onTrue,3598454:doClose,[]) } Add(InfoTip,2913308,35,7) { Info=#37:Увидел "Голубой Сплиттер" - тащи его!|22:Получится новое окошко|67:Уничтожить окошко - сведи его размер к нулю любым другим сплиттером| Font=[Arial,10,1,8388608,204] Transparent=1 Width=344 Height=74 } Add(InfoTip,11373526,35,357) { Info=#166:Особенности точек WidthControls, HeightControls заключаются в том, что, в отличие от onResize, эти события происходят ДО реального изменения виндой размеров контролла|100:И винда предоставляет возможность внести дополнительные корректировки перед окончательным рисованием|56:А эти точки - просто визуализируют эту возможность винды| Font=[Arial,8,0,8388608,204] Transparent=1 Width=344 Height=95 }