Обсуждение статьи "Графические интерфейсы X: Элемент "Стандартный график" (build 4)" - страница 4

 
Реter Konow:

 Очень, очень странно. В своей реализации интерфейса у меня нет ни одного вызова функции ChartRedraw()

До сих пор я толком не знал зачем она нужна... С канвасом (объектами битмап) я работаю без нее. 

Когда возникают, какие-то сомнения, то ту или иную необходимость Вы можете проследить по разработкам стандартной библиотеки. Например, класс CCanvas.

//+------------------------------------------------------------------+
//| Update object on screen (redraw)                                 |
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- check
   if(m_rcname==NULL)
      return;
//--- update resource and redraw
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

Если работаете без неё, то в какой-то момент столкнётесь с тем, что что-то не отобразилось в самый неподходящий момент. 

Реter Konow: 

Допустим функция ChartRedraw() необходима, - тогда получается каждое изменение, каждого объекта требует полной перерисовки всех объектов?  

Не знаю. Этим занимается система терминала. Можете попробовать задать вопрос разработчикам MQ. )

 
Anatoli Kazharski:

Когда возникают, какие-то сомнения, то ту или иную необходимость Вы можете проследить по разработкам стандартной библиотеки. Например, класс CCanvas.

//+------------------------------------------------------------------+
//| Update object on screen (redraw)                                 |
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- check
   if(m_rcname==NULL)
      return;
//--- update resource and redraw
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

Если работаете без неё, то в какой-то момент столкнётесь с тем, что что-то не отобразилось в самый неподходящий момент. 

Не знаю. Этим занимается система терминала. Можете попробовать задать вопрос разработчикам. )

В моей технологии отсутствует нагрузка связанная с подобными вещами. Изменения объектов осуществляются точечно. ChartRedraw() у меня нигде не вызывается и в ней нет необходимости. Поэтому, этот вопрос скорее нужно задать разработчикам Вам.) 

Думаю, дальнейшая оптимизация Вашей библиотеки зависит от решения проблемы с перерисовкой графика на каждом изменении каждого объекта, что не может не нагружать процессор.

Впрочем, мой Вам совет: не слишком увлекайтесь оптимизацией кода библиотеки. Это может привести к глобальному переосмыслению всей концепции Вашей технологии. )

 
Реter Konow:

В моей технологии отсутствует нагрузка связанная с подобными вещами. Изменения объектов осуществляются точечно. ChartRedraw() у меня нигде не вызывается и в ней нет необходимости. Поэтому, этот вопрос скорее нужно задать разработчикам Вам.) 

Думаю, дальнейшая оптимизация Вашей библиотеки зависит от решения проблемы с перерисовкой графика на каждом изменении каждого объекта, что не может не нагружать процессор. 

Ну, кроме Вас ведь больше никому неизвестно, в какой среде Вы проводите свои тесты. Если не столкнулись с проблемами связанными с перерисовкой, то у Вас ещё всё впереди. Я вот в этом точно уверен, так как уже давно прошёл через всё это. Вы конечно же об этом промолчите, ведь свой код Вы не собираетесь никому показывать.

Впрочем, мой Вам совет: не слишком увлекайтесь оптимизацией кода библиотеки. Это может привести к глобальному переосмыслению всей концепции Вашей технологии. ) 

Смотрите, чтобы Вам самому не пришлось концепцию своей технологии пересматривать. )

 
Anatoli Kazharski:

Ну, кроме Вас больше никому неизвестно, в какой среде Вы проводите свои тесты. Если не столкнулись с проблемами связанными с перерисовкой, то у Вас ещё всё впереди. Я вот в этом точно уверен, так как уже давно прошёл через всё это. Вы конечно же об этом промолчите, ведь свой код Вы не собираетесь никому показывать.

Смотрите, чтобы Вам самому не пришлось концепцию своей технологии пересматривать. )

Я правда не понимаю, о чем Вы говорите. Вы видели мои работы. В их реализации нет проблем с перерисовкой при том, что нет вызова ChartRedrow() ни в одном месте программы.

Я не знаю, какой код показать Вам, чтобы Вы убедились. Скажите что показать, я покажу.

 

Вот пример той функции "локализатора", которая у меня реализована. (В доказательство того, что я не просто так придумываю).


void Имя_объекта_под_курсором()
{
static int Номер_окна,
            Номер_последнего_объекта_в_окне,
            Прежний_объект,
            Прежнее_окно;
//-------------------
   //////Alert("  Всех_открытых_окон ",Всех_открытых_окон);
//Если открыто хоть одно окно, входим в цикл поиска того окна, на котором находится курсор.
//Если таких окон не найдено и счетчик интераций цикла достиг общего кол-во окон, то возвращаем -1,
//что означает, что курсор находится на свободном пространстве графика.  
//Заметка: массив "номер окна в очереди" индексируется от нуля, а "счетчик всех открытых окон" считает от единицы.
//поэтому номер ячейки массива содержащий номер окна по счетчику, всегда на единицу меньше значения счетчика.
if(Всех_открытых_окон > 0)  
   {
    for(int b = 0; b <= Всех_открытых_окон; b++)
      {//////Alert("Имя_объекта_под_курсором() колич.интераций поиска окон b = ",b);
       //Если кол-во интераций доходит до значения счетчика окон, значит мы вышли за пределы массива, в котором записаны номера этих окон,
       //и следовательно не нашли ни одного окна под курсором.
       if(b == Всех_открытых_окон)
         {
          Номер_окна = -1;
          //Был серьезный баг из за отсутствия обнуления этих переменных при выходе из зоны окон.---
          //------------------------------
          ОКНО                    =   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);
         }/**/
       //------------
       //Проверяем, находится ли окно под курсором.
       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("Номер_окна != ОКНО");
    for(int d = 1; d < 500; d++)
       {
        if(G_CORE[ОКНО][d][_NAME] == 0)
          {
           Номер_последнего_объекта_в_окне = d - 1;
           break;
          }
        }
   //  ////Alert("Номер_последнего_объекта_в_окне  ",Номер_последнего_объекта_в_окне);// Прежнее_окно = ОКНО;  
     }
//--------------------------------------------------------------------------------------    
//Начинаем цикл поиска объекта под курсором с последнего объекта окна.
//Выбираем первый совпаший по координатам объект под курсором, и проверяем - если время его создания
//более позднее, чем последнее записанное время создания любого другого объекта, также находящегося
//под курсором и проверенного ранее, то именно его номер принимает глобальная переменная ОБЪЕКТ.
//В конце цикла в переменной ОБЪЕКТ остается последний и самый поздний по созданию объект под курсором.
//Данный подход необходим для определения не просто первого найденного объекта под курсором, а того объекта
//который может заслонять первый найденный объект, так как был перерисован на событии ручек или прокрутки,
//однако его номер в окне находится перед номером объекта под курсором и поэтому если мы прервем цикл,
//то мы просто до него не дойдем.
//---------------------------------------------------------------------------------------
    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 //Вместо это записи, сделать свойство объекта - быть невидимым для функции координации.
          && 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;
          //---------------------------------------------------------------
          //Устанавливаем фокус элементов, объектов, свойств и параметров.
          //---------------------------------------------------------------
          ЭЛЕМЕНТ                 =   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("_Имя_объекта_под_курсором  ",_Имя_объекта_под_курсором);
//-----------------------------------------
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;
   }
//-----------------------------    
}  
  
//Фиксируем события  _OBJECT_DISAPPOINTED и _OBJECT_POINTED, и если есть сценарий у объекта для этих событий,
//вызываем блок поведения объектов для его реализации.
//-----------------------------------------------------              
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];
    //---------------------------------------------------------
      
      
//-------------------------------------------------------------------------------------------------------------
//Реализуем поведение окон главного меню при установленном флаге "Открыто_окно_меню"---------------------------
//Если новый объект под курсором является вкладкой главного меню, закрываем окна меню предыдущей вкладки и открываем меню этой.
//Блок реализует последовательное открытие и закрытие окон меню при движения курсора по вкладкам главных меню.
//-------------------------------------------------------------------------------------------------------------
if(Открыто_окно_меню)
   {//////Alert(ОБЪЕКТ);
   //---------------
   if(
          Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]
       && Категория_вызываемого_окна_прежнего_объекта == _CONTEXT_MENU
       && ОКНО != Номер_вызываемого_окна_прежнего_объекта
     )
     {
      Явление_окон(_CONTEXT_MENU_WINDOWS_TOTAL_CLOSE,_CONTEXT_MENU);
     }
   //---------------  
    //////Alert("Номер_вызываемого_окна  ",Номер_вызываемого_окна, "  Категория_вызываемого_окна  ",Категория_вызываемого_окна);
    //----------------------------------------------------------------------------------------------------------
    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:

Я правда не понимаю, о чем Вы говорите. Вы видели мои работы. В их реализации нет проблем с перерисовкой при том, что нет вызова ChartRedrow() ни в одном месте программы. 

То, что я у Вас видел, вообще ни в какие ворота не лезет. К тому же, из того, что Вы демонстрировали можно сделать однозначный вывод о том, что тесты Вы проводите пока только в MetaTrader 4.

Реter Konow:

Я не знаю, какой код показать Вам, чтобы Вы убедились. Скажите что показать, я покажу.

Не мне показывать надо, а тем, кому Вы собираетесь это продавать. Я не хочу тестировать то, что не стал бы использовать в своих разработках. Доведите для начала всё до приемлемого уровня и представьте подробное описание возможностей своих разработок, хотя бы так, как это сделано у меня. После этого уже можно будет сделать выводы о том, что Вы делаете.

 
Реter Konow:

