Discusión sobre el artículo "Interfaces gráficas X: Control "Hora", control "Lista de las casillas de verificación" y ordenamiento (sort) de la tabla (build 6)" - página 2
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Sin embargo, me parece que los recientes cambios relativos a la especificación de coordenadas por desplazamiento desde el borde del formulario no son muy amigables para el usuario final. Si antes el usuario podía utilizar con seguridad dos opciones para especificar la ubicación de un objeto en la ventana, ahora una de ellas se ha complicado. Me han pasado cosas como esta por toda la pantalla.
Ejemplo:
Botón1 - su coordenada x está a 4 píxeles del borde izquierdo de la ventana del formulario. Se establece de la siguiente manera: x=m_window.X()+4; El tamaño del botón1 es de 43 píxeles de ancho. Su borde derecho se puede obtener de la siguiente manera: m_butt1.X2();
Botón2 - su coordenada está a 2 pí xeles del borde derecho del botón1. Se establece de la siguiente manera: x=m_butt1.X2()+2; El tamaño del botón2 es de 24 píxeles de ancho. Su borde derecho se puede obtener de la siguiente manera: m_butt2.X2();
Botón3 - su coordenada está a 4 píxeles del borde derecho del botón2. Se establece de la siguiente manera: x=m_butt2.X2()+4; El tamaño del botón3 es de 18 píxeles de ancho. Su borde derecho se puede obtener de la siguiente manera: m_butt3.X2();
La barra vertical de separación está a 4 píxeles del borde derecho del botón3: x=m_butt3.X2()+4;
Así que podemos cambiar fácilmente el tamaño de cualquiera de los tres botones, y todos ellos se situarán en el desplazamiento que establezcamos, y la barra de separación se colocará perfectamente en el desplazamiento que necesitamos del botón3.
Botón1: x_gap1=4;
Botón2: x_gap2=4+m_butt1.XSize()+2;
Button3: x_gap3=4+m_butt1.XSize()+2+m_butt2.XSize()+4;
R-Strip: x_gap4=4+m_butt1.XSize()+2+m_butt2.XSize()+4+m_butt3.XSize()+4;
Aquí se sugiere especificar su coordenada X2() en lugar de especificar los tamaños de los objetos, pero no es el caso - todo se viene abajo enseguida (yo, por ejemplo, me rompí la cabeza mientras adivinaba que Y2() no apuntaba a la posición correcta de la coordenada Y).
Veamos: establezco las coordenadas del menú con una sangría de 1 píxel en horizontal y con una sangría del tamaño de la "cabecera" de la ventana principal. La altura del menú es de 18 píxeles.
x=m_window_main.X()+1;
y=m_window_main.Y()+m_window_main.CaptionHeight();
h=18;
El menú está en su sitio:
Ahora necesito poner la tabla desplazada del borde inferior del menú. Si el CaptionHeight() de la ventana del formulario es de 18 píxeles, y la altura del menú es también de 18 píxeles, entonces el desplazamiento vertical para la tabla debe ser de 36 píxeles. Hay dos opciones: o nos sentamos con una calculadora y calculamos todos los desplazamientos necesarios (y los volvemos a calcular en caso de ajustes posteriores con cambios de tamaño), o intentamos conseguirlos. Elegimos la segunda, por supuesto, y lo intentamos: para la tabla y_gap debe ser igual a la altura del título de la ventana principal más la altura del menú: m_window_main.CaptionHeight()+m_menu_main.YSize();
x=2;
y=m_window_main.CaptionHeight()+m_menu_main.YSize()+1;
w=140;
Compilar, obtener:
La pestaña está en su sitio. Pero. ¿No debería coincidir en este caso el valor Y2() del menú con el que hemos calculado? Al fin y al cabo, es más cómodo no recoger los tamaños de todos los objetos que se suceden, sino sólo obtener sus coordenadas, ¿no? Vamos a intentarlo - cambiar el cálculo de coordenadas a su obtención:
x=2;
//y=m_window_main.CaptionHeight()+m_menu_main.YSize()+1;
y=m_menu_main.Y2()+1;
w=140;
Compilar, obtener:
¿ Y2() no debería devolver el mismo Y2 que calculamos antes ? m_window_main.CaptionHeight()+m_menu_main.YSize()+1;
Pues no debería - ahora no especificamos coordenadas con desplazamiento desde cualquier borde de la ventana, sino sólo desplazamiento, y sólo desde arriba o izquierda. Bien. Quitamos de la coordenada Y2() obtenida la coordenada Y() de la parte superior de la ventana del formulario para obtener el valor del desplazamiento desde la parte superior de la ventana del formulario:
x=2;
//y=m_window_main.CaptionHeight()+m_menu_main.YSize()+1;
y=m_menu_main.Y2()-m_window_main.Y()+1;
w=140;
Compilamos y obtenemos lo que queremos:
Entonces, ¿para veinte objetos que están a dos píxeles de distancia entre sí, debemos sumar siempre sus tamaños más el desplazamiento entre ellos para obtener el desplazamiento correcto del último objeto? Después de todo, Y2() del decimonoveno objeto (a partir del cual antes sólo se podía construir el vigésimo objeto añadiendo un desplazamiento de dos puntos) ahora no nos da un punto de partida, y devuelve no lo que se espera.... y tenemos que sumar los tamaños de todos los objetos para obtener el desplazamiento necesario o para cada objeto antes de su creación tenemos que calcular su desplazamiento en base a su coordenada Y2() y la coordenada Y() inicial de la ventana del formulario.
No lo entiendo. Anatoly, por favor, dame una solución. ¿Qué estoy haciendo mal? ¿Por qué es así? ¿Por qué crees que ahora es más amigable? Si antes podías simplemente especificar el desplazamiento desde cualquier borde de la ventana del formulario, desde cualquier objeto de esta ventana, o incluso desde el borde del gráfico en general para construir el objeto requerido, ¿ahora tienes que hacer un baile de pandereta para calcular sus coordenadas antes de construirlo? ¿Es mejor y más conveniente escribir más código y diferentes cálculos?
Entiendo que usted es el autor y usted sabe mejor. Pero aun así dejas que otros lo usen. Yo (sólo mi opinión) creo que esta innovación resultó ser la única mala decisión para introducirlo como una actualización - se convirtió en algo peor. No tenía la facilidad para crear interfaces que tenía antes.
Pido disculpas si te he ofendido (antes se cortaba la cabeza a los mensajeros con malas noticias).
...
Siento si te he ofendido.
Le responderé un poco más tarde, pero antes me gustaría aclarar lo que quiere decir con esta frase en relación conmigo. ¿Qué es una "mala noticia" y quién es un "mensajero" en este contexto? :)
Le responderé un poco más tarde, pero antes me gustaría aclarar lo que ha querido decir con esta frase sobre mí. ¿Qué es una "mala noticia" y quién es un "mensajero" en este contexto? :)
:)
La mala noticia la llamé a mi actitud ante la novedad de que ya no se puede tomar cualquier coordenada arbitraria como punto de referencia de coordenadas del objeto, sino sólo los bordes izquierdo y superior de la forma (añadí un recálculo de coordenadas en local - cálculos innecesarios).... Y el mensajero soy yo, claro, ya que no me gustó y lo dije :)
:)
La mala noticia que llamé mi actitud a la innovación que ahora no se puede tomar cualquier coordenada arbitraria como el punto de referencia de coordenadas del objeto, pero sólo los bordes izquierdo y superior de la forma (He añadido un nuevo cálculo de coordenadas en local - cálculos innecesarios).... Bueno, el mensajero soy yo, por supuesto, ya que no me gustaba y lo dijo :)
Así que ahí lo tienen. Muy bien. Porque pensé que había entendido mal. )
Aquí está mi respuesta:
Sin embargo, creo que los recientes cambios relativos a la especificación de coordenadas por desplazamiento desde el borde del formulario no son muy amigables para el usuario final. Si antes el usuario podía utilizar con seguridad dos opciones para especificar la ubicación del objeto en la ventana, ahora una de ellas se ha complicado. A mí me ha pasado que las cosas se caen a pedazos y se desparraman así por toda la pantalla.
...
Ahora vamos a ver lo que tenemos que hacer al construir la interfaz de acuerdo con las nuevas reglas:
Botón1: x_gap1=4;
Botón2: x_gap2=4+m_butt1.XSize()+2;
Botón3: x_gap3=4+m_butt1.XSize()+2+m_butt2.XSize()+4;
Tira R: x_gap4=4+m_butt1.XSize()+2+m_butt2.XSize()+4+m_butt3.XSize()+4;
...
En lugar de especificar los tamaños de los objetos, tendrías la tentación de especificar su coordenada X2(), pero no es así: todo se viene abajo enseguida (yo, por ejemplo, me rompí la cabeza hasta que me di cuenta de que Y2() no apunta a la ubicación correcta de la coordenada Y).
Es muy sencillo. Antes había que pasar coordenadas absolutas a los métodos de creación de elementos. Tenían que ser calculadas en relación al punto más a la izquierda de la forma a la que se adjunta el elemento.
Aquí tienes un ejemplo de lo que teníamos que hacer antes:
//|| Crea un botón|
//+------------------------------------------------------------------+
bool CProgram::CreateSimpleButton(const int x_gap,const int y_gap,const string button_text)
{
//--- Guardar el puntero al formulario
m_simple_button.WindowPointer(m_window);
//--- Coordenadas
int x=m_window.X()+x_gap;
int y=m_window.Y()+y_gap;
//--- Establecer propiedades antes de la creación
m_simple_button.ButtonXSize(100);
//--- Crear un botón
if(!m_simple_button.CreateSimpleButton(m_chart_id,m_subwin,button_text,x,y))
return(false);
//--- Añade un puntero al elemento en la base
CWndContainer::AddToElementsArray(0,m_simple_button);
return(true);
}
//---
Ahora no es necesario calcular nada, ya que basta con pasar las coordenadas relativas.
Un ejemplo de lo que hay que hacer ahora:
//|| Crea un botón|
//+------------------------------------------------------------------+
bool CProgram::CreateSimpleButton(const int x_gap,const int y_gap,const string button_text)
{
//--- Pasa el objeto panel
m_simple_button.WindowPointer(m_window);
//--- Establecer propiedades antes de la creación
m_simple_button.ButtonXSize(100);
//--- Crear un botón
if(!m_simple_button.CreateSimpleButton(m_chart_id,m_subwin,button_text,x_gap,y_gap))
return(false);
//--- Añade un puntero al elemento en la base
CWndContainer::AddToElementsArray(0,m_simple_button);
return(true);
}
//---
En tus ejemplos anteriores, estás calculando coordenadas absolutas. Decisión estúpida seguida de conclusiones erróneas puestas apresuradamente en público.
Los métodos CElement ::X(), CElement ::X2(), CElement ::Y() y CElement::Y2() devuelven coordenadas absolutas de los bordes de los elementos. Y es fácil de entender con sólo mostrar estos valores en el log de la terminal, por si quedan dudas.
A continuación se muestra un ejemplo de cálculo de la sangría( coordenadarelativa ) relativa a algún elemento. Hay dos botones. La coordenada X (relativa) para el segundo botón se calcula relativa al borde derecho del primer botón.
//|| Crea la GUI del programa ||
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
{
//--- Creación de un panel
if(!CreateWindow("EXPERT PANEL"))
return(false);
if(!CreateSimpleButton1(7,25,"BUTTON 1"))
return(false);
if(!CreateSimpleButton2(m_simple_button1.X2()-m_window.X()+5,25,"BUTTON 2"))
return(false);
//---
return(true);
}
//---
Como resultado, el segundo botón tendrá una sangría de 5 píxeles desde el borde derecho del primer botón:
//---
Cambiando la anchura o la coordenada X del primer botón, la posición del segundo botón se ajustará automáticamente.
Así que los cálculos innecesarios son sólo en su ejemplo citado anteriormente.
//|| Crea la GUI del programa ||
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
{
//--- Creación de un panel
if(!CreateWindow("EXPERT PANEL"))
return(false);
if(!CreateSimpleButton1(7,25,"BUTTON 1"))
return(false);
if(!CreateSimpleButton2(m_simple_button1.X2()-m_window.X()+5,25,"BUTTON 2"))
return(false);
//---
return(true);
}
//---
Como resultado, el segundo botón tendrá una sangría de 5 píxeles desde el borde derecho del primer botón:
//---
Cambiando la anchura o la coordenada X del primer botón, la posición del segundo botón se ajustará automáticamente.
Así que los cálculos adicionales son sólo en su ejemplo citado anteriormente.
Aquí... Es que no quedó muy claro:
if(!CreateSimpleButton2(m_simple_button1.X2()-m_window.X()+5,25,"BUTTON 2"))
Tengo que poner este recálculo en mis funciones para no escribir este recálculo en todas partes al especificar las coordenadas de un objeto recién creado, sino para seguir escribiendo como antes - es más claro ver la relación de un objeto con otro. Es cuestión de gustos y preferencias de cada uno, claro...
Por cierto, el navegador de archivos se cae incluso especificando coordenadas como dices. Pero a lo mejor es sólo cosa mía. Voy a buscar la razón.
Capturas de pantalla de la plataforma de negociación MetaTrader
EURUSD, D1, 2016.12.12
MetaQuotes Software Corp., MetaTrader 5, Demo
Anatoly, parece que olvidaste editar FileNavigator.mqh en el archivo
//| Crea una lista de árboles|
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\folder_w10.bmp"
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\text_file_w10.bmp"
//---
bool CFileNavigator::CreateTreeView(void)
{
//--- Guardar el puntero de la ventana
m_treeview.WindowPointer(m_wnd);
//--- Establecer propiedades
m_treeview.Id(CElement::Id());
m_treeview.ResizeListAreaMode(true);
m_treeview.TreeViewAreaWidth(m_treeview_area_width);
m_treeview.ContentAreaWidth(m_content_area_width);
m_treeview.AutoXResizeMode(CElement::AutoXResizeMode());
m_treeview.AutoXResizeRightOffset(CElement::AutoXResizeRightOffset());
m_treeview.AnchorRightWindowSide(m_anchor_right_window_side);
m_treeview.AnchorBottomWindowSide(m_anchor_bottom_window_side);
//--- Formar matrices de la lista de árboles
int items_total=::ArraySize(m_g_item_text);
for(int i=0; i<items_total; i++)
{
//--- Definir la imagen para el elemento (carpeta/archivo)
string icon_path=(m_g_is_folder[i])? m_folder_icon : m_file_icon;
//--- Si se trata de una carpeta, elimine el último carácter ('\') de la cadena
if(m_g_is_folder[i])
m_g_item_text[i]=::StringSubstr(m_g_item_text[i],0,::StringLen(m_g_item_text[i])-1);
//--- Añadir un elemento a la lista del árbol
m_treeview.AddItem(i,m_g_prev_node_list_index[i],m_g_item_text[i],icon_path,m_g_item_index[i],
m_g_node_level[i],m_g_prev_node_item_index[i],m_g_items_total[i],m_g_folders_total[i],false,m_g_is_folder[i]);
}
//--- Crear una lista de árboles
if(!m_treeview.CreateTreeView(m_chart_id,m_subwin,m_x-1,m_y+m_address_bar_y_size-1))
return(false);
//--- Guardar las dimensiones del navegador
CElement::XSize(m_treeview.XSize());
CElement::YSize(m_treeview.YSize()+m_address_bar_y_size);
return(true);
}
//+------------------------------------------------------------------+
Aquí es donde tienes que añadirlo:
if(!m_treeview.CreateTreeView(m_chart_id,m_subwin,m_x-m_wnd.X()-1,m_y-m_wnd.Y()+m_address_bar_y_size-1))
return(false);
...
Por cierto, el navegador de archivos se bloquea incluso cuando se especifican las coordenadas como usted dice. Pero tal vez es sólo conmigo. He ido a buscar el motivo.
No lo he reproducido yo mismo:
Yo no lo he reproducido:
Compruebe FileNavigator.mqh en la última actualización.
Esa es la última.
Me refiero en el sitio en el artículo - tal vez hay una antigua clavado en las actualizaciones. Tomo el archivo de la última actualización, descargado desde el sitio desde la parte inferior del artículo de la cremallera.
Aquí, hice las correcciones como escribí anteriormente:
Capturas de pantalla de la plataforma de negociación MetaTrader
EURUSD, W1, 2016.12.12
MetaQuotes Software Corp., MetaTrader 5, Demo