Teste CGraphic - perguntas e sugestões - página 4

 
Roman Konopelko:

Mesmo se você os tornar virtuais , não poderá fazer uma sobrecarga normal sem acesso total aos membros da classe CGraphics, portanto, todos eles (a maioria) devem ser declarados como protegidos.

e estas funções ***Plot são apenas protegidas


 
o_O:

e estas funções ***Plot são igualmente protegidas

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;
Eu estava falando dos membros da classe CGraphic, agora eles são todos privados, e sem acesso a m_canvas, m_dx, m_dy e outros membros na descendência, a sobrecarga não vai funcionar.
 
Roman Konopelko:
Eu estava falando dos membros da classe CGraphic, agora eles são todos privados, e sem acesso a m_canvas, m_dx, m_dy e outros membros na descendência, a sobrecarga não vai funcionar.

OK, então tudo está em suas mãos) Vou esperar.

Até agora, eu o mudei temporariamente localmente

 

Em algumas funções (não em todos os lugares), se houver uma divisão, ela é sem um cheque 0.

por exemplo

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;

aqui zero_devide ocorrerá se x.Max() == Min()

também em Axis::CalcStepSize / CalcBoundedStepSize / SelectAxisScale etc.

 
o_O:

Em algumas funções (não em todos os lugares), se houver uma divisão, ela é sem um cheque 0.

por exemplo

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

também em Axis::CalcStepSize / CalcBoundedStepSize / SelectAxisScale etc.

Obrigado, vou corrigi-lo.

Para não sobrecarregar a biblioteca com numerosas verificações, tentei levar em conta todos os casos do Eixo::SelectAxisScal método.

Arquivos anexados:
Axis.mqh  11 kb
 

1. este parece ser o arquivo sem as edições desta manhã no enum ENUM_AXIS_TYPE

---

2. ENUM_AXIS_TYPE testado da página anterior

já que você está fazendo ValuesFunctionFormat em estilo de função de retorno, você tem que retornar algum parâmetro vazio* na função.

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

em CAxis para acrescentar

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


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


----

Este parâmetro de retorno é necessário para passar um ponteiro para um objeto que sabe onde está a matriz arrX.

Como a função é essencialmente estática, é impossível saber o que exatamente a chamou.


ZS.

E aqui está o resultado das séries cronológicas já exibidas (vou perguntar mais sobre linhas com leituras mais tarde, há um inconveniente de se conseguir coordenadas lá :)

 
o_O:

E é isto que o resultado das séries cronológicas já se parece em princípio (vou perguntar mais sobre as linhas com leituras mais tarde, há o embaraço de conseguir coordenadas lá :)

Por favor, faça um vídeo ou uma animação mais longa a partir do momento em que o gráfico estiver vazio. Do GIF eu não entendo o que é.
 
fxsaber:
Por favor, faça um vídeo ou uma animação mais longa a partir do momento do gráfico vazio. Não recebo isso do GIF.

isso é melhor?

este especialista trabalha na tela de roman + CGraphic

Neste caso, estou construindo um P/L a partir de várias ferramentas
 
o_O:

este especialista trabalha em Roman's Canvas + CGraphic

Neste caso, eu construo P/L a partir de vários instrumentos

Mais claro agora. A cristais (e possivelmente outra interatividade) é uma funcionalidade embutida (necessária) da biblioteca de Roman, ou você a herdou?

Quero ver elementos de interatividade nos gráficos SB - mira, zoom (em ambas as direções) e destaque dos valores do cursor.

Isto é, eu faço GraphPlot via EA/indicador, e obtenho tal funcionalidade de uma só vez.

 
fxsaber:

Agora para ser mais claro. A crista (e possivelmente outra interatividade) é uma funcionalidade embutida (necessária) da bíblia de Roman, ou você a herdou?

Sim, eu a herdei.

Quero ver alguns elementos de interatividade nos gráficos SB - retículo, zoom (ambos os lados) e destaque dos valores do cursor.

Vamos ter uma conversa com o principal. Eu também preciso de algo.

- A retroiluminação (se não for necessária, pelo menos a função GetNearY/X) é necessária. É melhor implementar o destaque por herança de qualquer maneira. É diferente em cada uma de nossas representações )

- ainda não precisam da mira em si, porque é o resultado de eventos de gráficos que ainda não têm nada a ver com a biblioteca.

- A obtenção de valores de escala - que são determinados por coordenadas de pixel - é uma obrigação.

- Com o zoomo, é complicado. Como não há barras de rolagem. E para ser honesto, eu não gostaria que eles fossem implementados nesta classe. Neste momento ele só usa CCanvas e não pede por nenhum outro objeto. E isto é muito bom.
Pretendo implementar o zoom independentemente por herança, colocar barras de rolagem e rescalque conforme necessário.

Razão: