Diskussion zum Artikel "Grafische Interfaces X: Das Standard Chart-Steuerelement (Build 4)" - Seite 4

 
Реter Konow:

Sehr, sehr seltsam. In meiner Implementierung der Schnittstelle habe ich keinen einzigen Aufruf der Funktion ChartRedraw().

Bis jetzt wusste ich nicht wirklich, warum sie gebraucht wird.... Ich arbeite mit Canvas (Bitmap-Objekten) ohne sie.

Im Zweifelsfall kann man diese oder jene Notwendigkeit anhand der Entwicklungen der Standardbibliothek nachvollziehen. Zum Beispiel, die CCanvas-Klasse.

//+------------------------------------------------------------------+
//| Objekt auf dem Bildschirm aktualisieren (neu zeichnen)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- prüfen
   if(m_rcname==NULL)
      return;
//--- Ressource aktualisieren und neu zeichnen
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

Wenn Sie ohne sie arbeiten, werden Sie irgendwann feststellen, dass etwas im unpassendsten Moment nicht angezeigt wird.

Konow-Tag:

Angenommen, die Funktion ChartRedraw() ist notwendig, - dann erfordert jede Änderung eines jeden Objekts ein komplettes Neuzeichnen aller Objekte?

Das weiß ich nicht. Das Terminalsystem macht das. Sie können versuchen, die MQ-Entwickler zu fragen. )

 
Anatoli Kazharski:

Im Zweifelsfall können Sie diese oder jene Notwendigkeit durch die Entwicklungen der Standardbibliothek nachvollziehen. Zum Beispiel die CCanvas-Klasse.

//+------------------------------------------------------------------+
//| Objekt auf dem Bildschirm aktualisieren (neu zeichnen)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- prüfen
   if(m_rcname==NULL)
      return;
//--- Ressource aktualisieren und neu zeichnen
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

Wenn Sie ohne sie arbeiten, werden Sie irgendwann mit der Tatsache konfrontiert, dass etwas im unpassendsten Moment nicht angezeigt wird.

Das ist kein Problem. Das wird vom Terminalsystem gehandhabt. Sie können versuchen, die Entwickler zu fragen. )

In meiner Technologie gibt es keine Last, die mit solchen Dingen verbunden ist. Änderungen an Objekten werden Punkt für Punkt vorgenommen. ChartRedraw() wird nirgends aufgerufen und es besteht auch keine Notwendigkeit dafür. Daher sollte diese Frage eher an Ihre Entwickler gestellt werden.)

Ich denke, dass die weitere Optimierung Ihrer Bibliothek davon abhängt, dass das Problem des Neuzeichnens des Diagramms bei jeder Änderung der einzelnen Objekte gelöst wird, was den Prozessor nur belasten kann.

Mein Rat an Sie lautet jedoch: Seien Sie nicht zu versessen darauf, den Code der Bibliothek zu optimieren. Dies könnte dazu führen, dass Sie das gesamte Konzept Ihrer Technologie überdenken müssen. )

 
Реter Konow:

In meiner Technologie gibt es keine Last, die mit solchen Dingen verbunden ist. Änderungen an Objekten werden Punkt für Punkt durchgeführt. ChartRedraw() wird nirgendwo aufgerufen und es besteht auch keine Notwendigkeit dafür. Daher sollte diese Frage eher an Ihre Entwickler gestellt werden.)

Ich denke, dass die weitere Optimierung Ihrer Bibliothek davon abhängt, dass das Problem des Neuzeichnens des Diagramms bei jeder Änderung der einzelnen Objekte gelöst wird, was den Prozessor nur belasten kann.

Nun, niemand außer Ihnen weiß, in welcher Umgebung Sie testen. Wenn Sie keine Probleme im Zusammenhang mit dem Neuzeichnen hatten, haben Sie alles im Griff. Da bin ich mir sicher, denn ich habe das alles schon vor langer Zeit durchgemacht. Natürlich werden Sie darüber schweigen, denn Sie werden Ihren Code niemandem zeigen.

Mein Rat an Sie lautet jedoch: Optimieren Sie den Bibliothekscode nicht zu gern. Das könnte dazu führen, dass Sie das gesamte Konzept Ihrer Technologie überdenken. )

Sorgen Sie dafür, dass Sie das Konzept Ihrer Technologie nicht selbst überdenken müssen. )

 
Anatoli Kazharski:

Nun, niemand außer Ihnen weiß, in welcher Umgebung Sie Ihre Tests durchführen. Wenn Sie keine Probleme mit dem Neuzeichnen haben, dann haben Sie alles im Griff. Dessen bin ich mir sicher, denn ich habe das alles schon lange hinter mir. Natürlich werden Sie darüber schweigen, denn Sie werden Ihren Code niemandem zeigen.

Sorgen Sie nur dafür, dass Sie das Konzept Ihrer Technologie nicht selbst überarbeiten müssen. )

Ich verstehe wirklich nicht, wovon Sie sprechen. Sie haben meine Arbeiten gesehen. In ihrer Implementierung gibt es keine Probleme mit dem Neuzeichnen, obwohl es an keiner Stelle des Programms einen ChartRedrow()-Aufruf gibt.

Ich weiß nicht, welchen Code ich Ihnen zeigen soll, um Sie zu überzeugen. Sagen Sie mir, was ich Ihnen zeigen soll, ich werde es Ihnen zeigen.

 

Hier ist ein Beispiel für die Funktion "Lokalisierer", die ich implementiert habe. (Um zu beweisen, dass ich mir nicht nur Dinge ausdenke).


void Имя_объекта_под_курсором()
{
static int Номер_окна,
            Номер_последнего_объекта_в_окне,
            Прежний_объект,
            Прежнее_окно;
//-------------------
   //////Alert(" Alle_geöffneten_Fenster ",Alle_geöffneten_Fenster);
//Wenn mindestens ein Fenster geöffnet ist, suchen Sie in der Schleife nach dem Fenster, in dem sich der Cursor befindet.
//Wenn keine solchen Fenster gefunden werden und der Zähler der Schleifeninteraktionen die Gesamtzahl der Fenster erreicht hat, wird -1 zurückgegeben,
//was bedeutet, dass sich der Cursor auf der freien Fläche des Diagramms befindet.
//Anmerkung: Das Array "Fensternummer in der Warteschlange" wird von Null an indiziert, und der "Zähler aller offenen Fenster" zählt von Eins an.
//so ist die Array-Zellnummer, die die Fensternummer gemäß dem Zähler enthält, immer um eins kleiner als der Zählerwert.
if(Всех_открытых_окон > 0)  
   {
    for(int b = 0; b <= Всех_открытых_окон; b++)
      {//////Alert("Object_name_under_cursor() number of window search interactions b = ",b);
       //Wenn die Anzahl der Interaktionen den Wert des Fensterzählers erreicht, bedeutet dies, dass wir das Array, in dem die Nummern dieser Fenster gespeichert sind, überschritten haben,
       //und fand daher keine Fenster unter dem Cursor.
       if(b == Всех_открытых_окон)
         {
          Номер_окна = -1;
          //Es gab einen schwerwiegenden Fehler, da diese Variablen beim Verlassen der Fensterzone nicht auf Null gesetzt wurden. ---
          //------------------------------
          ОКНО                    =   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);
         }/**/
       //------------
       //Prüfen, ob sich das Fenster unter dem Cursor befindet.
       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("Fenster_Nummer != WINDOW");
    for(int d = 1; d < 500; d++)
       {
        if(G_CORE[ОКНО][d][_NAME] == 0)
          {
           Номер_последнего_объекта_в_окне = d - 1;
           break;
          }
        }
   // ////Alert("Anzahl_letztes_Objekt_im_Fenster ",Anzahl_letztes_Objekt_im_Fenster);// Vorheriges_Fenster = Window;
     }
//--------------------------------------------------------------------------------------
//Starten Sie den Zyklus der Suche nach dem Objekt unter dem Cursor ab dem letzten Objekt des Fensters.
//Wählen Sie das erste übereinstimmende Objekt unter dem Cursor aus und prüfen Sie, ob der Zeitpunkt seiner Erstellung
// aktueller als der letzte aufgezeichnete Erstellungszeitpunkt eines anderen Objekts, das sich ebenfalls dort befindet
//unter dem Cursor und zuvor überprüft, ist es seine Nummer, die die globale Variable OBJECT akzeptiert.
//Am Ende der Schleife verbleibt das letzte und neueste Objekt unter dem Cursor in der Variablen OBJECT.
//Dieser Ansatz ist notwendig, um nicht nur das erste Objekt zu bestimmen, das unter dem Cursor gefunden wird, sondern dieses Objekt
//was das erste gefundene Objekt verdecken kann, da es bei einem Handle- oder Scroll-Ereignis neu gezeichnet wurde,
//aber seine Nummer im Fenster liegt vor der Nummer des Objekts unter dem Cursor, wenn wir also die Schleife abbrechen,
//dann kommen wir einfach nicht dazu.
//---------------------------------------------------------------------------------------
    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 //Ersetzen Sie diesen Eintrag durch die Eigenschaft des Objekts, die für die Koordinierungsfunktion unsichtbar sein soll.
          && 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;
          //---------------------------------------------------------------
          //Setzen des Fokus von Elementen, Objekten, Eigenschaften und Parametern.
          //---------------------------------------------------------------
          ЭЛЕМЕНТ                 =   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("_Objekt_Name_unter_Cursor ",_Objekt_Name_unter_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;
   }
//-----------------------------
}  
  
//Fix _OBJECT_DISAPPOINTED und _OBJECT_POINTED Ereignisse, und wenn das Objekt ein Skript für diese Ereignisse hat,
//Aufruf des Objektverhaltensblocks, um ihn zu implementieren.
//-----------------------------------------------------
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];
    //---------------------------------------------------------
      
      
//-------------------------------------------------------------------------------------------------------------
//Umgestaltung des Verhaltens von Hauptmenüfenstern, wenn das Flag "Open_window_menu" gesetzt ist ---------------------------
//Wenn das neue Objekt unter dem Cursor ein Hauptmenüreiter ist, schließen Sie die Menüfenster des vorherigen Reiters und öffnen Sie das Menü dieses Reiters.
//Der Block implementiert das sequenzielle Öffnen und Schließen von Menüfenstern, wenn der Cursor durch die Registerkarten des Hauptmenüs bewegt wird.
//-------------------------------------------------------------------------------------------------------------
if(Открыто_окно_меню)
   {//////Alert(OBJECT);
   //---------------
   if(
          Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]
       && Категория_вызываемого_окна_прежнего_объекта == _CONTEXT_MENU
       && ОКНО != Номер_вызываемого_окна_прежнего_объекта
     )
     {
      Явление_окон(_CONTEXT_MENU_WINDOWS_TOTAL_CLOSE,_CONTEXT_MENU);
     }
   //---------------
    //////Alert("Aufgerufene_Fensternummer ",Aufgerufene_Fensternummer, " Aufgerufene_Fensterkategorie ",Aufgerufene_Fensterkategorie);
    //----------------------------------------------------------------------------------------------------------
    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:

Ich weiß wirklich nicht, wovon Sie sprechen. Sie haben meine Arbeit gesehen. In ihrer Implementierung gibt es keine Probleme mit dem Neuzeichnen, obwohl es an keiner Stelle des Programms einen Aufruf von ChartRedrow() gibt.

Was ich in Ihrer Arbeit gesehen habe, passt überhaupt nicht in irgendwelche Gates. Außerdem können wir aus dem, was Sie gezeigt haben, eindeutig schließen, dass Sie nur in MetaTrader 4 testen.

Retag Konow:

Ich weiß nicht, welchen Code ich Ihnen zeigen soll, um Sie zu überzeugen. Sagen Sie mir, was ich Ihnen zeigen soll, ich werde es Ihnen zeigen.

Sie sollten ihn nicht mir zeigen, sondern denen, denen Sie ihn verkaufen wollen. Ich möchte nicht etwas testen, das ich in meiner eigenen Entwicklung nicht verwenden würde. Bringen Sie zunächst alles auf ein akzeptables Niveau und geben Sie eine detaillierte Beschreibung der Fähigkeiten Ihrer Entwicklungen, zumindest so, wie es in meinem Fall gemacht wird. Danach können wir Schlussfolgerungen darüber ziehen, was Sie tun.

 
Реter Konow:

Hier ist ein Beispiel für die Funktion "Lokalisierer", die ich implementiert habe. (Um zu beweisen, dass ich mir nicht nur etwas ausdenke).

Leider sagt mir das nichts. Alles lernt man durch Testen und Vergleichen verschiedener Methoden. Ich werde sehen, wann Sie die erste Version Ihrer Bibliothek im Demomodus präsentieren. Natürlich werde ich nichts kaufen. )
 
Anatoli Kazharski:
Leider sagt mir das nichts. Alles lernt man durch Testen und Vergleichen verschiedener Methoden. Ich werde sehen, wann Sie die erste Version Ihrer Bibliothek im Demomodus präsentieren. Natürlich werde ich nichts kaufen. )

Sie schweifen vom Thema ab. Sie können meine Arbeit kritisieren, aber Sie können nicht sagen, dass sie sich verlangsamt. (Seltsame Kritik: "auf keinen Fall").

Ich werde Ihnen persönlich nichts verkaufen, aber Ihnen einen Versuch geben, es zu benutzen - ja.

Was Sie als meine "Bibliothek" bezeichnen, ist nicht wirklich eine Bibliothek. Es handelt sich um einen geschlossenen und autarken Mechanismus, an den Sie den Code eines anderen nicht anschließen können und den Sie nicht mit Ihrem eigenen Code verbinden können.

Jetzt kritisiere ich konstruktiv Ihre Lösungen, indem ich meine eigenen Lösungen als Beispiel anführe. Wenn Sie es nicht brauchen, ist die Diskussion beendet.

 
Реter Konow:

Sie schweifen vom Thema ab. Sie können meine Arbeiten kritisieren, aber Sie können nicht sagen, dass sie langsam sind. (Seltsame Kritik: "auf keinen Fall").

Dann lenken Sie nicht vom Thema ab. Von meinem Thema, das ich in mehreren Dutzend Artikeln ausführlich beschrieben habe. Was hat das mit Ihren verschlossenen und unzugänglichen Technologien zu tun, die Sie ständig im Voraus anpreisen, bevor Sie sie in den Verkauf bringen?

Ich sage nicht, dass Sie etwas verlangsamt haben. Was ich meine, ist, dass Sie nicht wissen, ob es sich verlangsamt oder nicht. Sie können alles sagen. Wo sind die Dateien für die Tests? Und wo verlangsamt er sich bzw. verlangsamt er sich nicht? In MetaTrader 4/5? Unter Windows 7/8/10? Das ist die Frage. )

Konow Retag:

Es handelt sich um einen geschlossenen und autarken Mechanismus, bei dem man weder den Code eines anderen noch seinen eigenen Code einfügen kann.

Ich bin sicher, dass das sein größter Nachteil ist. Nochmals, autark für wen? Nur für Sie? Es ist zu früh, um solche Aussagen für alle zu treffen. Und für andere wird es erst dann autark sein, wenn diejenigen, die es benutzen werden, Ihnen davon erzählen.

Retag Konow:

Ich kritisiere jetzt konstruktiv Ihre Lösungen, indem ich meine eigenen Lösungen als Beispiel anführe. Wenn Sie das nicht brauchen, dann ist die Diskussion beendet.

Sie ist natürlich sehr interessant und nützlich. Vor allem für Sie und für andere Neueinsteiger. Indem Sie Fragen stellen und Antworten darauf erhalten, helfen Sie auch anderen, neues Wissen zu erwerben.

Aber Ihre Kritik ohne Belege für Ihre Aussagen ist nicht konstruktiv.

Ich danke Ihnen.

 
Anatoli Kazharski:

1. Nun, dann lenken Sie nicht vom Thema ab. Von meinem Thema, das ich in mehreren Dutzend Artikeln ausführlich beschrieben habe. Was hat das mit Ihren verschlossenen und unzugänglichen Technologien zu tun, die Sie ständig im Voraus anpreisen, bevor Sie sie in den Verkauf bringen?

2. Ich behaupte nicht, dass Sie etwas verlangsamt haben. Was ich meine, ist, dass Sie nicht wissen, ob es sich verlangsamt oder nicht. Sie können alles sagen. Wo sind die Testdateien? Und wo wird es langsamer/nicht langsamer? In MetaTrader 4/5? Unter Windows 7/8/10? Das ist die Frage. )

3. Ich bin sicher, dass das sein größter Nachteil ist. Nochmals, autark für wen? Nur für Sie? Es ist zu früh, um solche Aussagen für alle zu treffen. Und für andere wird es erst dann autark sein, wenn diejenigen, die es benutzen werden, es Ihnen sagen.

(4) Es ist sicherlich sehr interessant und nützlich. Vor allem für Sie und für andere Neulinge. Indem Sie Fragen stellen und Antworten darauf erhalten, helfen Sie auch anderen, sich neues Wissen anzueignen.

5. Aber Ihre Kritik ohne Belege für Ihre Behauptungen ist nicht konstruktiv.

6. Vielen Dank.

1. unnötig...

2. die Tatsache, dass meine Implementierung nicht langsamer wird, ist in dem Video zu sehen.

3. überflüssig...

4. Das ist richtig. Das ist der Grund, warum ich mit Ihnen diskutiere. Aus meiner Sicht ist Ihre Lösung, den gesamten Graphen bei jedem Objekt neu zu zeichnen, nicht effizient und belastet den Prozessor zusätzlich. Die Optimierung hängt davon ab, dass dieses Problem korrekt gelöst wird. Ich habe keinen ChartRedrow()-Funktionsaufruf (nehmen Sie mich bitte beim Wort), und die Schnittstelle verlangsamt sich nicht (Sie können es im Video sehen) und alles, was aktualisiert werden muss.

Daher mein Vorschlag: Verzichten Sie auf das ständige Neuzeichnen des Charts, es geht auch ohne.

5. Der Beweis, dass meine Behauptungen gerechtfertigt sind, ist mein Wort, dass ich ChartRedrow() nicht verwende, und das Video, in dem Sie das Ergebnis sehen können, wie man ohne diese Funktion auskommt.

6. Und ich danke Ihnen.