Discusión sobre el artículo "Interfaces gráficas X: Actualizaciones para la librería Easy And Fast (build 2)" - página 2

 
Alexey Oreshkin:

Tal vez mi código fue borrado y no puedo decir con seguridad ahora.

...

Interfaces gráficas I: Preparando la estructura de la librería (Capítulo 1) >>>

Fíjate en los dos puntos dobles delante de las funciones en el listado de código anterior. De hecho, puede omitirlos y todo funcionará correctamente. Pero en programación se considera una buena práctica poner dobles dos puntos antes de las funciones del sistema de un lenguaje. Esto deja claro que la función es una función del sistema.

Alexey Oreshkin:

El error se produce cuando cierro una ventana creada por el indicador con una cruz. He cambiado ligeramente el archivo MainWindow.mqh del ejemplo que se encuentra aquí: Indicators\Article 10\SeparateWindow.

Voy a excluir el error mediante la comprobación adicional. La solución estará en la próxima actualización. Repetición fallida. ¿Qué cambios se hicieron en el archivo MainWindow.mqh?

Alexey Oreshkin:

y tampoco entiendo como borrar una fila en la tabla creada ?

Por ahora no hay manera. Será en las próximas versiones de la biblioteca. Será posible añadir y eliminar filas en tablas y listas.

 

Debo haber borrado algo innecesario. Adjunto los archivos.

p.d. ¿Puedo establecer un ancho diferente para cada columna de la tabla?

Archivos adjuntos:
 
Alexey Oreshkin:

Debo haber borrado algo innecesario. Adjunto los archivos.

p.d. ¿Puedo establecer un ancho diferente para cada columna de la tabla?

La razón es que has añadido un objeto de la misma tabla al elemento base dos veces. Primero en el método de creación de la tabla CProgram:: CreateTable(), donde debería hacerse, y luego en tu método CProgram::ModifyTable(). Borra la línea resaltada en rojo en el siguiente listado de código.

//+------------------------------------------------------------------+
//|| Crea la tabla de símbolos|
//+------------------------------------------------------------------+
bool CProgram::ModifyTable(int id)
  {
   int r=1;
   switch(id){
      case  0:         
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL;r++)
            m_table.SetValue(c,r,"rb1 "+(string)c+" "+(string)r);                                  
      break;
      
      case 1:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-5;r++)
            m_table.SetValue(c,r,"rb2 "+(string)c+" "+(string)r);  
      break;
      case 3:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-10;r++)
            m_table.SetValue(c,r,"rb3 "+(string)c+" "+(string)r);                                      
      break;
   }
      for(int c=0;c<COLUMNS2_TOTAL;c++)
      for(int rr=r;rr<ROWS2_TOTAL;rr++) m_table.SetValue(c,rr,"");

//--- Actualizar la tabla para mostrar los cambios
   m_table.UpdateTable();
//--- Añade el objeto al array común de grupos de objetos
   CWndContainer::AddToElementsArray(0,m_table);
   return(true);
  }  

//---

Al borrar el programa del gráfico o recargarlo, por ejemplo, al cambiar el marco temporal o el símbolo, se intentaba borrar por segunda vez un elemento que ya se había borrado antes. Al eliminar un objeto de la tabla, se liberaban las matrices y se producía un error al volver a llamar al método de eliminación de un elemento.

Alexey Oreshkin:

p.d. ¿Puedo establecer una anchura diferente para cada columna de la tabla?

No en este tipo de tablas(CTable). Puede establecer el ancho de las columnas sólo en las tablas de tipo CCanvasTable. Pero en este tipo de tablas por el momento hay muchas otras restricciones, que muy probablemente no le convendrán. Las posibilidades de las tablas de tipo CCanvasTable se ampliarán.

 
Anatoli Kazharski:

La razón fue que agregaste el mismo objeto tabla al elemento base dos veces. Primero en el método CProgram ::CreateTable(), donde debería hacerse, y luego en tu método CProgram::ModifyTable(). Borra la línea resaltada en rojo en el siguiente listado de código.

Ah sí, es una tontería, no me di cuenta porque copié mi método ModifyTable de CreateTable.
Probaré con CCanvasTable, quizás funcione.
¡Gracias!

p.s: Si no puedo borrar filas de la tabla, puedo borrar toda la tabla y crearla de nuevo, la que necesito. Tampoco he encontrado ningún método de borrado. ¿Aún no puedo borrar la tabla?

p.s2: Como no puedo crear las columnas de la tabla de diferentes anchos, lo lógico es colocar dos tablas una al lado de la otra, pero según tengo entendido no puedo hacerlo porque la tabla se expande automáticamente hasta el borde derecho. Existe un método AutoXResizeMode, pero todavía no funciona... Cuando se pone a false, no se produce ningún cambio.

 
Alexey Oreshkin:

...

p.d: Si no puedo borrar filas de una tabla, puedo borrar toda la tabla y crearla de nuevo, la que necesito. Tampoco he encontrado ningún método de borrado. ¿Aún no puedo borrar la tabla?

Ahora todos los elementos de la GUI se crean a la vez y luego puedes controlar su visibilidad usando los métodos Show() y Hide().

