С удивлением обнаружил, что в SpiderBasic, не работает событие #PB_EventType_Resize. Написал способ привязать это событие, к соответствующим гаджетам. По крайней мере, можно использовать пока событие не работает в нативе:
Код:
CompilerIf Not Defined(PB_EventType_Resize, #PB_Constant) ; следующий блок CompilerIf нужен для того, чтобы отметить CanvasGadget, когда он создан с флагом #PB_Canvas_Container CompilerIf Not Defined(WBN_Handler_Canvas_Container, #PB_Constant) ; также это может применяться в другом коде, поэтому создаём стандарт для одноразовой загрузки #WBN_Handler_Canvas_Container = #True !window.spider_CanvasGadget = new Proxy( window.spider_CanvasGadget, { // объявляем перехват объекта window.spider_CanvasGadget ! apply(target, that, args) { // старт перехвата нативной функции CanvasGadget ! var gRet = target(...args); // сразу выполняем нативную функцию CanvasGadget, с возвращением результата в gRet ! if( typeof args[5] !== "undefined" && (args[5] & 32) ){ // определяем, что в CanvasGadget указан флаг #PB_Canvas_Container ! var gObj = (args[0] == -1) ? spider.gadget.objects.Get(gRet) : gRet; // получаем объект гаджета. Зависит от первого параметра CanvasGadget (константа/число либо #PB_Any) ! gObj.cContainer = true; // добавляем объекту гаджета новое свойство, указывающее, что данный CanvasGadget является контейнером ! } ! return gRet; // возвращаем то, что пришло из нативной функции CanvasGadget ! } !}); CompilerEndIf #PB_EventType_Resize = 6 !window.spider_BindGadgetEvent = new Proxy( window.spider_BindGadgetEvent, { // объявляем перехват объекта window.spider_BindGadgetEvent ! apply(target, that, args) { // старт перехвата нативной функции BindGadgetEvent ! target(...args); // сразу выполняем нативную функцию BindGadgetEvent ! "undefined" === typeof args[2] && (args[2] = -1); // когда не указано событие EventType в BindGadgetEvent, то оно приводится к #PB_All ! if( args[2] == 6 || args[2] == -1 ){ // только если EventType = #PB_EventType_Resize или EventType = #PB_All ! var gObj = spider.gadget.objects.Get(args[0]); // получаем объект связанный с номером гаджета ! if(gObj.type == 11 || gObj.type == 28 || gObj.type == 16 || ( gObj.type == 33 && typeof gObj.cContainer !== "undefined" ) ){ // определяем, что гаджет, является контейнером ! gObj.Resize = new Proxy( gObj.Resize, { // объявляем перехват Resize у распознанного гаджета-контейнера ! apply(target, that, args){ // старт перехвата нативной функции Resize у распознанного гаджета-контейнера ! target(...args); // выполняем нативную функцию Resize того же самого гаджета ! gObj.isDisabled || spider.event.Send(1, gObj.windowId, gObj.id, 6); // вызываем событие #PB_EventType_Resize для того же самого гаджета ! } ! }); ! } ! } ! } !}); CompilerEndIf ;- EXAMPLE CompilerIf #PB_Compiler_IsMainFile Enumeration #Container1 #Container2 #Button #Splitter EndEnumeration Procedure _EventResizeContainer() If EventType() = #PB_EventType_Resize ResizeGadget( #Button, #PB_Ignore, GadgetHeight(#Container1)-34, #PB_Ignore, #PB_Ignore ) EndIf EndProcedure If OpenWindow(0, 0, 0, 400, 300, "SpiderBasic: #PB_EventType_Resize for container gadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ContainerGadget(#Container1, 10, 10, 380, 59, #PB_Container_Double ) : CloseGadgetList() ContainerGadget(#Container2, 0, 0, 0, 0, #PB_Container_Double ) : CloseGadgetList() SplitterGadget(#Splitter, 10, 10, 380, 275, #Container1, #Container2, #PB_Splitter_Separator) OpenGadgetList(#Container1) ButtonGadget(#Button, 10, GadgetHeight(#Container1)-34, 80, 24, "Button") CloseGadgetList() BindGadgetEvent( #Container1, @_EventResizeContainer(), #PB_EventType_Resize ) EndIf CompilerEndIf
Вариант с минимизированным JavaScript:
Код:
CompilerIf Not Defined(PB_EventType_Resize, #PB_Constant) CompilerIf Not Defined(WBN_Handler_Canvas_Container, #PB_Constant) #WBN_Handler_Canvas_Container = #True !window.spider_CanvasGadget=new Proxy(window.spider_CanvasGadget,{apply(c,b,a){var g=c(...a);if(typeof a[5]!=="undefined"&&a[5]&32){var o=(a[0]==-1)?spider.gadget.objects.Get(g):g;o.cContainer = true;};return g;}}); CompilerEndIf #PB_EventType_Resize = 6 !window.spider_BindGadgetEvent=new Proxy(window.spider_BindGadgetEvent,{apply(c,b,a){c(...a);"undefined"===typeof a[2]&&(a[2]=-1);if(a[2]==6||a[2]==-1){var o=spider.gadget.objects.Get(a[0]);if(o.type==11||o.type==28||o.type==16||(o.type==33&&typeof o.cContainer!=="undefined")){o.Resize=new Proxy(o.Resize,{apply(c,b,a){c(...a);o.isDisabled||spider.event.Send(1,o.windowId,o.id,6);}});}}}}); CompilerEndIf ;- EXAMPLE CompilerIf #PB_Compiler_IsMainFile Enumeration #Container1 #Container2 #Button #Splitter EndEnumeration Procedure _EventResizeContainer() If EventType() = #PB_EventType_Resize ResizeGadget( #Button, #PB_Ignore, GadgetHeight(#Container1)-34, #PB_Ignore, #PB_Ignore ) EndIf EndProcedure If OpenWindow(0, 0, 0, 400, 300, "SpiderBasic: #PB_EventType_Resize for container gadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ContainerGadget(#Container1, 10, 10, 380, 59, #PB_Container_Double ) : CloseGadgetList() ContainerGadget(#Container2, 0, 0, 0, 0, #PB_Container_Double ) : CloseGadgetList() SplitterGadget(#Splitter, 10, 10, 380, 275, #Container1, #Container2, #PB_Splitter_Separator) OpenGadgetList(#Container1) ButtonGadget(#Button, 10, GadgetHeight(#Container1)-34, 80, 24, "Button") CloseGadgetList() BindGadgetEvent( #Container1, @_EventResizeContainer(), #PB_EventType_Resize ) EndIf CompilerEndIf
Проверено на Web приложении. На Android и iOS пока не проверено.
Отредактировано Webarion (11.03.2024 01:35:10)