記事"グラフィカルインタフェースX: 標準チャートコントロール(ビルド4)"についてのディスカッション - ページ 4

 
Реter Konow:

とても、とても奇妙だ。私のインターフェースの実装では、ChartRedraw() 関数を一度も呼んでいない。

今まで、なぜこの関数が必要なのかよくわからなかった。私はキャンバス(ビットマップオブジェクト)をこれなしで作業している。

疑問がある場合、標準ライブラリの開発によって、その必要性をたどることができる。例えば、CCanvas クラス。

//+------------------------------------------------------------------+
|画面上のオブジェクトを更新(再描画)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- チェック
   if(m_rcname==NULL)
      return;
//--- リソースを更新し、再描画する
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw();
  }

//---

これを使わずに作業していると、何かの拍子に表示されないことがある。

Konowタグ です:

仮にChartRedraw() 関数が必要だとして、すべてのオブジェクトを変更するたびに、すべてのオブジェクトの完全な再描画が必要になるのか?

わからない。端末システムがそうしている。MQの開発者に聞いてみるといい。)

 
Anatoli Kazharski:

疑問に思うことがあれば、標準ライブラリの開発を通じて、その必要性をたどることができる。例えば、CCanvas クラス。

//+------------------------------------------------------------------+
|画面上のオブジェクトを更新(再描画)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
  {
//--- チェック
   if(m_rcname==NULL)
      return;
//--- リソースを更新し、再描画する
   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(" All_open_windows ",All_open_windows);
//少なくとも1つのウィンドウが開いていれば、カーソルのあるウィンドウを検索するループに入る。
//そのようなウィンドウが見つからず、ループ相互作用カウンタがウィンドウの総数に達した場合、-1を返す、
//これはカーソルがチャートのフリースペースにあることを意味する。
//注:配列 "キュー内のウィンドウ番号 "は0からインデックスされ、"すべての開いているウィンドウのカウンタ "は1からカウントされる。
//したがって、カウンタに従ったウィンドウ番号を含む配列のセル番号は、常にカウンタ値より1小さい。
if(Всех_открытых_окон > 0)  
   {
    for(int b = 0; b <= Всех_открытых_окон; b++)
      {/////Alert("Object_name_under_cursor() window search interactionsの数 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("Window_number != WINDOW");
    for(int d = 1; d < 500; d++)
       {
        if(G_CORE[ОКНО][d][_NAME] == 0)
          {
           Номер_последнего_объекта_в_окне = d - 1;
           break;
          }
        }
   // ////Alert("Number_last_object_in_window ",Number_last_object_in_window);// Previous_window = Window;
     }
//--------------------------------------------------------------------------------------
//カーソル下のオブジェクトをウィンドウの最後のオブジェクトから探すサイクルを開始する。
//カーソルの下にある最初の一致するオブジェクトを選択し、そのオブジェクトが作成された時刻をチェックする。
// 同じ場所にある他のオブジェクトの、最後に記録された作成時刻よりも新しい。
//カーソルの下で、先にチェックした、グローバル変数OBJECTが受け入れるその番号である。
//ループの終わりには、カーソルの下にある最後の、そして最新のオブジェクトがOBJECT変数に残る。
//このアプローチは、カーソルの下に最初に見つかったオブジェクトだけでなく、そのオブジェクトを決定するために必要である。
//ハンドルまたはスクロールイベントで再描画されたため、最初に見つかったオブジェクトが見えなくなる可能性があります、
//しかし、ウィンドウ内の番号はカーソルの下にあるオブジェクトの番号より前なので、ループを中断すると、次のようになる、
//それなら、私たちはそれを手に入れることはできない。
//---------------------------------------------------------------------------------------
    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("_Object_Name_under_Cursor ",_Object_Name_under_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;
   }
//-----------------------------
}  
  
//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];
    //---------------------------------------------------------
      
      
//-------------------------------------------------------------------------------------------------------------
//Open_window_menu "フラグが設定されている場合のメインメニューウインドウの動作を変更。
//カーソル下の新しいオブジェクトがメインメニュータブの場合、前のタブのメニューウィンドウを閉じ、このタブのメニューを開く。
//このブロックは、カーソルがメインメニューのタブを移動するときに、メニューウィンドウを順番に開いたり閉じたりすることを実装している。
//-------------------------------------------------------------------------------------------------------------
if(Открыто_окно_меню)
   {/////Alert(OBJECT);
   //---------------
   if(
          Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]
       && Категория_вызываемого_окна_прежнего_объекта == _CONTEXT_MENU
       && ОКНО != Номер_вызываемого_окна_прежнего_объекта
     )
     {
      Явление_окон(_CONTEXT_MENU_WINDOWS_TOTAL_CLOSE,_CONTEXT_MENU);
     }
   //---------------
    /////Alert("Called_window_number ",Called_window_number, " Called_window_category ",Called_window_category);
    //----------------------------------------------------------------------------------------------------------
    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:

ここに私が実装した "ローカライザー "機能の例がある。(単なる作り話ではないことを証明するために)。

残念ながら、これだけでは何もわかりません。すべては、さまざまな方法をテストし、比較することによって学ぶことができる。あなたのライブラリーの最初のバージョンをデモ・モードで発表してくれたら、私はそれを見ます。もちろん、私は何も買いません。)
 
Anatoli Kazharski:
残念ながら、それでは何もわからない。すべては、さまざまな方法をテストし、比較することによって学ぶことができる。あなたのライブラリーの最初のバージョンをデモ・モードで発表してくれたら、私はそれを見るだろう。もちろん、私は何も買わない。)

話が逸れている。私の仕事を批判するのは構わないが、スピードが落ちるというのはいただけない。(変な批判:「まさか」)。

私はあなたに個人的に何かを売るつもりはないが、使ってみることはできる。

あなたが私の「ライブラリー」と呼ぶものは、実際にはライブラリーではない。他人のコードに接続することも、自分のコードに接続することもできない、閉鎖的で自己完結的なメカニズムなの だ。

今私は、私自身の解決策を例として挙げながら、あなたの解決策を建設的に批判している。あなたがそれを必要としないのであれば、議論は終わりです。

 
Реter Konow:

話が逸れているよ。私の作品を批判するのは構わないが、遅いとは言えない。(変な批判:「まさか」)。

それなら、話題をそらすな。何十本もの記事で詳しく説明した私のテーマから。そのことと、あなたが販売する前に常に事前に宣伝している、閉鎖的でアクセスしにくい技術と何の関係があるのですか?

私は、あなた方が何かを減速させていると言っているのではない。私が言いたいのは、減速しているかどうかわからないということだ。あなたは何でも言うことができる。テスト用のファイルはどこにありますか?また、どこで減速している/していないのですか?MetaTrader 4/5で?Windows 7/8/10では?それが質問です。)

Konow Retag

他人のコードを差し込むことも、自分のコードを差し込むこともできない、閉鎖的で自己充足的な仕組み です。

それが最大の欠点であることは間違いない。繰り返しますが、誰のための自己満足ですか?自分だけのため?誰にとってもそうだと言うのは早計だ。そして、それを使う人たちがあなたにそれを教えてくれるとき、初めて他の人にとっての自給自足となるのです。

リタグ・コナウ

私は今、私自身の解決策を例として挙げることで、あなた方の解決策を建設的に批判している。あなたがそれを必要としないのであれば、議論は終わりです。

もちろん、それはとても興味深く有益なことだ。特にあなたや他の新参者にとってはね。質問をしてそれに対する答えを得ることで、他の人たちも新しい知識を得ることができる。

しかし、あなたの発言を確認する材料を提供することなく批判することは建設的ではありません。

ありがとうございました。

 
Anatoli Kazharski:

1.それなら、話題をそらすな。数十の記事で詳述してきた私のテーマから。そのことと、あなたが販売する前に常に事前に宣伝している、閉鎖的でアクセスしにくい技術と何の関係があるのですか?

2.私は、あなたが何かを減速させているとは主張していない。私が言いたいのは、減速しているかどうかがわからないということだ。 あなたは何でも言うことができる。テストファイルはどこにありますか?また、どこでスローダウンしている/していないのですか?MetaTrader 4/5で?Windows 7/8/10では?それが質問です。)

3.これが最大の欠点でしょう。繰り返しますが、誰のための自給自足ですか?あなたにとってだけ?すべての人にそう言うのは早計だ。使う人がそう言って初めて、他の人にとっての自給自足になるのだから。

4.確かにとても興味深く、役に立つ。特にあなたや他の新参者にとっては。質問をし、それに対する答えを得ることで、他の人も新しい知識を得ることができる。

5.しかし、あなたの主張を裏付ける材料を提供することなく批判することは建設的ではありません。

6.ありがとうございました。

1.必要ない

2.私の実装が減速しないことは、ビデオで見ることができる。

3.冗長

4.その通りだ。だから私はあなたと議論しているのだ。私の見解では、各オブジェクトのイベントでグラフ全体を再描画するというあなたの解決策は効率的ではなく、プロセッサにさらなる負荷をかけることになる。最適化はこの問題を正しく解決することにかかっている。私はChartRedrow()関数呼び出しを持っていませんし(あなたの言葉を信じてください)、インターフェイスが遅くなることもありません(ビデオで見ることができます)。

したがって、私の提案:チャートの 常時再描画は 使わないでください。

5.5.私の主張が正当であることの証明は、ChartRedrow()を使わないという私の言葉と、 この関数なしで回避した結果を見ることができるビデオ です。

6.そしてありがとう。