Вот пример той функции "локализатора", которая у меня реализована. (В доказательство того, что я не просто так придумываю).

К сожалению, мне это ни о чём не говорит. Всё познаётся в тестировании и сравнении различных методов. Посмотрю, когда представите первую версию своей библиотеки в демо-режиме. Покупать конечно я ничего не буду. )
 
Anatoli Kazharski:
К сожалению, мне это ни о чём не говорит. Всё познаётся в тестировании и сравнении различных методов. Посмотрю, когда представите первую версию своей библиотеки в демо-режиме. Покупать конечно я ничего не буду. )

Вы уходите от темы. Критиковать мои работы можно, но сказать что они тормозят - нет. (Странная критика: "ни в какие ворота").

Продавать Вам лично я ничего не собираюсь, но дать попробывать использовать - да.

То, что Вы называете моей "библиотекой", по сути таковой не является. Это закрытый и самодостаточный механизм, к которому нельзя подключить чужой код и который нельзя подключить к своему коду.

Сейчас я провожу конструктивную критику Ваших решений, приводя в пример свои решения. Если Вам это не нужно, то дискуссия завершена.

 
Реter Konow:

Вы уходите от темы. Критиковать мои работы можно, но сказать что они тормозят - нет. (Странная критика: "ни в какие ворота").

Ну так и не уводите от темы. От моей темы, которую я подробнейшим образом описал в нескольких десятках статьях. При чём здесь Ваши закрытые и никому недоступные технологии, которые Вы постоянно рекламируете заранее, перед тем, как выставить их на продажу?

Я и не утверждаю, что у Вас что-то тормозит. Имеется в виду, что вообще неизвестно, тормозит или нет. Сказать ведь можно всё, что угодно. Где файлы для тестов? И где тормозит/не тормозит? В MetaTrader 4/5 ? В Windows 7/8/10 ? Вот в чём вопрос. )

Реter Konow: 

Это закрытый и самодостаточный механизм, к которому нельзя подключить чужой код и который нельзя подключить к своему коду.  

Уверен, что это самый большой его минус. Опять же, для кого самодостаточный? Только для Вас? За всех ведь пока рано такие заявления делать. А самодостаточным для других он будет только тогда, когда Вам об этом скажут те, кто это будет использовать.

Реter Konow: 

Сейчас я провожу конструктивную критику Ваших решений, приводя в пример свои решения. Если Вам это не нужно, то дискуссия завершена.

Это конечно очень интересно и полезно. Особенно для Вас и для других новичков. Задавая вопросы и получая на них ответы, Вы тем самым помогаете и другим тоже приобрести новые знания.

Только вот Вашу критику без предоставления, какого-либо материала для подтверждения Ваших утверждений, пока конструктивной назвать не получается.

Спасибо. 

 
Anatoli Kazharski:

1. Ну так и не уводите от темы. От моей темы, которую я подробнейшим образом описал в нескольких десятках статьях. При чём здесь Ваши закрытые и никому недоступные технологии, которые Вы постоянно рекламируете заранее, перед тем, как выставить их на продажу?

2. Я и не утверждаю, что у Вас что-то тормозит. Имеется в виду, что вообще неизвестно, тормозит или нет. Сказать ведь можно всё, что угодно. Где файлы для тестов? И где тормозит/не тормозит? В MetaTrader 4/5 ? В Windows 7/8/10 ? Вот в чём вопрос. )

3. Уверен, что это самый большой его минус. Опять же, для кого самодостаточный? Только для Вас? За всех ведь пока рано такие заявления делать. А самодостаточным для других он будет только тогда, когда Вам об этом скажут те, кто это будет использовать.

4. Это конечно очень интересно и полезно. Особенно для Вас и для других новичков. Задавая вопросы и получая на них ответы, Вы тем самым помогаете и другим тоже приобрести новые знания.

5. Только вот Вашу критику без предоставления, какого-либо материала для подтверждения Ваших утверждений, пока конструктивной назвать не получается.

6. Спасибо. 

1. Лишнее...

2. То, что моя реализация не тормозит видно на видео.

3. Лишнее...

4. Верно. Поэтому я с Вами и дискутирую. С моей точки зрения, Ваше решения перерисовки всего графика на событии каждого объекта не является эффективным и служит причиной дополнительной нагрузки на процессор. Оптимизация зависит от правильного решения этой проблемы. У меня нет вызова функции ChartRedrow() (поверьте на слово пожалуйста), и интерфейс не тормозит (на видео это видно) и все что нужно обновляется.

Отсюда мое предложение: Не используйте постоянную перерисовку графика, так как без этого можно обойтись.

5. Подтверждение того, что мои утверждения обоснованы - мое слово, что я не использую ChartRedrow() и видео, в котором виден результат обхождения без этой функции.

6. И Вам спасибо.