Discusión sobre el artículo "Interfaces gráficas X: Control "Gráfico estándar" (build 4)" - página 4

 
Реter Konow:

Muy, muy extraño. En mi implementación de la interfaz, no tengo ni una sola llamada a la función ChartRedraw().

Hasta ahora no sabía realmente por qué es necesaria..... Yo trabajo con canvas (objetos bitmap) sin ella.

Cuando hay dudas, se puede rastrear tal o cual necesidad por los desarrollos de la librería estándar. Por ejemplo, la clase CCanvas.

//+------------------------------------------------------------------+
//| Actualizar objeto en pantalla (redibujar)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- comprobar
   if(m_rcname==NULL)
      return;
//--- actualizar recurso y redibujar
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

Si trabajas sin ella, en algún momento te encontrarás con que algo no se muestra en el momento más inoportuno.

etiqueta Konow:

Supongamos que la función ChartRedraw() es necesaria, - ¿entonces cada cambio de cada objeto requiere redibujar completamente todos los objetos?

No lo sé. Esto es manejado por el sistema de terminal. Puedes intentar preguntar a los desarrolladores de MQ. )

 
Anatoli Kazharski:

En caso de duda, se puede rastrear tal o cual necesidad a través de los desarrollos de la biblioteca estándar. Por ejemplo, la clase CCanvas.

//+------------------------------------------------------------------+
//| Actualizar objeto en pantalla (redibujar)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- comprobar
   if(m_rcname==NULL)
      return;
//--- actualizar recurso y redibujar
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

Si trabajas sin ella, en algún momento te encontrarás con que algo no se muestra en el momento más inoportuno.

No lo sé. Esto lo maneja el sistema de terminales. Puedes intentar preguntar a los desarrolladores. )

En mi tecnología no hay carga asociada a estas cosas. Los cambios de objetos se hacen punto por punto. ChartRedraw() no se llama en ninguna parte y no es necesario. Por lo tanto, esta pregunta debería hacerse a sus desarrolladores).

Creo que una mayor optimización de su biblioteca depende de la solución del problema de redibujar el gráfico en cada cambio de cada objeto, que no puede sino cargar el procesador.

Sin embargo, mi consejo es el siguiente: no seas demasiado aficionado a optimizar el código de la biblioteca. Puede llevar a un replanteamiento global de todo el concepto de tu tecnología. )

 
Реter Konow:

En mi tecnología no hay carga asociada a estas cosas. Los cambios de objetos se realizan punto por punto. ChartRedraw() no se llama en ninguna parte y no es necesario. Por lo tanto, esta pregunta debería hacerse más bien a sus desarrolladores).

Creo que una mayor optimización de tu librería depende de resolver el problema de redibujar el gráfico en cada cambio de cada objeto, lo cual no puede sino cargar el procesador.

Bueno, nadie más que tú sabe en qué entorno estás haciendo las pruebas. Si no has encontrado ningún problema relacionado con el redibujado, lo tienes todo de cara. Estoy seguro de ello, pues ya he pasado por todo ello hace tiempo. Por supuesto, guardarás silencio al respecto porque no vas a mostrar tu código a nadie.

Sin embargo, mi consejo para ti es: no seas demasiado aficionado a optimizar el código de la biblioteca. Puede llevar a un replanteamiento global de todo el concepto de tu tecnología. )

Asegúrate de no tener que replantearte tú mismo el concepto de tu tecnología. )

 
Anatoli Kazharski:

Nadie más que tú sabe en qué entorno realizas tus pruebas. Si no has encontrado ningún problema con el redibujado, entonces lo tienes todo de cara. Estoy seguro de ello, porque he pasado por todo esto durante mucho tiempo. Por supuesto, guardarás silencio al respecto porque no vas a mostrar tu código a nadie.

Sólo asegúrate de no tener que revisar tú mismo el concepto de tu tecnología. )

Realmente no entiendo de qué estás hablando. Usted ha visto mis trabajos. En su implementación, no hay problemas con el redibujado mientras no haya una llamada a ChartRedrow() en ningún lugar del programa.

No sé qué código enseñarte para convencerte. Dime qué mostrarte y te lo mostraré.

 

Aquí tienes un ejemplo de la función "localizador" que he implementado. (Para demostrar que no me invento las cosas).


void Имя_объекта_под_курсором()
{
static int Номер_окна,
            Номер_последнего_объекта_в_окне,
            Прежний_объект,
            Прежнее_окно;
//-------------------
   //////Alert(" Todas_las_ventanas_abiertas ",Todas_las_ventanas_abiertas);
//Si hay al menos una ventana abierta, entra en el bucle para buscar la ventana donde se encuentra el cursor.
//Si no se encuentran dichas ventanas y el contador de interacciones del bucle ha alcanzado el número total de ventanas, devuelve -1,
//lo que significa que el cursor está en el espacio libre del gráfico.
//Nota: el array "número de ventana en cola" se indexa desde cero, y "contador de todas las ventanas abiertas" cuenta desde uno.
//por lo que el número de celda del array que contiene el número de ventana según el contador es siempre uno menos que el valor del contador.
if(Всех_открытых_окон > 0)  
   {
    for(int b = 0; b <= Всех_открытых_окон; b++)
      {//////Alert("Nombre_objeto_bajo_cursor() número de interacciones de búsqueda de ventana b = ",b);
       //Si el número de interacciones alcanza el valor del contador de ventanas, significa que hemos sobrepasado el array donde se almacenan los números de estas ventanas,
       //y por lo tanto no encontró ninguna ventana bajo el cursor.
       if(b == Всех_открытых_окон)
         {
          Номер_окна = -1;
          //Existía un grave error debido a la falta de puesta a cero de estas variables al salir de la zona de ventanas. ---
          //------------------------------
          ОКНО                    =   0;
          ОБЪЕКТ                  =   0;
          ЭЛЕМЕНТ                 =   0;
          ТИП_ЭЛЕМЕНТА            =   0;
          КАТЕГОРИЯ_ОБЪЕКТА       =   0;
          ПОДКАТЕГОРИЯ_ОБЪЕКТА    =   0;
          ПОДГРУППА_ОБЪЕКТА       =   0;
          КАТЕГОРИЯ_ЭЛЕМЕНТА      =   0;
          КООРДИНАТА_ОКНА_X       =   0;
          КООРДИНАТА_ОКНА_Y       =   0;
          ШИРИНА_ОКНА             =   0;
          ВЫСОТА_ОКНА             =   0;
          НИЖНЯЯ_ТОЧКА_ОКНА       =   0;
          ПРАВАЯ_ТОЧКА_ОКНА       =   0;
          //-------------------
          ТИП_ОКНА                =   0;
          КАТЕГОРИЯ_ОКНА          =   0;
          ОКНО_ВСЕГДА_СВЕРХУ      =   0;        
          ОКНО_ПРИКРЕПЛЕНО        =   0;
          МАТЕРИНСКОЕ_ОКНО        =   0;
          ЗОНА_ОКНА               =   0;
          РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА  =   0;
          КАТЕГОРИЯ_МАТЕРИНСКОГО_ОКНА      =    0;
          //------------------------------
          НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА        =   0;    
          КАТЕГОРИЯ_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА    =   0;  
          СОБЫТИЕ_СМЕНЫ_СОСТОЯНИЙ_ЭЛЕМЕНТА       =   0;  
          ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА             =   0;
          ЭЛЕМЕНТ_АКТИВИРОВАН                    =   0;
          КАНВАС                                 =   0;
          //---------------------
          if(Иконка_ручки)
            {
             ObjectDelete(Иконка_ручки);
             Иконка_ручки = 0;
            }
         // return(-1);
         }/**/
       //------------
       //Comprueba si la ventana está bajo el cursor.
       if(
             X > G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X]
          && X < G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X] + G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X_SIZE]            
          && Y > G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y]
          && Y < G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y] + G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y_SIZE]
         )
         {
          //---------------------------
          ОКНО = Номер_окна_в_очереди[b];
          //---------------------------
          ТИП_ОКНА                =   G_CORE[ОКНО][_W_Properties][_WINDOW_TYPE];
          КАТЕГОРИЯ_ОКНА          =   G_CORE[ОКНО][_W_Properties][_WINDOW_CATEGORY];
          ОКНО_ВСЕГДА_СВЕРХУ      =   G_CORE[ОКНО][_W_Properties][_WINDOW_ALWAYS_ON_TOP];
          //------------------------------
          КООРДИНАТА_ОКНА_X       =   G_CORE[ОКНО][_MAIN_FRAME][_X];
          КООРДИНАТА_ОКНА_Y       =   G_CORE[ОКНО][_MAIN_FRAME][_Y];
          ШИРИНА_ОКНА             =   G_CORE[ОКНО][_MAIN_FRAME][_X_SIZE];
          ВЫСОТА_ОКНА             =   G_CORE[ОКНО][_MAIN_FRAME][_Y_SIZE];
          НИЖНЯЯ_ТОЧКА_ОКНА       =   КООРДИНАТА_ОКНА_Y + ВЫСОТА_ОКНА;
          ПРАВАЯ_ТОЧКА_ОКНА       =   КООРДИНАТА_ОКНА_X + ШИРИНА_ОКНА;
          //------------------------------
          ОКНО_ПРИКРЕПЛЕНО        =   G_CORE[ОКНО][_W_Properties][_WINDOW_BIND_TO_WINDOW_NUMBER];
          МАТЕРИНСКОЕ_ОКНО        =   ОКНО_ПРИКРЕПЛЕНО;
          КАТЕГОРИЯ_МАТЕРИНСКОГО_ОКНА = G_CORE[МАТЕРИНСКОЕ_ОКНО][_W_Properties][_WINDOW_CATEGORY];
          ЗОНА_ОКНА               =   G_CORE[ОКНО][_W_Properties][_WINDOW_ZONE];
          //------------------------------
          РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА  =   G_CORE[ОКНО][_W_Properties][_WINDOW_CURRENT_SIZE_MODE];
          //------------------------------
          break;
         }
      }        
//-----------------------------------------
if(Прежнее_окно != ОКНО)
   {//////Alert("Número_ventana != VENTANA");
    for(int d = 1; d < 500; d++)
       {
        if(G_CORE[ОКНО][d][_NAME] == 0)
          {
           Номер_последнего_объекта_в_окне = d - 1;
           break;
          }
        }
   // ////Alert("Número_último_objeto_en_ventana ",Número_último_objeto_en_ventana);// Ventana_anterior = Ventana;
     }
//--------------------------------------------------------------------------------------
//Inicia el ciclo de búsqueda del objeto bajo el cursor a partir del último objeto de la ventana.
//Selecciona el primer objeto coincidente bajo el cursor y comprueba si la hora de su creación
// más reciente que la última hora de creación registrada de cualquier otro objeto que también se encuentre
//bajo el cursor y comprobado anteriormente, es su número el que acepta la variable global OBJECT.
//Al final del bucle, el último y más reciente objeto bajo el cursor permanece en la variable OBJECT.
//Este enfoque es necesario para determinar no sólo el primer objeto encontrado bajo el cursor, sino ese objeto
//que puede oscurecer el primer objeto encontrado, ya que fue redibujado en un evento handle o scroll,
//pero su número en la ventana es anterior al número del objeto bajo el cursor, por lo que si rompemos el bucle,
//entonces no llegaremos a ella.
//---------------------------------------------------------------------------------------
    int Последний_объект_под_курсором;
    //--------------------------------------
    for(int c = Номер_последнего_объекта_в_окне; c >= 1; c--)
      {        
       if(
             ((G_CORE[ОКНО][c][_OBJ_TYPE] != Obj_Pixel && !G_CORE[ОКНО][c][_OBJECT_HIDE])
              ||(
                 G_CORE[ОКНО][c][_OBJ_TYPE] == Obj_Pixel
                 && !G_CORE[ОКНО][c][_OBJECT_HIDE]
                 && !G_CORE[ОКНО][G_CORE[ОКНО][c][_GROUP_MAIN_OBJECT]][_OBJECT_HIDE]
                 ))
          && G_CORE[ОКНО][c][_OBJECT_CATEGORY] != _DEC //En lugar de esta entrada, haga que la propiedad del objeto sea invisible para la función de coordinación.
          && X > G_CORE[ОКНО][c][_X] && X < (G_CORE[ОКНО][c][_X] + G_CORE[ОКНО][c][_X_SIZE])
          && Y > G_CORE[ОКНО][c][_Y] && Y < (G_CORE[ОКНО][c][_Y] + G_CORE[ОКНО][c][_Y_SIZE])
         )
         {
          if(c != 1)Последний_объект_под_курсором = c;
           ОБЪЕКТ = c;
          //---------------------------------------------------------------
          //Ajustar el foco de los elementos, objetos, propiedades y parámetros.
          //---------------------------------------------------------------
          ЭЛЕМЕНТ                 =   G_CORE[ОКНО][ОБЪЕКТ] [_GROUP_MAIN_OBJECT];
          КАНВАС                  =   G_CORE[ОКНО][ОБЪЕКТ] [_DROWING_CANVAS];
          ТИП_ЭЛЕМЕНТА            =   G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_GROUP];
          КАТЕГОРИЯ_ОБЪЕКТА       =   G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_CATEGORY];
          ПОДКАТЕГОРИЯ_ОБЪЕКТА    =   G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_SUBCATEGORY];
          ПОДГРУППА_ОБЪЕКТА       =   G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_SUBGROUP];
          КАТЕГОРИЯ_ЭЛЕМЕНТА      =   G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_CATEGORY];
          //------------------------------
          СОБЫТИЕ_СМЕНЫ_СОСТОЯНИЙ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_CHANGE_STATE_STANDART_EVENT];
          ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА       = G_CORE[ОКНО][ЭЛЕМЕНТ][_CURRENT_STATE];
          ЭЛЕМЕНТ_АКТИВИРОВАН              = ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА;
          //------------------------------
          НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА        = G_CORE[ОКНО][ОБЪЕКТ][_WON];
          КАТЕГОРИЯ_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА    = G_CORE[НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА][_W_Properties][_WINDOW_CATEGORY];  
          //------------------------------
          _Имя_объекта_под_курсором =  G_CORE[ОКНО][ОБЪЕКТ][_NAME];
          //------------------------------
          if(!G_CORE[ОКНО][c][_OBJECT_SCROLLED] && ОБЪЕКТ != _MAIN_FRAME)break;
          //------------------------------
          if(c == 1 && Последний_объект_под_курсором != 0)ОБЪЕКТ = Последний_объект_под_курсором;
          if(c == 1 && Последний_объект_под_курсором == 0)ОБЪЕКТ = _MAIN_FRAME;
         }
       //---------------------------------------------------------------
      }
   ///Alert("_Nombre_del_objeto_bajo_Cursor ",_Nombre_del_objeto_bajo_Cursor);
//-----------------------------------------
if(РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА != _MAXIMIZED_MODE)
{
int Тип_иконки = _NO_ICON;

//Верхний левый уголок-----------------------------------------
if(КАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_CATEGORY_WINDOW_HANDLE || КАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_CATEGORY_WINDOW_RESIZE_HANDLE)
{      
//----------------------
if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_LEFT_HANDLE || ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_RIGHT_HANDLE)Тип_иконки = _RIGHT_n_LEFT_ARROW;
//-----------------------------------------
if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE)Тип_иконки = _UP_n_DOWN_ARROW;    
//----------------------------
if(ПОДГРУППА_ОБЪЕКТА == _OBJECT_SUBCATEGORY_4_POINTS_TOOLBAR_HANDLE)Тип_иконки = _CROSSED_ARROWS;
  //----------------------------
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
//Левый верхний уголок-----------------------------------------
  if(X >= КООРДИНАТА_ОКНА_X && X <= КООРДИНАТА_ОКНА_X + 6 && Y >= КООРДИНАТА_ОКНА_Y && Y <= КООРДИНАТА_ОКНА_Y + 6)
   {
    Тип_иконки = _UP_LEFT_to_DOWN_RIGHT_ARROW;
    ОБЪЕКТ = 400000;
   }
//Левый нижний уголок-----------------------------------------
if(X >= КООРДИНАТА_ОКНА_X && (X <= КООРДИНАТА_ОКНА_X + 5) && Y >= (НИЖНЯЯ_ТОЧКА_ОКНА - 5) && Y <= НИЖНЯЯ_ТОЧКА_ОКНА)
   {
    Тип_иконки = _UP_RIGHT_to_DOWN_LEFT_ARROW;
    ОБЪЕКТ = 500000;
   }
