Discusión sobre el artículo "Interfaces gráficas V: Control "Lista combinada" (Capítulo 3)"

 

Artículo publicado Interfaces gráficas V: Control "Lista combinada" (Capítulo 3):

En dos primeros capítulos de la quinta parte sobre las interfaces gráficas hemos desarrollado las clases para crear la barra de desplazamiento y la lista. En este capítulo vamos a hablar de la clase para la creación del control llamado “Lista combinada”. Éste también es un control compuesto que incluye los controles analizados en dos primeros capítulos de la quinta parte.

Abajo se muestran los objetos primitivos para componer el control “Combobox”.

  1. Fondo del control
  2. Etiqueta (descripción del control)
  3. Botón
  4. Indicio de lista desplegable


Fig. 1. Partes integrantes del control “Combobox”.

Autor: Anatoli Kazharski

 

Muy útil lo que estás haciendo ;)

Anatol, creo que se podrían hacer algunas mejoras. Por ejemplo, cuando el cursor está sobre cualquiera de las listas, mi mano busca la rueda para desplazarse por la lista, pero, por desgracia, nos desplazamos por el gráfico. Y tienes el seguimiento del desplazamiento del gráfico. Quizá sería mejor no quitar la lista, sino desplazarla, desactivando temporalmente el desplazamiento del gráfico, ¿qué os parece?

Y una cosa más: no me había dado cuenta, ¿hay alguna opción para no mostrar la descripción de la lista, que está a la izquierda del botón de la lista? No siempre es necesaria.

 

Bueno, o en general cardinalmente - si la ventana principal del programa está en el foco, a continuación, desactivar el desplazamiento de la carta, y allí ya en el acto para determinar si es necesario desplazarse algo de la rueda, o no reaccionar a ella....

Por ejemplo, en 3D Studio MAX, por ejemplo, hay una reacción al botón izquierdo del ratón con pinzas y su movimiento hacia arriba y hacia abajo sobre la forma de aumento / disminución de cualquier valor. Haga clic en la flecha hacia arriba o hacia abajo y, sin soltar el botón de conducir el ratón hacia arriba o hacia abajo, y el valor en la ventana de forma aumenta o disminuye en función de la dirección del movimiento del ratón.

 
Artyom Trishkin:

Anatol, creo que se podrían hacer algunas mejoras. Por ejemplo, cuando el cursor está sobre cualquiera de las listas, la mano busca la rueda para desplazarse por la lista, pero, por desgracia, nos desplazamos por el gráfico. Y tienes el seguimiento del desplazamiento del gráfico. Quizá sería mejor no quitar la lista, sino desplazarla desactivando temporalmente el desplazamiento del gráfico, ¿no crees?

Ahora, por lo que yo sé, herramientas MQL puede realizar un seguimiento de si el botón central del ratón está pulsado o no. Pero sigue siendo imposible realizar un seguimiento de si se está desplazando o no.

Y una cosa más: No me he dado cuenta si hay una opción para no mostrar la descripción de la lista, que está a la izquierda del botón de la lista? No siempre es necesario.

Sí, es posible. Cuando crees un elemento, pasa una cadena vacía ("") al método CComboBox::LabelText().

En 3D Studio MAX, por ejemplo, existe una reacción al botón izquierdo del ratón pulsado y su movimiento arriba y abajo sobre la forma de incremento/decremento de algún valor. Haga clic en la flecha hacia arriba o hacia abajo y, sin soltar el botón de llevar el ratón hacia arriba o hacia abajo, y el valor en la forma de caja o bien aumenta o disminuye dependiendo de la dirección del movimiento del ratón.

El próximo artículo introducirá una serie de controles, incluyendo el elemento "Campo de entrada". Allí, en la implementación actual, hay desplazamiento acelerado. Es decir, manteniendo el botón izquierdo del ratón sobre los botones de incremento/decremento y manteniendo el cursor en la zona de estos botones se produce un desplazamiento acelerado de los valores.

 
//+------------------------------------------------------------------+

//|ComboBox.mqh |
//| Derechos de autor 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include "Element.mqh"
#include "Window.mqh"
#include "ListView.mqh"
//+------------------------------------------------------------------+
//| Êëàññ äëÿ ñîçäàíèÿ êîìáèíèðîâàííîãî ñïèñêà                      |
//+------------------------------------------------------------------+
class CComboBox : public CElement
  {
private:
   //--- Óêàçàòåëü íà ôîðìó, ê êîòîðîé ýëåìåíò ïðèñîåäèí¸í
   CWim_buttonndow          *m_wnd;
   //--- Îáúåêòû äëÿ ñîçäàíèÿ êîìáî-áîêñà
   CRectLabel        m_area;
¿Alguna razón por la que los comentarios ya no están en inglés?
 
Amir Yacoby:
¿Alguna razón por la que los comentarios ya no están en inglés?

He ssen lo mismo, y creo que tienen actualmente 2 cosas.


1. 1. Algunas cuestiones que aún deben ser corregidos (especialmente en MT4 !)
2. Actualmente no hay persona que puede traducir al Inglés. Para mí tampoco está claro, por qué los principales comentarios no están en Inglés. Pero siempre y cuando las funciones declaradas en Inglés, y la mayoría de los ejemplos como el anterior está disponible en Inglés, no importa.


 
MetaQuotes Software Corp.:

Nuevo artículo Interfaces Gráficas V: El Control Combobox (Capítulo 3) ha sido publicado:

Autor: Anatoli Kazharski

Buen trabajo con los artículos. Estoy disfrutando con la siguiente serie de artículos. ¿Puedes por favor comprobar la línea 90 de SplitButton.mqh? Me da error

return - cannot convert from const pointer to nonconst pointer.

He quitado el "const" para que funcione.
 
Kaleem Haider:

return - no se puede convertir de puntero const a puntero no const.

He eliminado el "const" para que funcione.

Sí, es necesario quitar el "const" siempre que se produzca este error. Más tarde voy a actualizar los archivos en todos los artículos.

 

[WIN7 64bits - MetaTrader5 build 1472]

Comportamiento extraño de SplitString con ComboBox.

Creo un combobox para controlar el sl y tp de una orden, pero cuando intento obtener el item seleccionado hay un problema.
Cuando el usuario hace click en los botones de vender o comprar, el programa obtiene el item seleccionado del combobox y calcula el sl y tp de la orden.
Cuando lo ejecuto en modo Debugging (F5) no hay problema. Pero cuando lo arrastro desde la lista de EA y lo suelto en el gráfico, aparece el problema.
Parece que la librería EasyAndFast sobrescribe de alguna manera las funciones SplitString, o PrintFormat, o StringToDouble, o algo así. Pero no estoy seguro en absoluto.
Aquí está mi ejemplo:

//+------------------------------------------------------------------+
//| Crea combobox TP:SL|
//+------------------------------------------------------------------+
bool CProgram::CreateTPSLComboBox(const int x_gap, const int y_gap, const string text) {
  // Número total de elementos de la vista de lista
  #define ITEMS_TOTAL1 4

  // Pasar el objeto panel
  _tpslCombobox.WindowPointer(_mainWindow);
  
  // Adjuntar a la primera pestaña
  _mainTabs.AddToElementsArray(0, _tpslCombobox);  
  
  // Coordenadas
  int x = _mainWindow.X() + x_gap;
  int y = _mainWindow.Y() + y_gap;
  
  // Matriz de los valores de los elementos en la vista de lista
  string items_text[ITEMS_TOTAL1] = {"2:4", "2:3", "3:4", "0:0"};
  
  // Establecer propiedades antes de la creación
  _tpslCombobox.XSize(90);
  _tpslCombobox.YSize(18);
  _tpslCombobox.LabelText(text);
  _tpslCombobox.ButtonXSize(45);
  _tpslCombobox.ItemsTotal(ITEMS_TOTAL1);
  _tpslCombobox.VisibleItemsTotal(4);
  _tpslCombobox.AreaColor(clrWhite);

  // Almacenar los valores de los elementos en la vista de lista del combobox
  for(int i = 0; i < ITEMS_TOTAL1; i++)
    _tpslCombobox.ValueToList(i, items_text[i]);
  
  // Obtener el puntero de la vista de lista
  CListView *lv = _tpslCombobox.GetListViewPointer();
  
  // Establecer las propiedades de la vista de lista
  lv.LightsHover(true);
  lv.SelectedItemByIndex(lv.SelectedItemIndex() == WRONG_VALUE ? 0 : lv.SelectedItemIndex());
  
  // Crear control
  if(!_tpslCombobox.CreateComboBox(m_chart_id, m_subwin, x, y))
    return(false);

  // Añadir el objeto a la matriz común de grupos de objetos
  CWndContainer::AddToElementsArray(0, _tpslCombobox);
  return(true);
}

...

//+------------------------------------------------------------------+
//| Función de venta |
//+------------------------------------------------------------------+
void CProgram::Sell() {
  string sep = ":";
  ushort usep;
  usep = StringGetCharacter(sep, 0);
  string s[];
  double tp = 0.0;
  double sl = 0.0;
  if(StringSplit(_tpslCombobox.ButtonText(), usep, s) == 2) {
    PrintFormat("s01: %s - s02: %s", s[0], s[1]); // output: s01: 2 - s02: 4 
    tp = StringToDouble(s[0]);
    sl = StringToDouble(s[1]);
  }
  PrintFormat("tp: %.2f - sl: %.2f", tp, sl); // output: tp: 2.00 - sl: 2.00
...

La salida: "tp:2.00 - sl: 2.00" debería ser "tp:2.00 - sl: 4.00".
Pero de nuevo, el problema aparece sólo cuando arrastro y suelto en el gráfico. Cuando lo ejecuto en modo depuración todo va bien.
¿Algún consejo?

------
ACTUALIZACIÓN:
Parece un problema en MetaTrader 5, no en la biblioteca EasyAndFast específicamente.
Aquí está una prueba:
//+------------------------------------------------------------------+
//|prueba.mq5
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    string sep = ":";
    ushort usep;
    usep = StringGetCharacter(sep, 0);
    string s[];
    double tp = 0.0;
    double sl = 0.0;
    if(StringSplit("2:4", usep, s) == 2) {
      tp = StringToDouble(s[0]);
      sl = StringToDouble(s[1]);
    }
    PrintFormat("tp: %.2f - sl: %.2f", tp, sl);
  }
//+------------------------------------------------------------------+
Salida: "tp: 2.00 - sl: 4.00" en modo Debug (F5).
Salida: "tp: 2.00 - sl: 2.00" al arrastrar y soltar el script en el gráfico.

Si alguien más confirma esto, informaré al ServiceDesk.
Gracias.

[WIN7 64bits - MetaTrader5 build 1472]
 

Copiado todo en la carpeta mql4, TestLibrary Expert Advisor es gris y no se abre. Dice "no se puede abrir el archivo" en Expert Advisors.

¿Funciona en modo de prueba? ¿Hay algún sentido para investigar por qué no se inicia, ya que es muy importante que funcione en modo de prueba.

 
Evgeniy Scherbina:

Copiado todo en la carpeta mql4, TestLibrary Expert Advisor es gris y no se abre. Dice "no se puede abrir el archivo" en Expert Advisors.

¿Funciona en modo de prueba? ¿Hay algún sentido para investigar por qué no se ejecuta, ya que es muy importante que funcione en modo de prueba.

La versión para MT4 de la librería ya no tiene soporte por mi parte.

La última versión para MT5 por el momento se puede descargar en este artículo: GUIs X: Time Element, Checkbox List Element and Table Sorting (build 6).

Las pruebas de testeo no se han realizado en la etapa actual de desarrollo y no se realizarán por un largo tiempo.