プロの声:MQLでマウスのスクロール値を取得する方法とは? [第5回フォーラムからの再掲載】。] - ページ 7

 
Artyom Trishkin:

何が彼の助けになるのか?あなたの弔辞は?解決策を示していない。自分をアピールしたというのは、とてもとても予想外です。

少し考えれば、誰でも解決できるはずです。どこにあるのか、ヒントを出しました。どの方向から探せばいいのか何でもかんでも銀の皿に載せてもらってもおもしろくない。))必要であれば、その人を助け、解決に導くことができる。でも、あなたはただ反論したいだけのようですね(笑)。
 
Vitaly Muzichenko:

そういうことなのでしょうか。

傾向が違うんですね。あなたはまず私に対していろいろなことを叫び(「あなたのコードはクソだ」「ネクロポスター」など)、それから問題の解決策を尋ね、議論します。だから、自分の頭で考えてください。

あるいは、それに値する人たちを助けるために、私が待つ。

 
Artyom Trishkin:

何が彼の助けになるのか?あなたの弔辞は?解決策を示していない。自分をアピールしたというのは、とてもとても予想外です。

あなたは驚くほど不注意です。

ほら、私が返信した投稿の一番下に、その人は「指南」を求めているんですよ。解決策を求めているわけではないのです。そこで、私は彼を追い込もうとした。さて、あなたの妨害がいかに不適切でばかげたものか、お分かりいただけたでしょうか?それは無駄なゴミでしかない。メリットでコミュニケーションした方がいいんじゃない?そうすれば、自分にも他人にももっといいことがあるはずです。

 
Реter Konow:

傾向が違うんですね。あなたはまず私に対していろいろなことを叫び(「あなたのコードはクソだ」「ネクロポスター」など)、それから問題の解決策を尋ね、議論します。だから、自分の頭で考えてください。

あるいは、それに値する人たちを助けるために、私が待つ。

質問ではなく、事実を述べたまでです。

 
Vitaly Muzichenko:

質問ではなく、事実を述べたまでです。

どんな事実?
 

ここで、多くの人はフォームの背後にあるコンテンツを見ていない。アイデアとそれを実現する力がなければ、形にこだわっても良質なコンテンツは生まれないということがわからないのだ。

本質には様々な具現化の形があり、それを表現言語で判断できるのは無能な人間だけである。

 
Vitaly Muzichenko:

質問ではなく、事実を述べたまでです。

私も、事実を述べます。

あなたの "製品 "は、才能のない、ばかげた努力の結晶です。

こんなゴミは久しぶりだ!


真実の批判を真に受けてはいけない。:)

 
Реter Konow:
少し考えれば、誰もが解決策を見出すことができるのに、なぜ?どこにあるのか、ヒントをあげました。どのような方向で調査するか。何でもかんでも銀の皿に載せてもらってもおもしろくない。))必要であれば、その人を助け、解決に導くことができる。しかし、あなたは私と議論したいだけのようですね)。

ピーターさん、こんにちは。
MQLでマウスホイールをスクロールさせる方法など、実用的な解決策があるとか言わないんですか?しかも、キーボードの矢印やマウスのボタンではなく、そんなに難しいことではないのです。もちろん、イベント CHARTEVENT_CHART_CHANGE を使って、キーを押していないときにチャートがホイールでスクロールしているかどうかを判断することもできますが、このイベントは新しいバーが 来たときや価格が急激に変化して垂直スケールが変化 したときに発生するので、確率的には可能性があります。また、この方法では、例えばチャートが極端な左や右の位置に達したときに、常にホイールのスクロールイベントを取得することは不可能であり、チャートをスクロールさせずにこれを実現する方法はありません。もしかしたら、ChartNavigate関数を使ってチャートを戻すということかもしれませんが、それは非常に曲がった実装で、マウスホイールのスクロール以外のチャートの変化の理由を正しくフィルタリングすることはできないでしょう。 私の考えでは、それはMTをハックするか、文書化されていないコマンドやイベントを知ることによってしかできません。 とにかく、あなたがそうした実装例を持っているとは思えません。

そして、不思議なヒントがあるんですね。"マウスホイールでスクロールイベントを取得するには?"という質問に対して、"スクロールイベントとグラフを動かす関数を使う " という答えがほとんどですね。

もしかしたら、私が間違っていて、実際に例があるのかもしれません。じゃあ、あなたはカッコいい人だ!))まあ、せめてコードじゃなくてex4(ex5)ファイルを落としてくれ。

 
Nikolai Semko:

ピーターさん、こんにちは。
MQLでマウスホイールでスクロールする方法について、実用的な解決策があると言いたくはないですか?しかも、キーボードの矢印やマウスのボタンではなく、そんなに難しいことではないのです。もちろん、イベント CHARTEVENT_CHART_CHANGE を使って、キーを押していないときにチャートがホイールでスクロールしているかどうかを判断することもできますが、このイベントは新しいバーが 来たときや価格が急激に変化して垂直スケールが変化 したときに発生するので、確率的には可能性があります。また、この方法では、例えばチャートが左右の極端な位置に達したときなど、常にホイールのスクロール・イベントを取得することはできず、チャートをスクロールさせずにこれを実現する方法はありません。もしかしたら、ChartNavigate関数を使ってチャートを戻すということかもしれませんが、それは非常に曲がった実装で、マウスホイールのスクロール以外のチャート変更の理由を正しくフィルタリングすることはできないでしょう。 私の考えでは、MTをハックするか、文書化されていないコマンドやイベントを知っていなければできないことです。 とにかく、あなたがそうした実装例を知っているとは思えません。

そして、不思議なヒントがあるんですね。"マウスホイールでスクロールイベントを取得するには?"という質問に対して、"スクロールイベントとグラフを動かす関数を使う " という答えがほとんどですね。

もしかしたら、私が間違っていて、実際に例があるのかもしれません。じゃあ、あなたはカッコいい人だ!」。))じゃあ、せめてコードじゃなくてex4(ex5)ファイルを落としてくれ。

ニコライさん、こんにちは。

信じられないかもしれませんが、解決策はとてもシンプルです。15〜20行のコードで済みます。しかし、1つだけ微妙な点があります。それは、スクロールの仕組みの実装の具体的な内容です。私の実装は、標準的なものと少し異なります。オブジェクトではなく、キャンバスをスクロールさせます。Anatolyのライブラリにも同様の実装があります。

私はスクロールホイールでスクロールするのですが、チャートの動きに「しがみつく」ことで、エネルギーを得ることができるのです。もちろん、チャートはピクピク動くが、必ず最初の位置に戻ってくる。そのためのチャートシフト機能です。チャートシフト方向もmql-functionから取得する。したがって、私は何もハックする必要はありません)。MQは、ほとんどすべてのタスクを実現するために、可能な限り幅広い機能を提供するよう努めました。これには驚きさえ覚えます。もしかしたら、彼ら自身も、開発者向けに公開している機能をすべて把握していなかったのかもしれません)。

 
Nikolai Semko:

とにかく、そのような実装例があるとは思えません。

そして、不思議なヒントがあるんですね。という 質問に対して、「スクロールイベントとグラフを動かす関数を 使う」と回答しています。

もしかしたら、私が間違っていて、実際に例があるのかもしれません。じゃあ、あなたはカッコいい人だ!))まあ、せめてコードじゃなくてex4(ex5)ファイルを落としてくれ。

こんな状況です。その方からは、ホイールによるスクロール機構をどのように実装したらよいか、アイデアを求められた。ヒントを与えた。すると、すぐに地元の悪者たちが沸き上がってきて、自慢話だ何だと騒ぎ出す。

彼らからすれば、解答を出せば商品の宣伝か、ただの自慢になるし、そうでなければズルをして何も持っていないことになる。

コードをお渡しすることはできますが、第一に、スクロール機構の実装から切り離されてしまうこと、第二に、ロシア語になってしまうことです。でも、もしかしたら、あなたのスクロールの仕組みに合わせることができるかもしれません。eh4を置くことができないのは、ひとつのメカニズムを、それが動作するグラフィック環境から「引き裂く」ことができないからです。

一番良いのは、一般論として解決策を提示することですが、何かを証明することが目的ではなく、友情の上に成り立っていることです。

といった具合に。

CHARTEVENT_CHART_CHANGE イベントは、カーソルがグラフ上にある場合、マウスホイールの移動イベントなどで生成されます。チャートオフセットオプションを有効にする必要があります。このように、チャートオフセットから、ホイールを回すタイミングを正確に知ることができるのです。カスタムイベントを生成することができます。例えば、"SCROLLER_EVENT "のように。

次に、オフセットの方向を決定する作業である。ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR) を使用します。各 "SCROLLER_EVENT" イベントで最初の可視バーの番号を取得し、記録した前のバーの番号より大きいか小さいかを判断します。多ければ一方向に動き、少なければ逆方向に動く。同時に、私たちのチャートもスクロールし、最後の最後まで到達することができます。これを防ぐために、ChartNavigate関数でその位置を修正し、チャートを初期位置に設定します。この呼び出しは、CHARTEVENT_CHART_CHANGE イベントも生成し、スクロールを無効化します。そのため、チャート位置修正時には、CHARTEVENT_CHART_CHANGEイベントをスキップし、反応しないようにしなければなりません。そのためには、フラグシステムを使用する必要があります。

私のコードはこのような感じです。

//=====================================================================================================================================    
 if(id == CHARTEVENT_CHART_CHANGE && !n)
   {
    if(СОБЫТИЕ_ИНТЕРФЕЙСА != _SCROLLER_EVENT)
      {
       СОБЫТИЕ_ИНТЕРФЕЙСА = _SCROLLER_EVENT; 
      } 
    //------------------------------------  
    if(!Номер_первого_бара){ChartNavigate(0,CHART_END,-100); Номер_первого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);}
    //------------------------------------    
    Номер_этого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    //------------------------------------
    int Основание_выпадающего_списка = КАНВАС - 1;
    int Ползунок_                    = КАНВАС + 4;
    int Вертикальная_полоса          = КАНВАС + 2;
    //------------------------------------
    if(Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1;
       Прокрутка_вверх = 0;
       Сдвиг = 25;
       n = 1;
      }
    if(Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0;
       Прокрутка_вверх = 1;
       Сдвиг = -25;
       n = 1;
      }//Alert(__FUNCTION__," Номер_первого_бара   ",Номер_первого_бара,"  Номер_этого_бара  ",Номер_этого_бара);  
    //------------------------------------
    if(КАТЕГОРИЯ_КАНВАСА_ОБЪЕКТА == _SCROLL_BAR_CANVAS && !G_CORE[ОКНО][Вертикальная_полоса][_OBJECT_HIDE])
      {
       int Поле_обзора = G_CORE[ОКНО][КАНВАС][_VIEW_SQUARE];
       //Элемент которому принадлежит сам канвас.
       int Элемент_прокручиваемого_канваса =  G_CORE[ОКНО][КАНВАС][_MAIN_ELEMENT];
       //Канвас элемента, которому принадлежит прокручиваемый канвас.
       int Канвас_того_элемента = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_DROWING_CANVAS];
       int Группа_элемента_прокручиваемого_канваса = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_OBJECT_GROUP];

       //------------------------------------
       G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
       //------------------------------------
       if(G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] > G_CORE[ОКНО][Поле_обзора][_Y])
        {          
         G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = G_CORE[ОКНО][Поле_обзора][_Y];
        } 
       if((G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] + G_CORE[ОКНО][КАНВАС][_Y_SIZE]) < (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]))
         {
          G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]) - G_CORE[ОКНО][КАНВАС][_Y_SIZE];
         }
       //------------------------------------  
       G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[ОКНО][Поле_обзора][_Y] - G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y];  
       //------------------------------------
       ObjectSetInteger(0,G_CORE[ОКНО][КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
       //------------------------------------ 
       G_CORE[ОКНО][Ползунок_][_Y] = G_CORE[ОКНО][Вертикальная_полоса][_Y] + ((double)G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] / ((double)G_CORE[ОКНО][Ползунок_][_V_SCROLL_BAR_HANDLE_STEP] / 10000));
       //------------------------------------ 
       if(Группа_элемента_прокручиваемого_канваса == VIEW_BOX)
         {
          Нарисовать_элемент(ОКНО,Канвас_того_элемента,Элемент_прокручиваемого_канваса);
         } 
       //------------------------------------
       if(Группа_элемента_прокручиваемого_канваса == DROP_LIST)
         {
          Нарисовать_элемент(ОКНО,Поле_обзора,Элемент_прокручиваемого_канваса);
         } 
      }    
  }
//------------------------------------------------------
if(qw){n = 0; qw = 0;} 
if(n == 1){ChartNavigate(0,CHART_END,-100);  qw = 1;} 
//------------------------------------------------------
//Alert(__FUNCTION__,"  Прокрутка_вниз  ",Прокрутка_вниз,"  Прокрутка_вверх  ",Прокрутка_вверх);
//=====================================================================================================================================   



追加されました。

その他のチャートシフトの原因については、もちろん、システムに誤差を生じさせることもあります。しかし、これらの誤差は非常に些細なものであり、あまり気にする必要はないでしょう。つまり、新しいバーがキャンバスを数ピクセル動かすと...大したことではありません。そしてそれは、その時にカーソルがスクロールバーの上にある場合に限ります。

もちろん、実装は絶望的な状況から脱出するための試みである。スクロールホイールが一切ないため、最もシンプルで「ネイティブ」なソリューションです。本格的な解決策としては、すでにサービスデスクに 問い合わせをしています。そうであるかどうかは、開発者次第です。