//Правый верхний уголок-----------------------------------------
if(X >= (ПРАВАЯ_ТОЧКА_ОКНА - 5) && X <= ПРАВАЯ_ТОЧКА_ОКНА && Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y  + 5))
   {
    Тип_иконки = _UP_RIGHT_to_DOWN_LEFT_ARROW;
    ОБЪЕКТ = 600000;
   }
//Правый нижний уголок-----------------------------------------
if(X >= (ПРАВАЯ_ТОЧКА_ОКНА - 5) && X <= ПРАВАЯ_ТОЧКА_ОКНА && Y >= (НИЖНЯЯ_ТОЧКА_ОКНА - 5)&& Y <= НИЖНЯЯ_ТОЧКА_ОКНА)
   {
    Тип_иконки = _UP_LEFT_to_DOWN_RIGHT_ARROW;
    ОБЪЕКТ = 700000;    
   }
//-----------------------------------------
if(X >= (КООРДИНАТА_ОКНА_X + 6) && X <= (ПРАВАЯ_ТОЧКА_ОКНА - 6) && Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y   + 6))
   {
    Тип_иконки = _UP_n_DOWN_ARROW;
    ОБЪЕКТ = 800000;
   }
//-----------------------------------------
if(ОКНО_ПРИКРЕПЛЕНО)
   {
    if(ЗОНА_ОКНА == 1 || ЗОНА_ОКНА == 10)
      {
       if((ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_LEFT_HANDLE || ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_RIGHT_HANDLE)  
          && ((X >= КООРДИНАТА_ОКНА_X && X <= (КООРДИНАТА_ОКНА_X + 2)) || (X >= ((ПРАВАЯ_ТОЧКА_ОКНА) - 2) && X <= (ПРАВАЯ_ТОЧКА_ОКНА))))
         {
          Тип_иконки = _MULTI_HANDLE_LR;
         }
      }  
    //-----------------------------------------
    if(ЗОНА_ОКНА == 6 || ЗОНА_ОКНА == 3)
      {
       if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE && ((Y >= (НИЖНЯЯ_ТОЧКА_ОКНА) - 2) && (Y <= (НИЖНЯЯ_ТОЧКА_ОКНА))))
         {
          Тип_иконки = _MULTI_HANDLE_UD;
         }
      }
    //-----------------------------------------
    if(ЗОНА_ОКНА == 7 || ЗОНА_ОКНА == 4)
      {
       if((ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE || ОБЪЕКТ == _STANDART_OBJECT_HEAD_DOWN_HANDLE)  
         && (((Y >= (НИЖНЯЯ_ТОЧКА_ОКНА) - 2) && Y <= (НИЖНЯЯ_ТОЧКА_ОКНА)) ||(Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 3))))
         {
          Тип_иконки = _MULTI_HANDLE_UD;
         }
      }
    //-----------------------------------------
    if(ЗОНА_ОКНА == 8 || ЗОНА_ОКНА == 5)
      {
       if(Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 3))
         {
          Тип_иконки = _MULTI_HANDLE_UD;
         }      
      }
   }
//-----------------------------------------
//-----------------------------------------
if(Иконка_ручки != Тип_иконки && Тип_иконки != _NO_ICON)
   {
    ObjectDelete(Иконка_ручки);
    Иконка_ручки = Тип_иконки;
    Создать_иконку(Иконка_ручки);
   }
   Перемещать_иконку_за_курсором();
//------------------------------------------
}
if(Событие_Left_Click && Тип_иконки != _NO_ICON)Перемещение_окна = 1;  
//------------------------------------------
if(Иконка_ручки && Тип_иконки == _NO_ICON)
   {
    ObjectDelete(Иконка_ручки);
    Иконка_ручки = 0;
   }
//-----------------------------
}  
  
//Arreglar los eventos _OBJECT_DISAPPOINTED y _OBJECT_POINTED, y si el objeto tiene un script para estos eventos,
//llamar al bloque de comportamiento del objeto para implementarlo.
//-----------------------------------------------------
if(Прежний_объект != ОБЪЕКТ)
   {
    int Номер_вызываемого_окна_прежнего_объекта      = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_OPEN_CLOSE_WINDOW_FUNCTION];
    int Категория_вызываемого_окна_прежнего_объекта  = G_CORE[Номер_вызываемого_окна_прежнего_объекта][_W_Properties][_WINDOW_CATEGORY];
    int Номер_вызываемого_окна = G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_OPEN_CLOSE_WINDOW_FUNCTION];
    int Категория_вызываемого_окна = G_CORE[Номер_вызываемого_окна][_W_Properties][_WINDOW_CATEGORY];
    int Сценарий_DISAPPOINTED_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_DISAPPOINTED];
    int Тип_элемента_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_GROUP];
    //---------------------------------------------------------
      
      
//-------------------------------------------------------------------------------------------------------------
//Realizar el comportamiento de las ventanas del menú principal cuando la bandera "Open_window_menu" está activada ---------------------------
//Si el nuevo objeto bajo el cursor es una pestaña del menú principal, cierra las ventanas de menú de la pestaña anterior y abre el menú de esta pestaña.
//El bloque implementa la apertura y cierre secuencial de las ventanas de menú cuando el cursor se desplaza por las pestañas del menú principal.
//-------------------------------------------------------------------------------------------------------------
if(Открыто_окно_меню)
   {//////Alert(OBJECT);
   //---------------
   if(
          Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]
       && Категория_вызываемого_окна_прежнего_объекта == _CONTEXT_MENU
       && ОКНО != Номер_вызываемого_окна_прежнего_объекта
     )
     {
      Явление_окон(_CONTEXT_MENU_WINDOWS_TOTAL_CLOSE,_CONTEXT_MENU);
     }
   //---------------
    //////Alert("Número_ventana_llamada ",Número_ventana_llamada, " Categoría_ventana_llamada ",Categoría_ventana_llamada);
    //----------------------------------------------------------------------------------------------------------
    if(Категория_вызываемого_окна == _MAIN_MENU && !Открыто_окно[Номер_вызываемого_окна])
      {
       Явление_окон(_MAIN_MENU_WINDOWS_TOTAL_CLOSE,_MAIN_MENU);
       Явление_окон(_WINDOW_OPEN,Номер_вызываемого_окна);
      }
    //---------------
    if(Категория_вызываемого_окна == _CONTEXT_MENU && !Открыто_окно[Номер_вызываемого_окна])
      {
       Явление_окон(_WINDOW_OPEN,Номер_вызываемого_окна);
      }
    //---------------
   }  
    //-----------------------------------------------
    СОБЫТИЕ = _OBJECT_DISAPPOINTED;
    //-----------------------------------------------
      if(Сценарий_DISAPPOINTED_прежнего_объекта)
        {
         if(!((Тип_элемента_прежнего_объекта == _TAB || Тип_элемента_прежнего_объекта == _MENU_ITEM) && Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]))
           {
            Поведение_объектов(_STOPABLE_SINGLE_PLAY_MODE,_OBJECT_DISAPPOINTED, Прежнее_окно,Прежний_объект);
           }
         //--------------------------
         if(Открыто_окно[_TOOLTIP_WINDOW])Закрыть_окно_Tooltip();    
         //--------------------------
       }
      //---------------------------------------------------------
      СОБЫТИЕ = _OBJECT_POINTED;
      //---------------------------------------------------------
      
      if(G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_POINTED])
        {
         if(!((ТИП_ЭЛЕМЕНТА == _TAB || ТИП_ЭЛЕМЕНТА == _MENU_ITEM) && Открыто_окно[НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА]))
           {
            Поведение_объектов(_STOPABLE_SINGLE_PLAY_MODE,_OBJECT_POINTED);
           }
         //--------------------------
         if(G_CORE[ОКНО][ОБЪЕКТ][_TOOLTIP_TEXT])Открыть_окно_Tooltip();
        }  
      //--------------------------

//--------------------------------------------------------------------------------------------------------------
Прежний_объект = ОБЪЕКТ;
Прежнее_окно = ОКНО;
//--------------------------
}  
}
}  
 
Реter Konow:

Realmente no sé de qué estás hablando. Usted ha visto mi trabajo. En su implementación, no hay problemas con el redibujado, a pesar de que no hay ninguna llamada a ChartRedrow() en ningún punto del programa.

Lo que he visto en su trabajo no se ajusta a ninguna puerta en absoluto. Además, por lo que has demostrado podemos sacar una clara conclusión de que estás probando sólo en MetaTrader 4.

Retag Konow:

No sé qué código mostrarte para convencerte. Dime que te muestro y te lo muestro.

No me lo enseñes a mi, sino a quien se lo vayas a vender. No quiero probar algo que no usaría en mi propio desarrollo. Primero, lleva todo a un nivel aceptable y proporciona una descripción detallada de las capacidades de tus desarrollos, al menos como se hace en mi caso. Después de eso podremos sacar conclusiones sobre lo que estás haciendo.

 
Реter Konow:

Aquí tienes un ejemplo de la función "localizador" que he implementado. (Para demostrar que no me estoy inventando nada).

Por desgracia, no me dice nada. Todo se aprende probando y comparando diferentes métodos. Ya veré cuando presente la primera versión de su librería en modo demo. Por supuesto, no compraré nada. )
 
Anatoli Kazharski:
Por desgracia, eso no me dice nada. Todo se aprende probando y comparando diferentes métodos. Ya veré cuando presente la primera versión de su biblioteca en modo demo. Por supuesto, no compraré nada. )

Te estás saliendo del tema. Puedes criticar mi trabajo, pero no puedes decir que se ralentiza. (Extraña crítica: "de ninguna manera").

No voy a venderte nada personalmente, sino a darte una oportunidad para que lo uses, sí.

Lo que tú llamas mi "biblioteca" no es realmente una biblioteca. Es un mecanismo cerrado y autosuficiente al que no puedes conectar código ajeno y que no puedes conectar a tu propio código.

Ahora critico constructivamente tus soluciones poniendo como ejemplo las mías. Si no lo necesitas, se acabó la discusión.

 
Реter Konow:

Te estás saliendo del tema. Puedes criticar mi trabajo, pero no puedes decir que te frena. (Extraña crítica: "de ninguna manera").

Entonces no te desvíes del tema. De mi tema, que he descrito detalladamente en varias decenas de artículos. ¿Qué tiene esto que ver con vuestras tecnologías cerradas e inaccesibles, que anunciáis constantemente por adelantado, antes de ponerlas a la venta?

No estoy diciendo que ustedes tengan algo que se ralentiza. Lo que quiero decir es que no sabes si se está ralentizando o no. Se puede decir cualquier cosa. ¿Dónde están los archivos para las pruebas? ¿Y dónde se ralentiza/no se ralentiza? ¿En MetaTrader 4/5? ¿En Windows 7/8/10? Esa es la cuestión. )

Konow Retag:

Es un mecanismo cerrado y autosuficiente que no se puede conectar el código de otra persona y no puede conectar su propio código.

Estoy seguro de que esa es su mayor desventaja. De nuevo, ¿autónomo para quién? ¿Sólo para ti? Es demasiado pronto para hacer esas afirmaciones para todo el mundo. Y sólo será autosuficiente para los demás cuando los que vayan a utilizarlo te hablen de él.

Retag Konow:

Ahora estoy criticando constructivamente tus soluciones dando mis propias soluciones como ejemplo. Si no las necesitas, se acabó la discusión.

Por supuesto que es muy interesante y útil. Especialmente para ti y para otros recién llegados. Haciendo preguntas y obteniendo respuestas a las mismas, ayudas a otros a adquirir nuevos conocimientos también.

Pero tus críticas sin aportar ningún material que confirme tus afirmaciones no son constructivas.

Gracias.

 
Anatoli Kazharski:

1. Entonces no te desvíes del tema. De mi tema, que he descrito detalladamente en varias decenas de artículos. ¿Qué tiene esto que ver con sus tecnologías cerradas e inaccesibles, que usted anuncia constantemente por adelantado, antes de ponerlas a la venta?

2. Yo no afirmo que ustedes tengan algo que se ralentiza. Lo que quiero decir es que no sabes si se está ralentizando o no. Se puede decir cualquier cosa. ¿Dónde están los archivos de prueba? ¿Y dónde se ralentiza/no se ralentiza? ¿En MetaTrader 4/5? ¿En Windows 7/8/10? Esa es la cuestión. )

3. Estoy seguro de que es su mayor desventaja. De nuevo, ¿autónomo para quién? ¿Sólo para usted? Es demasiado pronto para hacer tales afirmaciones para todo el mundo. Y será autosuficiente para los demás sólo cuando los que vayan a utilizarlo te lo digan.

4. Sin duda es muy interesante y útil. Especialmente para ti y para otros recién llegados. Haciendo preguntas y obteniendo respuestas a ellas, ayudas a los demás a adquirir también nuevos conocimientos.

5. Pero tus críticas sin aportar ningún material que apoye tus afirmaciones no son constructivas.

6. Gracias.

1. innecesario...

2. El hecho de que mi aplicación no se ralentiza se puede ver en el vídeo.

3. redundante...

4. Correcto. Por eso estoy debatiendo contigo. Desde mi punto de vista, tu solución de redibujar todo el gráfico en el evento de cada objeto no es eficiente y causa carga adicional en el procesador. La optimización depende de resolver este problema correctamente. No tengo ChartRedrow() llamada a la función (tome su palabra por favor), y la interfaz no se ralentiza (se puede ver en el video) y todo lo que necesita ser actualizado.

De ahí mi sugerencia: No utilices el redibujado constante del gráfico, ya que puedes prescindir de él.

5. Prueba de que mis afirmaciones están justificadas es mi palabra de que no uso ChartRedrow() y el vídeo donde puedes ver el resultado de arreglártelas sin esta función.

6. Y gracias.