Librerías: EasyAndFastGUI - librería para crear interfaces gráficas - página 8

 

Compilando el ExampleEAF.mq5 hizo el truco.

Yo estaba asumiendo que tenía que compilar una biblioteca cuando quiero crear cosas propias con ella.

De todas formas, ¡muchas gracias!

Ah y me estaba tropezando con esta línea de código en la parte superior de la mayoría de los archivos de la biblioteca:

class CWindow;

¿Es la creación de una "clase falsa" algún truco para evitar una pesadilla #include? ¿Cómo puede el compilador más tarde realmente vincular la clase correcta que realmente se está utilizando?

 

Primero, me gustaría finalizar lo que tenemos... Después de todo, todavía hay muchas deficiencias.

Tengo algunas observaciones sobre la arquitectura. Las propiedades especificadas del objeto y la imagen mostrada viven sus propias vidas, independientemente una de la otra. Y se requiere una llamada obligatoria a Update(), de lo contrario permanecerán en realidades paralelas. Creo que esto es incorrecto, teniendo en cuenta que tenemos un modelo basado en eventos.La actualización manual (redibujar) no debería ser un prerrequisito, sólo permite mostrar los cambios inmediatamente, pero todos los cambios deberían mostrarse de todos modos. Para ello, debería enviarse un mensaje (evento) para redibujar este objeto, que se procesará más tarde.

Es decir, más o menos así

class CSomeControl
{
  int  m_property;
  bool m_changed;
  bool m_event_sent;
 public:
  void Property(int value)  { m_property= value;  m_changed=true;  if (!m_event_sent) m_event_sent= EventChartCustom(m_chart_id, ON_CHANGE, m_id, 0, 0); }  

  void Update()             { /*...Redibujando...*/.  m_changed=false; }

  void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {  
    if (id==CHARTEVENT_CUSTOM+ON_CHANGE) { m_event_sent=false;  if (m_changed) Update(); }
  }                       
};
 

Usando ChangeWindowWidth, cambio el ancho de la ventana para que se salga del gráfico actual. Después de eso, cuando intento mover esta ventana, se pega automáticamente al borde izquierdo del gráfico. ¿Cómo desactivar esto? No puedo encontrar un lugar en el código.

 
Alexey Navoykov:

Usando ChangeWindowWidth, cambio el ancho de la ventana para que se salga del gráfico actual. Después de eso, cuando intento mover esta ventana, se pega automáticamente al borde izquierdo del gráfico. ¿Cómo desactivar esto? No puedo encontrar un lugar en el código.

Necesitas reescribir el método CWindow::UpdateWindowXY(). Actualmente está implementado de tal manera que los bordes de la ventana no pueden salirse del gráfico cuando se mueve la ventana.

 

Por cierto, sobre cambiar el ancho de la ventana

   m_window1.ChangeWindowWidth(NEW_WIDTH);
   m_window1.Update(true);

En MT5 todo está bien, pero en MT4 es así

Después de hacer click en la cabecera, los botones se mueven a su sitio. ¿Me podéis decir por dónde tengo que mirar? ¿Dónde se implementa el movimiento de estos botones?

 
Oleksii Chepurnyi:

Por cierto, acerca de cambiar el ancho de la ventana

En MT5 todo está bien, pero en MT4 es así

Después de hacer click en la cabecera, los botones se mueven a su sitio. ¿Me puedes decir por donde mirar? ¿Dónde se implementa el movimiento de estos botones?

Mira el método Moving().

Intenta acceder a los botones de la ventana mediante punteros y llama a este método.

 
Alexey Navoykov:

Sí, necesita un aumento proporcional de la anchura de todas las columnas o sólo de la última columna. Es preferible esto último.

Pero en la versión actual es problemático implementar esto incluso por ti mismo, porque no he encontrado un método en tu clase para obtener el ancho actual de la columna, y todos los campos son privados. En general, al menos este método debería ser añadido.

Así es como puedes intentar implementar lo que necesitas ahora:

//--- Eventos de cambio de tamaño de la ventana
   if(id==CHARTEVENT_CUSTOM+ON_WINDOW_CHANGE_YSIZE)
     {
      //--- Ajustar el ancho de la columna de la tabla resumen
      if(m_table_symbols.RowsTotal()>(uint)m_table_symbols.VisibleRowsTotal())
        {
         int width[]={79};
         m_table_symbols.ColumnsWidth(width);
        }
      else
        {
         int width[]={95};
         m_table_symbols.ColumnsWidth(width);
        }
      //---
      m_table_symbols.Update(true);
      m_table_symbols.GetScrollVPointer().CurrentPos(0);
      m_table_symbols.GetScrollVPointer().Update(true);
      return;
     }
 
Anatoli Kazharski:

Mira el método Moving().

Intenta acceder a los botones de la ventana mediante punteros y llama a este método.

Sí, eso es :) ¡Gracias!

Pensaba que ya lo había mirado todo y se me había pasado lo más obvio :)

 
Anatoli Kazharski:

Así puedes intentar darte cuenta de lo que necesitas ahora:

Es sólo un ancho de columna fijo, pero estábamos hablando de cambiar dinámicamente el ancho de las columnas en función de su ancho anterior. Sin embargo, ya he completado la clase añadiendo allí el método int ColumnWidth(int i)

 

Buenas tardes.

El problema es mayor :)

Creamos un objeto dinámico, por ejemplo una etiqueta

   labels[i] = new CTextLabel;
   labels[i].MainPointer(m_window1);
   labels[i].XSize(SYMBOLS_COL_WIDTH);
   labels[i].YSize(HEAD_HIGHT);
   labels[i].Alpha(SYMBOLS_HEAD_BACK_ALPHA);
   labels[i].FontSize(SYMBOLS_HEAD_FONT_SIZE);
   labels[i].TextAlign(SYMBOLS_HEAD_TEXT_ALIGN,HORIZONTAL_SPACE,0);
   labels[i].FontStyle(SYMBOLS_HEAD_FONT_STYLE);
   labels[i].BackColor(SYMBOLS_HEAD_BACK_COLOR);
   labels[i].CreateTextLabel("0",x_gap,ProfitHeadGap);
   CWndContainer::AddToElementsArray(0,labels[i]);
   labels[i].Update(true);

¿Pero como borrarlo?

Lo borro de esta manera.

      labels[i].Delete();
      delete labels[i];

Pero después de borrarlo, se bloquea, dice que el acceso al puntero es incorrecto.

Por lo que he entendido, CWndContainer::AddToElementsArray añade el objeto a las matrices comunes, pero Delete() no lo borra de ahí, y la ventana intenta acceder al objeto. No encuentro ninguna otra similar a Delete().

¿Cómo borrar un objeto correctamente?