los métodos X(const int x) e Y(const int y) no afectan en absoluto a la posición de la tabla en el formulario, siempre se encuentra en la esquina superior izquierda
Las coordenadas relativas se establecen al crear elementos en una clase personalizada:
//--- Crear un controlif(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
return(false);
Anatoli Kazharski: El primer parámetro es el número del formulario al que se adjunta el elemento. Quizás esté añadiendo la misma tabla a la lista común de elementos.
¿qué quiere decir en la lista común? ¿dónde está separado?
aquí está el método de creación en la clase form:
¡/*!
\brief Crear objeto
\param const string a_name - nombre del programa
\param const uint a_pause - pausa para la actualización de la línea de estado
\return true si tiene éxito, en caso contrario false
*/bool CMainForm::Create(conststring a_name,constuint a_pause) {
m_counter500.SetParameters(16, a_pause);
m_counter16.SetParameters(16, 16);
if(!CreateForm(m_form, a_name))
returnfalse;
if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
returnfalse;
if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
returnfalse;
if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
returnfalse;
//--- añade el objeto tabla al array común de grupos de objetos
CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());
m_chart.Redraw();
//---returntrue;
}
El método GetTbl devuelve un puntero a CCanvasTable m_table
El método GetTbl devuelve un puntero a CCanvasTable m_table
//--- Crear un controlif(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
return(false);
//--- Añade el objeto al array común de grupos de objetos
CWndContainer::AddToElementsArray(0,m_canvas_table2);
¡/*!
\brief Crear objeto
\param const string a_name - nombre del programa
\param const uint a_pause - pausa para la actualización de la línea de estado
\return true si tiene éxito, en caso contrario false
*/bool CMainForm::Create(conststring a_name,constuint a_pause) {
m_counter500.SetParameters(16, a_pause);
m_counter16.SetParameters(16, 16);
if(!CreateForm(m_form, a_name))
returnfalse;
if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
returnfalse;
if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
returnfalse;
//--- añade el objeto tabla al array común de grupos de objetosCWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
returnfalse;
//--- añade el objeto tabla al array común de grupos de objetosCWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());
m_chart.Redraw();
//---returntrue;
}
y todo funcionó, resulta que inmediatamente después de crear un objeto debe ser colocado en un contenedor y sólo entonces crear otro objeto ))
No, tengo tablas en otras clases, uso programación modular )) por lo que es más conveniente gestionar la funcionalidad - clase de formulario principal, clase de tabla 1, clase de tabla 2, etc. al final todos los elementos se ensamblan en la clase de formulario principal como objetos listos separados.
No, tengo tablas en otras clases, uso programación modular )) por lo que es más conveniente gestionar la funcionalidad - clase de formulario principal, clase de tabla 1, clase de tabla 2, etc. al final todos los elementos se recogen en la clase de formulario principal como objetos separados listos.
De acuerdo. Muchos usuarios de esta librería lo hacen, pero yo no lo consigo. )
Anatoli Kazharski: Estoy de acuerdo. Muchos usuarios de esta biblioteca lo hacen, pero yo no lo consigo. )
Por cierto, hay un problema:
CWndEvents::CWndEvents(void) : m_chart_id(0),
m_subwin(0),
m_active_window_index(0),
m_indicator_shortname(""),
m_program_name(PROGRAM_NAME),
m_subwindow_handle(INVALID_HANDLE),
m_subwindow_shortname(""),
m_subwindows_total(1)
{
//--- Iniciar el temporizadorif(!::MQLInfoInteger(MQL_TESTER))
::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- Obtener el ID del gráfico actual
m_chart.Attach();
//--- Activar el seguimiento de eventos del ratón
m_chart.EventMouseMove(true);
//--- Desactivar la invocación de la línea de comandos para las teclas Espacio y Enter
m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//--- Determinar el número de subventana
DetermineSubwindow();
}
La línea seleccionada no permite trabajar en el tester. Es mejor hacer una elección como esta:
enum ENUM_GRAPHICS {
GRAPHICS_NO = 0, // no necesita gráficos
GRAPHICS_REAL = 1, // gráficos para operar de verdad
GRAPHICS_TEST = 2// gráficos para pruebas
};
/*!
Obtiene una indicación del programa en ejecución
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+/*!
Signo de visualización de gráficos
\return signo de operación del programa de la enumeración ENUM_GRAPHICS
*/
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
m_graphics = GRAPHICS_NO;
elseif(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
m_graphics = GRAPHICS_REAL;
elseif(MQLInfoInteger(MQL_VISUAL_MODE))
m_graphics = GRAPHICS_TEST;
//---return m_graphics;
}
y en el programa hacer una selección como esta:
//--- configuración para OnTimer()uint _pause = 0;
if(in_param.graphics == GRAPHICS_REAL)
_pause = 500; // 500 mselseif(in_param.graphics == GRAPHICS_TEST)
_pause = 60000; // 1 minutoif(!main_form.Create(name_mts, _pause)) {
::Print(__FUNCTION__,"> ¡Fallo al crear una interfaz gráfica de usuario!");
returnINIT_FAILED;
}
o simplemente utilizar banderas para hacer una selección
los métodos X(const int x) e Y(const int y) no afectan en absoluto a la posición de la tabla en el formulario, siempre se encuentra en la esquina superior izquierda
Las coordenadas relativas se establecen al crear elementos en una clase personalizada:
//---
¿Cuál es la tarea?
Las coordenadas relativas se establecen cuando los elementos se crean en una clase personalizada:
//---
¿Cual es la tarea?
colocar dos tablas horizontalmente, x_gap,y_gap cambia la ubicación del desplazamiento horizontal y listo ((.
PD. entonces, parece que se ha desplazado, pero por alguna razón se desplazan dos tablas ))
y en el método:
CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());si hay dos tablas, ¿el primer parámetro es siempre 0 o es un número de serie de objetos idénticos?
Por alguna razón la primera tabla se desplaza persistentemente debajo de la segunda tabla.
...
PS. por lo que, parece que se han desplazado, pero por alguna razón dos tablas se han desplazado ))
y en el método
CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());si hay dos tablas, ¿el primer parámetro es siempre 0 o es un número de serie de objetos idénticos?
El primer parámetro es el número del formulario al que se adjunta el elemento. Quizás esté añadiendo la misma tabla a la lista común de elementos.
¿qué quiere decir en la lista común? ¿dónde está separado?
aquí está el método de creación en la clase form:
El método GetTbl devuelve un puntero a CCanvasTable m_table
...
¿Es este el resultado que quieres?
//---
He adjuntado un ejemplo en el archivo:
aquí está el método create en la clase form:
El método GetTbl devuelve un puntero a CCanvasTable m_table
¿Quieres un resultado como este?
//---
Adjunto un ejemplo en el archivo:
Lo hice así
y todo funcionó, resulta que inmediatamente después de crear un objeto debe ser colocado en un contenedor y sólo entonces crear otro objeto ))
No, tengo tablas en otras clases, uso programación modular )) por lo que es más conveniente gestionar la funcionalidad - clase de formulario principal, clase de tabla 1, clase de tabla 2, etc. al final todos los elementos se ensamblan en la clase de formulario principal como objetos listos separados.
No, tengo tablas en otras clases, uso programación modular )) por lo que es más conveniente gestionar la funcionalidad - clase de formulario principal, clase de tabla 1, clase de tabla 2, etc. al final todos los elementos se recogen en la clase de formulario principal como objetos separados listos.
Estoy de acuerdo. Muchos usuarios de esta biblioteca lo hacen, pero yo no lo consigo. )
Por cierto, hay un problema:
La línea seleccionada no permite trabajar en el tester. Es mejor hacer una elección como esta:
y en el programa hacer una selección como esta:
o simplemente utilizar banderas para hacer una selección