Alexey Oreshkin:

p.s2: Como no puedo crear las columnas de la tabla de diferentes anchos, es logico colocar dos tablas una al lado de la otra, pero como me di cuenta no puedo hacerlo porque la tabla se expande automaticamente hasta el borde derecho. Hay un método AutoXResizeMode, pero todavía no funciona... Cuando está en false, no se produce ningún cambio.

Utiliza el método XSize() para establecer el ancho de la tabla.

Ejemplo:

m_table.XSize(300);
 

Gracias por las respuestas.

Hay un par de preguntas más:

1.Si los datos no caben en una celda de la tabla, ¿hay planes para hacer un tooltip o un ticker en esta celda en el futuro?

2.¿Es posible desactivar el desplazamiento horizontal en algunas tablas?

p.s:

El error se produce cuando creamos una tabla con 5 columnas, pero intentamos mostrar más. La opción es una tontería, estoy de acuerdo, pero es necesaria. Especialmente si las tablas pueden llegar a ser dinámicas en el futuro.

p.s2: Los métodos Mostrar y Ocultar funcionan perfectamente y permiten no cambiar la tabla sobre la marcha, sino mostrar la que sea necesaria. En cada pestaña he creado tablas necesarias que están vinculadas a botones de radio y cuando se activan se muestra la necesaria, las que no lo son - se ocultan. Aquí todo funciona. Pero por alguna razón no puedo ocultar las tablas irrelevantes inmediatamente después de su creación. Debido a esto, creo, barras de desplazamiento no funcionan correctamente, pero tan pronto como haga clic una vez en el botón de radio y todo lo innecesario se oculta - todo empieza a funcionar bien.

 
Alexey Oreshkin:

1.Si los datos no caben en una celda de la tabla, ¿hay planes para hacer un tooltip o un ticker en esta celda en el futuro?

Añadido a la lista de futuras actualizaciones. Haré un modo de tooltips en tablas.

Alexey Oreshkin:

2.¿Es posible desactivar el desplazamiento horizontal en algunas tablas?

Las barras de desplazamiento aparecen cuando la parte visible de la tabla es menor que la parte total.

Alexey Oreshkin:

El error se produce cuando creamos una tabla con 5 columnas e intentamos mostrar más. La opción es una tontería, estoy de acuerdo, pero necesitamos una comprobación. Sobre todo si las tablas pueden llegar a ser dinámicas en el futuro.

He hecho correcciones. Estarán disponibles en la próxima actualización.

Alexey Oreshkin:

p.s2: Los métodos Mostrar y Ocultar funcionan perfectamente y permiten no cambiar la tabla sobre la marcha, sino mostrar la que se necesita. En cada pestaña he creado tablas necesarias que están vinculadas a botones de radio y cuando se activan se muestra la necesaria, las que no - se ocultan. Todo funciona aquí. Pero por alguna razón no puedo ocultar las tablas irrelevantes inmediatamente después de su creación. Debido a esto, creo, barras de desplazamiento no funcionan correctamente, pero tan pronto como haga clic una vez en el botón de radio y todo lo innecesario está oculto - todo empieza a funcionar bien.

Ocúltalas después de actualizar los elementos de la pestaña:

//--- Mostrar elementos de la pestaña activa
   m_tabs.ShowTabElements();
//--- Ocultar tablas
...

Si eso no funciona, envíame tu código y le echaré un vistazo.

 
Parece que estoy haciendo algo mal o el problema es de otra manera, pero tengo algunos problemas con las barras de desplazamiento.
Al inicio casi no funcionan, pero si uso botones de radio para actualizarlas, todo empieza a funcionar normalmente. Al cambiar a una nueva pestaña el mismo problema hasta que hago clic en el botón de radio.
He enviado el archivo a PM.
 
Alexey Oreshkin:
Parece que estoy haciendo algo mal o el problema es de otra manera, pero tengo algunos problemas con las barras de desplazamiento.
Al inicio casi no funcionan, pero si uso botones de radio para actualizarlas, todo empieza a funcionar normalmente. Al cambiar a una nueva pestaña el mismo problema, hasta que hago clic en el botón de radio.
He enviado el archivo a PM.

He mirado sus archivos. El problema es claro. Hay un conflicto entre las barras de desplazamiento, que se encuentran una encima de la otra en las tablas visibles. La cosa es que cuando cambias de pestaña, todos los elementos que están asignados a la pestaña actualmente seleccionada se hacen visibles. Como tienes todas las tablas una encima de otra, no lo has visto. Mira la captura de pantalla de abajo, he cambiado las coordenadas de dos tablas de esta pestaña para mayor claridad:

//---

Necesitamos un evento que nos diga que ha habido un cambio de pestaña. Luego en un manejador de clase personalizado se puede recibir y tomar las acciones necesarias. En tu caso, entonces podrías obtener el índice del botón de opción seleccionado y mostrar la tabla que asocies a él, y ocultar las demás.

Ahora mismo no se genera un evento de este tipo al cambiar de pestaña. Estará disponible en la próxima actualización de la biblioteca.

 
¿Y cuándo esperar la actualización?