Erreurs, bugs, questions - page 1063

 
C-4:
Je l'ai essayé. La forme tombe effectivement en arrière, mais de la manière la plus laide qui soit, c'est-à-dire qu'elle tombe même derrière les barreaux. Et la tâche est quelque peu différente, j'ai juste besoin que le texte soit affiché dans le formulaire, le formulaire lui-même étant au-dessus du graphique et des autres formulaires.

Les objets sont affichés dans l'ordre dans lequel ils ont été créés. Si vous souhaitez modifier cet ordre, vous devez sauvegarder les données des objets et les recréer dans l'ordre correct.

Ou est-ce que le bug est même là ?

 
C-4:
Je l'ai essayé. La forme tombe effectivement en arrière, mais de la manière la plus laide qui soit, c'est-à-dire qu'elle tombe même derrière les barreaux. La tâche est quelque peu différente, il suffit d'afficher le texte dans le formulaire, le formulaire lui-même étant placé au-dessus du graphique et des autres formulaires.
Il suffit de tenir compte de l'ordre dans lequel les objets graphiques sont créés. Ceux qui doivent être en dessous doivent être créés en premier.
 
tol64:
Il suffit de tenir compte de l'ordre dans lequel les objets graphiques sont créés. Ceux qui doivent être en dessous doivent être créés en premier.

Oui, c'est la première chose à laquelle j'ai pensé. J'ai changé l'ordre - même résultat. Mais il n'y a pas de miracles. Mais maintenant, j'ai pris un projet fonctionnel et j'ai essayé de placer OBJ_EDIT à cet endroit et cela a bien fonctionné, c'est-à-dire qu'il est visible au-dessus du formulaire. Donc, dans l'ensemble, ça ressemble à l'enfer. J'ai manifestement oublié ou n'ai pas pris en compte quelque chose. Mais je voulais quand même faire le tri pour ne pas faire la même erreur la prochaine fois. Voici le code de OnInit() pour le test :

//+------------------------------------------------------------------+
//| 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:

Oui, c'est la première chose à laquelle j'ai pensé. J'ai changé l'ordre - même résultat. Mais il n'y a pas de miracles. Mais maintenant, j'ai pris un projet fonctionnel et j'ai essayé de placer OBJ_EDIT à cet endroit et cela a bien fonctionné, c'est-à-dire qu'il est visible au-dessus du formulaire. Donc, dans l'ensemble, ça ressemble à l'enfer. J'ai manifestement oublié ou n'ai pas pris en compte quelque chose. Mais j'aimerais quand même faire en sorte de ne pas faire cette erreur la prochaine fois. Voici le code de OnInit() pour le test :

Dans ce cas, nous avons besoin d'un gestionnaire d'objet, de sorte que le compte de ce qui est créé et dans quel ordre a été en un seul endroit, alors il n'y aura pas de chevauchement quand une fonction crée ce deuxième ceci, et le changement d'appel de la fonction va changer l'ordre.

Il est difficile d'attraper ce type de bug et même de le prévoir.

 
Info pour MQ. Dans le manuel pour OnTimer il y a "... pour recevoir par EventSetTimer()...". Vous devriez également ajouter "... ou EventSetMillisecondTimer()...".
Документация по MQL5: Работа с событиями / EventSetTimer
Документация по MQL5: Работа с событиями / EventSetTimer
  • www.mql5.com
Работа с событиями / EventSetTimer - Документация по MQL5
 

Bonjour à tous !

Il y a un paragraphe comme celui-ci dans l'aide :

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

Ainsi, s'il y a un ChartEvent dans la file d'attente des événements, il ne devrait pas être mis en file d'attente une deuxième fois. J'ai eu un problème avec ça :)

J'ai dessiné un conseiller expert pour le vérifier. Il s'avère que, qu'il y ait ou non un événement ChartEvent dans la file d'attente, le gestionnaire ChartEvent est appelé autant de fois que je le génère.

C'est génial, mais à mon avis, il faut corriger l'aide... Ou est-ce que je me trompe ?

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:

Bonjour à tous !

Il y a un paragraphe comme celui-ci dans l'aide :

Ainsi, s'il y a un ChartEvent dans la file d'attente des événements, il ne devrait pas être mis en file d'attente une deuxième fois. J'ai eu un problème avec ça :)

J'ai dessiné un conseiller expert pour le vérifier. Il s'avère que, qu'il y ait ou non un événement ChartEvent dans la file d'attente, le gestionnaire ChartEvent est appelé autant de fois que je le génère.

C'est génial, mais je pense qu'il faut corriger l'aide... Ou est-ce que je me trompe ?

Cela ne s'applique qu'en cas de débordement de la file d'attente. Si la file d'attente est pleine, le type d'événement qui se trouve déjà dans la file d'attente n'est pas placé.

Si la file d'attente n'est pas pleine (et que la longueur de la file est de 1024), tous les événements sont traités.

 
Urain:

Cela ne s'applique que si la file d'attente est pleine. Si la file d'attente est pleine, le type d'événement qui se trouve déjà dans la file d'attente ne sera pas mis en file d'attente.

Mais si la file d'attente ne déborde pas (et la longueur de la file d'attente est de 1024, je crois), alors tous les événements sont traités.

Je l'ai. Merci :)

PS : Le conseiller expert ci-dessus n'a pas réussi à mettre en file d'attente plus de 1000.

 
paladin800:
Info pour MQ. Dans le manuel pour OnTimer il y a "... pour recevoir par EventSetTimer()...". Vous devriez également ajouter "... ou EventSetMillisecondTimer()...".
Ensuite, tout le monde mettra le minuteur à la milliseconde même s'il n'en a pas besoin...
 
MigVRN:

Bonjour à tous !

Il y a un paragraphe comme celui-ci dans l'aide :

Ainsi, s'il y a un ChartEvent dans la file d'attente des événements, il ne devrait pas être mis en file d'attente une deuxième fois. Eh bien, ce n'est pas arrivé :)

Seuls CHARTEVENT_MOUSE_MOVE et CHARTEVENT_CHART_CHANGE ne sont pas mis en file d'attente. C'est-à-dire queseuls ces événements ChartEvent ont une limite de "pas plus d'un dans la file d'attente".