MQLで書かれたUIのギャラリー - ページ 15

 
Nikolai Semko #:

ピョートル、私はあなたを理解していません。

プログラマーにとって、作業中にGUIとどのようにインタラクションするかを知ることは重要です。 ここに私のGUIの例を示します。私は明暗テーマのショートカットをクリックし、このイベントはすぐに背景色と線を変更する機能をトリガーしました。このインタラクションはどのように行うのでしょうか?



ユーザーは私のコードと(まったく)インタラクションしない」とはどういう意味 ですか ? プログラマーはコードとインタラクションするのではなく、コードが生成するイベントとインタラクションする必要があります。

いいね。わかりやすくするために、絵だけを使ってみよう。

1.





2.


3.


4.

オプション・シートとウィンドウのチェックボックスとInternal_APIファイル:




5.ユーザーコードでウィンドウとアイテムにアクションを実行する:




6.


インテリセンスがすべてを教えて くれます!


 
わかりました。

Web開発を例にとると、GUIはあなたが作ったマークアップ言語を使って書かれます。
HTMLだけでWebサイトを作った場合、純粋なHTMLでコントロールを作ることができます。




かし、この場合、コントロールが動作しているときに何も起こらないので、サイトは死んでしまいます。 何かを起こすには、JavaScriptとaddEventListener関数を使用して、各イベントにハンドラを置く必要があります。そのようなハンドラの例を以下に示します: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 私の主な質問は、次のように言い換えることができます:ユーザーが動作するときにGUIによって生成されるイベント・ハンドラをプログラマーに どのように実装しますか。
つまり、addEventListenerの 類似品は何ですか? 私が言ったように、GUIがプログラムで生成されるとき、各コントロールは関数へのポインタを 使用して独自のイベント・ハンドラ関数を割り当てられるという事実を通して、私はそれを実装しています。
 
要素から値を取得する図で、その値を書き込む変数を書き忘れていました。すみません、久しぶりのプログラミングで。)
 
Nikolai Semko #:
わかりました。Web開発を例にとると、GUIはあなたが作ったマークアップ言語を使って書かれます。HTMLだけでWebサイトを作った場合、純粋なHTMLでコントロールを作ることができます。しかし、この場合、コントロールが動作しているときに何も起こらないので、サイトは死んでしまいます。 何かを起こすには、JavaScriptとaddEventListener関数を使用して、各イベントにハンドラを置く必要があります。そのようなハンドラの例を以下に







示します: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_addeventlistener4 私の主な質問は、次のように言い換えることができます:ユーザーが動作するときにGUIによって生成されるイベント・ハンドラをプログラマーに どのように実装しますか。つまり、
addEventListenerの アナログは何ですか? 私が言ったように、私はGUIがプログラムで生成されるとき、各コントロールが関数へのポインタを 使用して独自のイベントハンドラ関数を割り当てられているという事実を通してそれを実装しています。

ニコラス、すべてうまくいったよ。後で自分で試してみてください。すべてはあなたが考えているよりずっとシンプルなのだ。私はこの技術を使って多くの動くインターフェースを作ってきた。だから...すぐにわかるだろう。

 
Реter Konow #:

ニコライ、うまくいったよ。後で自分でやってごらん。君が考えているよりずっと簡単だよ。私はこの技術を使って多くの動くインターフェイスを作ってきた。だから...すぐにわかるよ

分かった待ってるよ。
私はあなたの創造を本当に理解したいのですが、例によって理解しやすくするために、単純な空のインジケータ(またはExpert Advisor)を作成してください。 その中で、あなたのGUIが独立したボタンの形で接続され、それを押すとウィンドウの背景色が黒から白、白から黒に変わります。色の変更は、接続されたファイルではなく、インジケーター本体で行われることが望ましいです。
簡単に書くために、ボタンが押されたときにプログラム本体で実行される関数のコードを示します:

void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[2] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}
 
Nikolai Semko #:

わかりました。待ちます。しかし、例によって理解しやすくするために、単純な空のインジケータ(またはExpert Advisor)を作成してください。 その中で、GUIが独立したボタンの形で接続され、それを押すとウィンドウの背景色が黒から白、白から黒に変わります。色の変更は、接続されたファイルではなく、インジケーター本体で行われることが望ましいです。
簡単に書くために、ボタンが押されたときにプログラム本体で実行される関数のコードを示します:

OK。理解しやすいように、できるだけ単純な実装にします。飾り気はありません)。

  • インジケーター
  • インジケーターの中にはユーザー・ウィンドウがあります。
  • ウィンドウにはボタンが1つ
  • ボタンはあなたの関数を呼び出します。
  • すべてのアクションはインジケーターのボディに記述されます。
 
Реter Konow #:

オーケー。理解のために、できるだけシンプルな実装にしよう。飾り気はありません)。

  • インジケーター
  • インジケーターの中にはユーザー・ウィンドウがあります。
  • ウィンドウにはボタンが1つ
  • ボタンはあなたの関数を呼び出します。
  • すべてのアクションはインジケータ本体に記述されます。

すばらしい!ありがとうございました。

 

Nikolayさん、インジケーター本体の中に関数コールを書くことはできません。なぜなら、そのハンドラーはInternal_API.mqhの中にあるからです。

つまり、このファイル内のハンドラーから、ボタンを押したイベントであなたの関数を呼び出すことができます。しかし、例えばインジケーター本体からタイマーのイベントに対してプログラムでボタンの状態を設定することもできます。しかし、その場合はボタンを押す必要はありません。要するに、さまざまな要素がある。インジケーター本体の中で処理できるものもあれば(例えばプログレスバーなど、ほとんどが非インタラクティブ要素)、Internal_API.mqh ファイルにハンドラーを持ち、そこから動作する ものもあります。これらの状態は、EA/インジケーター本体からプログラムで設定することができます。

タスクは完了です。(白い四角 - クリック)


コード

//+------------------------------------------------------------------+
//|                                                 Indicators 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include<GUI_DRIVE_2.mqh>
#include<MyProject_1\CORES.mqh>
#include<MyProject_1\Internal_API.mqh> 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------
   D_OnInit();
   //-------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //ВАШ КОД-----------------
   //УСТАНОВИТЬ ВЫЗОВ В САМОМ НИЗУ, ПОД ПОЛЬЗ.КОДОМ.------------------
   //---------------------------
   RMSG(1);
   //---------------------------
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //УСТАНОВИТЬ ВЫЗОВ НА САМОМ ВЕРХУ, НАД ПОЛЬЗ.КОДОМ.---------------
   //----------------------------------------------------------------
   D_OnChartEvent(id,lparam,dparam,sparam);
   //----------------------------------------------------------------
  }
//+------------------------------------------------------------------+

/*void ChangeColorScheme() {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[13] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   static int clr_scheme = 0;
   if (clr_scheme == 1) clr_scheme = 0;
   else clr_scheme  = 1;

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}*/


void ChangeColorScheme(uint _color)
{
 ChartSetInteger(0,CHART_COLOR_BACKGROUND,_color);
}

コンパイラが悪態をついたので、あなたの関数をコメントアウトした。もっとシンプルにした。


以下はInternal_API.mqhのコードです。



 

ところで、追加しておく必要がある:

Internal_API.mqhファイルはコントロール・ ハンドラーを含み、それらを接続するために特別に設計されている。

このファイルはユーザーのためのもので、エンジンや私の他のコードの一部ではない。

 
Реter Konow コントロールの ハンドラが含まれており、それらを接続するために特別に設計されている。

このファイルはユーザーのためのもので、エンジンや私の他のコードの一部ではない。

ありがとう。
もちろん、開発者にとっては便利ではない。それでも、関数へのポインタを持つバリアントの方がずっといい。