Test CGraphic - domande e suggerimenti - pagina 4

 
Roman Konopelko:

Anche se li rendete virtuali , non sarete in grado di fare il normale sovraccarico senza un accesso completo ai membri della classe CGraphics, quindi dovrebbero essere tutti (la maggior parte) dichiarati come protetti.

e queste funzioni ***Plot sono solo protette


 
o_O:

e queste funzioni ***Plot sono altrettanto protette

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;
Stavo parlando dei membri della classe CGraphic, ora sono tutti privati, e senza accesso a m_canvas, m_dx, m_dy e altri membri nella discendenza, l'overloading non funzionerà.
 
Roman Konopelko:
Stavo parlando dei membri della classe CGraphic, ora sono tutti privati, e senza accesso a m_canvas, m_dx, m_dy e altri membri nella discendenza, l'overloading non funzionerà.

OK, allora tutto è nelle tue mani) Aspetterò.

Finora, l'ho cambiato temporaneamente a livello locale

 

In alcune funzioni (non ovunque) se c'è una divisione, è senza controllo di 0.

ad esempio

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;

qui zero_devide si verifica se x.Max() == Min()

anche in Axis::CalcStepSize / CalcBoundedStepSize / SelectAxisScale ecc.

 
o_O:

In alcune funzioni (non ovunque) se c'è una divisione, è senza controllo di 0.

per esempio

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 si verifica se x.Max() == Min()

anche in Axis::CalcStepSize / CalcBoundedStepSize / SelectAxisScale ecc.

Grazie, lo correggerò.

Per non sovraccaricare la libreria con numerosi controlli, ho cercato di prendere in considerazione tutti i casi nel metodo Axis::SelectAxisScal.

File:
Axis.mqh  11 kb
 

1. questo sembra essere il file senza le modifiche di questa mattina su enum ENUM_AXIS_TYPE

---

2. testato ENUM_AXIS_TYPE dalla pagina precedente

dato che state facendo ValuesFunctionFormat in stile funzione callback, dovete restituire qualche parametro void* nella funzione.

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

in CAxis per aggiungere

   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; }


in 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); // <---


----

Questo parametro di callback è necessario per passare un puntatore a un oggetto che sappia dove si trova l'array arrX.

Poiché la funzione è essenzialmente statica, è impossibile sapere cosa l'ha chiamata esattamente.


ZS.

Ed ecco come appare già il risultato della visualizzazione delle serie temporali (chiederò di più sulle linee con le letture più tardi, c'è un inconveniente di ottenere le coordinate lì :)

 
o_O:

E questo è ciò che il risultato della serie temporale appare già in linea di principio (chiederò di più sulle linee con le letture più tardi, c'è l'imbarazzo di ottenere le coordinate lì :)

Si prega di fare un video o un'animazione più lunga dal momento del grafico vuoto. Dalla GIF non capisco cosa sia.
 
fxsaber:
Si prega di fare un video o un'animazione più lunga dal momento del grafico vuoto. Non lo capisco dalla GIF.

è meglio?

questo esperto lavora su Canvas + CGraphic di Roma

In questo caso sto costruendo un P/L da diversi strumenti su di esso
 
o_O:

questo esperto lavora su Roman's Canvas + CGraphic

In questo caso, costruisco il P/L da diversi strumenti su di esso

Ora è più chiaro. Il crosshair (ed eventualmente altre interattività) è una funzionalità integrata (necessaria) della libreria di Roman, o l'hai ereditata?

Voglio vedere elementi di interattività nella grafica di SB - mirino, zoom (in entrambe le direzioni) ed evidenziazione dei valori del cursore.

Cioè faccio GraphPlot tramite EA/indicator, e ottengo subito tale funzionalità.

 
fxsaber:

Ora per essere più chiari. Il crosshair (e possibilmente altra interattività) è una funzionalità integrata (necessaria) della bibbia di Roman, o l'hai ereditata?

Sì, l'ho ereditato.

Voglio vedere alcuni elementi di interattività nella grafica di SB - mirino, zoom (entrambi i lati) ed evidenziazione dei valori del cursore.

Faremo una chiacchierata con il principale. Anch'io ho bisogno di qualcosa.

- La retroilluminazione (se non è questa, almeno la funzione GetNearY/X) è necessaria. È meglio implementare comunque l'evidenziazione per eredità. È diverso in ognuna delle nostre rappresentazioni)

- non hanno ancora bisogno di crosshair, perché è il risultato di eventi del grafico che non hanno ancora nulla a che fare con la libreria.

- Ottenere i valori di scala - che sono determinati dalla coordinata del pixel - è un must.

- È difficile con Zoomo. Poiché non ci sono barre di scorrimento. E ad essere onesti, non vorrei che fossero implementati in questa classe. Al momento usa solo CCanvas e non chiede nessun altro oggetto. E questo è molto buono.
Ho intenzione di implementare lo zoom in modo indipendente per eredità, mettere le barre di scorrimento e ridimensionare come necessario.