エラー、バグ、質問 - ページ 1063

 
MetaDriver:
ObjSetInteger(id, Name, OBJPROP_BACK, false)を試してみてください。
試してみました。形は確かに後ろに倒れるが、それは最も醜い方法で、つまり鉄格子の後ろにさえ倒れるのである。そして、タスクはやや異なり、フォームの中にテキストが表示されればいいのですが、フォーム自体はグラフィックや他のフォームの上に乗っていました。
 
C-4:
試してみました。形は確かに後ろに倒れるが、それは最も醜い方法で、つまり鉄格子の後ろにさえ倒れるのである。そして、タスクはやや異なり、フォームの中にテキストが表示されればよく、フォーム自体はグラフィックや他のフォームの上にある状態です。

オブジェクトは作成された順番で表示されます。順番を変更したい場合は、オブジェクトデータを保存し、正しい順番で再作成する必要があります。

それとも、この中にもバグがあるのでしょうか?

 
C-4:
試してみました。形は確かに後ろに倒れるが、それは最も醜い方法で、つまり鉄格子の後ろにさえ倒れるのである。また、タスクは多少異なり、グラフィックや他のフォームの上にフォームそのものがあり、フォームにテキストが表示されればよいのです。
グラフィックオブジェクトの作成 順序を考慮すればよいのです。下にあるべきものが先に作られるはずです。
 
tol64:
グラフィカルオブジェクトの作成 順序を考慮すればよいのです。低くあるべきものは、まず作るべきでしょう。

そうですね、真っ先に思いついたのはそれです。順番を変えても、同じ結果でした。しかし、奇跡は起きない。しかし、今、作業中のプロジェクトを取り、そこにOBJ_EDITを 配置しようとしたところ、うまくいきました、つまり、フォームの上に表示されています。だから、全体的に地獄のように見えるんです。明らかに忘れていること、考慮していないことがありました。しかし、それでも、次に同じ間違いをしないように、整理しておきたいと思いました。 以下は、テスト用のOnInit()のコードです。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   ObjectCreate(0, "cell", OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "cell", OBJPROP_XDISTANCE, 15);
   ObjectSetInteger(0, "cell", OBJPROP_YDISTANCE, 60);
   ObjectSetInteger(0, "cell", OBJPROP_BGCOLOR, clrWhite);
   ObjectSetInteger(0, "cell", OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, "cell", OBJPROP_BORDER_COLOR, clrBlack);
   ObjectSetInteger(0, "cell", OBJPROP_BACK, false);
   //ObjectSetInteger(0, "cell", OBJPROP_SELECTED, false);
   
   ObjectCreate(0, "edittext", OBJ_EDIT, 0, 30, 30);
   ObjectSetInteger(0, "edittext", OBJPROP_XDISTANCE, 40);
   ObjectSetInteger(0, "edittext", OBJPROP_YDISTANCE, 50);
   ObjectSetInteger(0, "edittext", OBJPROP_BGCOLOR, clrNONE);
   ObjectSetInteger(0, "edittext", OBJPROP_BORDER_COLOR, clrNONE);
   //ObjectSetInteger(0, "edittext", OBJPROP_WIDTH, 3);
   ObjectSetString(0, "edittext", OBJPROP_TEXT, "edit text");
   ObjectSetInteger(0, "edittext", OBJPROP_BACK, false);
   
   
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - Документация по MQL5
 
C-4:

そうですね、真っ先に思いついたのはそれです。順番を変えても、同じ結果でした。しかし、奇跡は起きない。しかし、今、作業中のプロジェクトを取り、そこにOBJ_EDITを 配置しようとしたところ、うまくいきました、つまり、フォームの上に表示されています。だから、全体的に地獄のように見えるんです。明らかに忘れていること、考慮していないことがありました。しかし、それでも次回はこのようなミスをしないように作りたいと思います。 以下は、テスト用のOnInit()のコードです。

この場合、我々は、オブジェクトハンドラを必要とするように作成され、どのような順序で1つの場所にあったもののアカウントは、1つの関数がこの2番目のこれを作成すると、重複はないでしょう、関数呼び出しの変更は、順序が変更されます。

この手のバグは、なかなか捕まらないし、予知することすら難しい。

 
MQの情報です。OnTimerのハンドブックに「...EventSetTimer()で 受信する...」とあるのですが、これは何ですか?また、「...またはEventSetMillisecondTimer()...」を追加する必要があります。
Документация по MQL5: Работа с событиями / EventSetTimer
Документация по MQL5: Работа с событиями / EventSetTimer
  • www.mql5.com
Работа с событиями / EventSetTimer - Документация по MQL5
 

皆さん、こんにちは。

ヘルプにこのような段落が あります。

Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится. Аналогично, если в очереди mql5-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь

つまり、イベントキューにChartEventがある場合、2回目のキューイングはされないはずです。という悩みを抱えていました :)

Expert Advisorを描いて確認しました。キューに ChartEvent イベントがあるかどうかに関係なく、ChartEvent ハンドラ は私が生成した回数だけ呼ばれることが判明した。

これは素晴らしいことですが、私の意見では、ヘルプを修正する必要があります...それとも私が間違っているのでしょうか?

input int N= 50; //количество событий в очереди

void OnInit()
  {
   EventSetTimer(5);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();    
  }

void OnTimer()
  {
  for (ushort i=0; i<N; i++) EventChartCustom(0,1,i,0,(string)0);
  }


void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if (id>CHARTEVENT_CUSTOM) Print ("Обработано событие номер: ", lparam);
  }
 
MigVRN:

皆さん、こんにちは。

ヘルプにこのような段落が あります。

つまり、イベントキューにChartEventがある場合、2回目のキューイングはされないはずです。という悩みを抱えていました :)

Expert Advisorを描いて確認しました。キューに ChartEvent イベントがあるかどうかに関係なく、ChartEvent ハンドラ は私が生成した回数だけ呼ばれることが判明した。

これは素晴らしいことですが、ヘルプを修正する必要があると思うのですが、私の勘違いでしょうか?

これは、キューがオーバーフローした場合にのみ適用され、キューが満杯の場合は、既にキューにあるイベントタイプは配置されない。

キューが満杯でない場合(キューの長さは推測で1024)、すべてのイベントが処理されます。

 
Urain:

これは、キューが満杯の場合にのみ適用され、キューが満杯の場合は、すでにキューにあるイベントタイプはキューに入れられません。

しかし、キューがオーバーフローしていなければ(キューの長さは1024だと思います)、すべてのイベントが処理されます。

了解です。ありがとうございました :)

追記:上記のExpert Advisorは、1000以上のキューに失敗しました。

 
paladin800:
MQの情報です。OnTimerのハンドブックに「...EventSetTimer()で 受信する...」とあるのですが、これは何ですか?また、「...またはEventSetMillisecondTimer()...」を追加する必要があります。
そうすると、みんな必要ないのにミリ秒タイマーをセットしてしまう...。