Test de CGraphic - questions et suggestions - page 4

 
Roman Konopelko:

Même si vous les rendez virtuels , vous ne serez pas en mesure d'effectuer une surcharge normale sans un accès complet aux membres de la classe CGraphics, ils doivent donc tous (ou presque) être déclarés comme protégés.

et ces fonctions ***Plot sont juste protégées


 
o_O:

et ces fonctions ***Plot sont tout aussi protégées.

class CGraphic
  {
private:
   CArrayObj         m_arr_curves;
   CCanvas           m_canvas;
   //--- parameters background
   int               m_height;
   int               m_width;
   //--- parameters work space
   int               m_left;
   int               m_right;
   int               m_up;
   int               m_down;
   //--- default parameters work space
   int               m_left0;
   int               m_right0;
   int               m_up0;
   int               m_down0;
   //--- size of dash on the axes
   int               m_mark_size;
   //--- scaling parameters
   double            m_dx;
   double            m_dy;
Je parlais des membres de la classe CGraphic, maintenant ils sont tous privés, et sans accès à m_canvas, m_dx, m_dy et autres membres dans le descendant, la surcharge ne fonctionnera pas.
 
Roman Konopelko:
Je parlais des membres de la classe CGraphic, maintenant ils sont tous privés, et sans accès à m_canvas, m_dx, m_dy et autres membres dans le descendant, la surcharge ne fonctionnera pas.

ok, alors tout est entre vos mains) Je vais attendre.

Jusqu'à présent, je l'ai temporairement modifié localement.

 

Dans certaines fonctions (pas partout), s'il y a une division, c'est sans contrôle du 0.

par exemple

void CGraphic::CalculateXAxis(void)
  {
...
...
   double x_size=(m_x.Max()-m_x.Min());
   double xf_size=xf2-xf1;
//--- keep scaling parameters  
   m_dx=xf_size/x_size;

ici, le dérapage zéro se produira si x.Max() == Min()

également dans Axis::CalcStepSize / CalcBoundedStepSize / SelectAxisScale etc.

 
o_O:

Dans certaines fonctions (pas partout), s'il y a une division, c'est sans contrôle du 0.

par exemple

void CGraphic::CalculateXAxis(void)
  {
...
...
   double x_size=(m_x.Max()-m_x.Min());
   double xf_size=xf2-xf1;
//--- keep scaling parameters  
   m_dx=xf_size/x_size;

zero_devide se produira si x.Max() == Min()

également dans Axis::CalcStepSize / CalcBoundedStepSize / SelectAxisScale etc.

Merci, je vais le corriger.

Afin de ne pas surcharger la bibliothèque avec de nombreuses vérifications, j'ai essayé de prendre en compte tous les cas dans la méthode Axis::SelectAxisScal.

Dossiers :
Axis.mqh  11 kb
 

1. Il semble que ce soit le fichier sans les modifications de ce matin sur l'enum ENUM_AXIS_TYPE.

---

2. testé ENUM_AXIS_TYPE de la page précédente

Puisque vous utilisez le format ValuesFunctionFormat dans le style d'une fonction de rappel, vous devez retourner un paramètre void* dans la fonction.

typedef string(*DoubleToStringFunction)(double, void*);

dans CAxis pour ajouter

   DoubleToStringFunction m_values_func;
   void* m_cbdata; // <---

...

// изменить
   void              ValuesFunctionFormat(DoubleToStringFunction func, void* cbdata) { m_values_func=func; m_cbdata=cbdata; }

// добавить получение этого void*
   void* ValuesFunctionFormatCBData(void)    const { return m_c bdata; }


dans CGraphic::CalculateXAxis

   DoubleToStringFunction xfunc=m_x.ValuesFunctionFormat();
   void* cbdata=m_x.ValuesFunctionFormatCBData(); // <---

...

         case AXIS_TYPE_CUSTOM:
           {
            m_xvalues[i]=(xfunc==NULL) ? NULL : xfunc(x, cbdata); // <---


----

Ce paramètre de rappel est nécessaire pour passer un pointeur à un objet qui sait où se trouve le tableau arrX.

Comme la fonction est essentiellement statique, il est impossible de savoir ce qui l'a appelée exactement.


ZS.

Et voici à quoi ressemble déjà le résultat de l'affichage des séries temporelles (je poserai plus de questions sur les lignes avec les lectures plus tard, il y a un inconvénient à obtenir des coordonnées là :)

 
o_O:

Et voici à quoi ressemble déjà en principe le résultat de la série temporelle (je poserai plus tard des questions sur les lignes avec des lectures, il y a la maladresse d'obtenir des coordonnées là :)

Veuillez réaliser une vidéo ou une animation plus longue à partir du moment où le tableau est vide. D'après le GIF, je ne comprends pas ce que c'est.
 
fxsaber:
Veuillez réaliser une vidéo ou une animation plus longue à partir du moment où le tableau est vide. Je ne le vois pas dans le GIF.

Est-ce que c'est mieux ?

cet expert travaille sur Roman's Canvas + CGraphic

Dans ce cas, je construis un P/L à partir de plusieurs outils.
 
o_O:

cet expert travaille sur Roman's Canvas + CGraphic

Dans ce cas, je construis le P/L à partir de plusieurs instruments sur celui-ci

C'est plus clair maintenant. La croix (et éventuellement d'autres interactivités) est-elle une fonctionnalité intégrée (nécessaire) de la bibliothèque de Roman, ou en avez-vous hérité ?

Je veux voir des éléments d'interactivité dans les graphiques SB - réticule, zoom (dans les deux sens) et mise en évidence des valeurs du curseur.

Par exemple, je fais GraphPlot via EA/indicator, et j'obtiens cette fonctionnalité immédiatement.

 
fxsaber:

Maintenant, pour être plus clair. La croix (et éventuellement d'autres interactivités) est-elle une fonctionnalité intégrée (nécessaire) de la bible de Roman, ou en avez-vous hérité ?

Oui, j'en ai hérité.

Je souhaite voir certains éléments d'interactivité dans les graphiques SB - réticule, zoom (des deux côtés) et mise en évidence des valeurs du curseur.

Nous allons avoir une discussion avec le principal. J'ai aussi besoin de quelque chose.

- Le rétro-éclairage (si ce n'est pas lui, alors au moins la fonction GetNearY/X) est nécessaire. Il est préférable d'implémenter la mise en évidence par héritage de toute façon. C'est différent dans chacune de nos représentations ;)

- Nous n'avons pas encore besoin de la croix elle-même, car elle est le résultat d'événements graphiques qui n'ont encore rien à voir avec la bibliothèque.

- L'obtention des valeurs d'échelle - qui sont déterminées par la coordonnée du pixel - est une nécessité.

- C'est difficile avec le zoomo. Comme il n'y a pas de barres de défilement. Et pour être honnête, je ne voudrais pas qu'ils soient mis en œuvre dans cette classe. Pour l'instant, il n'utilise que CCanvas et ne demande pas d'autres objets. Et c'est très bien.
Je prévois d'implémenter le zoom indépendamment par héritage, de mettre des barres de défilement et de redimensionner selon les besoins.

Raison: