С удивлением обнаружил, что в 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)