Discusión sobre el artículo "Aplicación de los contenedores para componer la interfaz gráfica: clase CBox" - página 2

 

Este código no compila. Compilación 1702.

'pipvaluecalculator.mq5' pipvaluecalculator.mq5 1 1

...

'm_client_area' - error de acceso a miembro privado PipValueCalculator.mqh 118 60

m_client_area' - private member error de acceso PipValueCalculator.mqh 118 91

m_client_area' - private member error de acceso PipValueCalculator.mqh 129 72

m_client_area' - private member error de acceso PipValueCalculator.mqh 148 75

m_client_area' - private member error de acceso PipValueCalculator.mqh 168 77

m_client_area' - miembro privado, error de acceso PipValueCalculator.mqh 187 72

6 error(es), 0 advertencia(s) 7 1

Como nota al margen, a menos que me lo haya perdido, deberías especificar dónde colocar los archivos. Tenemos que probar y mirar el código para saber que necesitamos crear una carpeta "Layouts" en Include y colocar el archivo Box.mqh dentro de ella.


 

Estoy usando la build 1755.

Ahora el miembro m_client_area en la clase CDialog en Controls\Dialog.mqh es privado y se han creado nuevos métodos para obtener las propiedades Width y Height.

Para mí funciona después de los siguientes cambios.
a) reemplazado CDialog::m_client_area.Width() por CDialog::ClientAreaWidth()
b) reemplazado CDialog::m_client_area.Height() por CDialog::ClientAreaHeight()
 
Alain Verleyen :

Kode ini tidak dikompilasi Bangun 1702

pipvaluecalculator.mq5' pipvaluecalculator.mq5 1 1

...

'm_client_area' - campo de entrada PipValueCalculator.mqh 118 60

'm_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 118 91

'm_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 129 72

'm_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 148 75

'm_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 168 77

'm_client_area' - kesalahan akses anggota pribadi PipValueCalculator.mqh 187 72

6 error (s), 0 warning (s) 7 1

En caso de error, cuando el usuario se encuentre en el modo de espera, se le pedirá que introduzca el archivo que desee. En caso de emergencia, cuando el usuario se encuentre en el modo de espera, se le pedirá que rellene el siguiente archivo. Por favor, seleccione la carpeta "Layouts" de Include y añada el archivo Box.mqh a la lista.Por favor, seleccione la carpeta "Layouts" de Include y añada el archivo Box.mqh a la lista.


 

He encontrado un problema con este útil complemento.

Pido consejo a los que saben de controles estándar.

Dado que este complemento con paneles utiliza las clases estándar CWnd, CWndClient, asumo que el conocimiento de su estructura interna puede ser suficiente para entender dónde está el "perro en la pelea".

La esencia del problema. Tomamos el programa Controls2.mq5 del artículo (para la compilación necesitamos también ControlsDialog2.mqh y Box.mqh), lo compilamos, lo ejecutamos.

Casi todo funciona bien excepto el "datapicker". Sólo se abre y se cierra, pero en estado abierto no reacciona a los clicks, saltándose los eventos a los controles subyacentes.

La demo original similar de MQ (Experts/Examples/Controls.mq5) funciona con el "datapicker" normalmente.

 
Stanislav Korotky:

Casi todo funciona bien excepto el "datapicker". Sólo se abre y se cierra, pero en el estado abierto no reacciona a las pulsaciones, saltándose los eventos a los controles subyacentes.

La demo original similar de MQ (Experts/Examples/Controls.mq5) funciona con el "datapicker" normalmente.

Se elimina la pregunta. En CDatePicker no hay llamada BringToTop cuando se expande el desplegable, como se hace en CComboBox, por ejemplo. En el ejemplo estándar, el CDatePicker funciona debido a que su inicialización se movió (intencionada o accidentalmente) después de la creación del "leafbox", que está topológicamente por debajo de él. Y los controles en CWndContainer::OnMouseEvent se saltan del último añadido al primero.

Para arreglarlo normalmente, habría que anular CDatePicker::ListShow, pero no es virtual. Tenemos que redefinir CDatePicker::OnClickButton y añadir BringToTop allí. Sin embargo, no podemos hacerlo correctamente como con cualquier método virtual de la biblioteca estándar, porque todas las variables miembro se declaran privadas. En particular, es imposible escribir

bool MyDatePicker::OnClickButton(void) // override
{
    return ((m_drop.Pressed()) ? BringToTop() && ListShow() : ListHide());
}

porque m_drop no está disponible. Tenemos que llamar a BringToTop tanto al abrir como al colapsar.

#include <Controls/DatePicker.mqh>

class CDatePickerFixed: public CDatePicker
{
  protected:
    virtual bool OnClickButton() override
    {
      BringToTop();
      return CDatePicker::OnClickButton();
    }
};
 

y hay algunos errores:


 
Gracias por compartir