Mi enfoque. El núcleo es el motor. - página 60

 
Igor Makanu:

...

Pero si se conoce el funcionamiento del modelo de eventos en Windows y se tiene experiencia en trabajar con compiladores con diseñadores de formularios, entonces todo es igual en todas partes

ZS: es la tercera vez que veo a Sharp, pero he tenido una gran experiencia con Delphi, no veo la diferencia en absoluto, todo funciona igual, lo que no funciona, se googlea la primera vez

No recuerdo cómo funciona el modelo de eventos de Windows. Y han tenido experiencia con compiladores y diseñadores durante mucho tiempo.

Necesito conectar un formulario creado a una aplicación MT y resolver el problema. Dijiste que era fácil.

 
Georgiy Merts:

No mostrándolo, sino describiendo sus principios con toda claridad. Eso es lo que objetan, eso es lo que dicen: "la carretera está mal".

Además, está "mal" no para el autor, sino para los que se oponen. Tienen cerebros de pollo y no pueden recordar dónde y qué objetos crearon, dónde y quién se refiere a ellos, qué significa cada celda de la matriz, desde dónde se pueden cambiar y dónde no... Es comprensible que los opositores estén indignados. En lugar de entrenar su memoria, para poder memorizar fácilmente un par de miles de objetos y referencias en el programa, la gente tonta recorta sus propios derechos de acceso, define algunas distinciones, algunas interfaces, algunas funciones polimórficas... Se torturan, como bajo el régimen zarista, eh...

Deshazte de las tonterías sobre la frescura de la memoria. A veces se observa que el hilo de este diálogo del foro no se sigue hasta la profundidad de dos páginas. Además hay demasiada negación, para que la memoria funcione tan maravillosamente, como intentan decirnos.

 
Dmitry Fedoseev:

Ayúdame a resolver un problema.

  1. Necesitamos enviar el evento de pulsar botones y casillas a MT5.
  2. Necesitamos cambiar mediante programación el estado de una casilla de verificación o de un botón en un formulario.
¿Cómo hacerlo?
 

El formulario de Windows está ahí. Se pone en marcha y funciona. Los botones y las casillas de verificación se pueden pulsar.

Ahora necesito una DLL para conectarme a MT5. ¿Quién sabe cómo hacerlo?

 
Реter Konow:

Ayúdame a resolver un problema.

  1. Necesitamos enviar el evento de pulsar botones y casillas a MT5.
  2. Necesitamos cambiar mediante programación el estado de una casilla de verificación o de un botón en un formulario.
¿Cómo hacerlo?

2. Ayer Igor mostró un ejemplo. Muestra cómo en el Asesor Experto se puede llamar al método de una clase, contenida en la dll importada. Es decir, necesitas escribir una función (método) en c# que cambie el estado de la casilla de verificación. Como cambiar la propiedad de la casilla de verificación, no recuerdo el nombre del método, es fácil navegar por la lista desplegable, hay que introducir el nombre de la casilla, pulsar un punto...

1. No lo sé. Probablemente no. Tienes que llamar a una función dll desde el temporizador y mirar el estado de las casillas de verificación. Y en cuanto a los eventos como la pulsación de botones, probablemente podríamos crear un array y almacenar los eventos en él. Pero no es difícil, teniendo en cuenta la ventaja de trabajar con controles de forma visual.

 
Реter Konow:

Instalado C#. Abrir un proyecto. Hice un formulario y le añadí dos botones y tres casillas de verificación.

Aquí está el código en el editor:

Pregunta: ¿Por qué hay una función para un botón y dónde están las funciones para el segundo botón y las casillas de verificación?

Encontré este código:

¿Cómo utilizarlo para la interconexión con MT5?

Es necesario demostrar que el segundo botón es necesario - hacer un doble clic en él, y entonces el código se abrirá y la función se añadirá. El proyecto compilará con un error si luego se elimina el botón del formulario, el código debe ser eliminado manualmente de algún archivo, pero no el que escribiste.

 
Dmitry Fedoseev:

2. Ayer, Igor mostró un ejemplo. El ejemplo muestra cómo un Asesor Experto puede llamar a un método de una clase en la dll importada. Es decir, necesitas escribir una función (método) en c# que cambie el estado de la casilla de verificación. Como cambiar la propiedad de la casilla de verificación, no recuerdo el nombre del método, es fácil navegar por la lista desplegable, hay que introducir el nombre de la casilla, pulsar un punto...

1. No lo sé. Probablemente no. Tienes que llamar a una función dll desde el temporizador y observar el estado de las casillas de verificación. Y en cuanto a los eventos como la pulsación de botones, probablemente podríamos crear un array y almacenar los eventos en él. Pero no es difícil, teniendo en cuenta la ventaja del manejo visual de los controles.

Bien.

Por lo tanto, tenemos que hacerlo:

  1. Crear una DLL.
  2. Conéctalo a la aplicación de la viuda con formulario.
  3. Escribe métodos para traducir los eventos de pulsar los botones y marcar las casillas en la dll.
  4. Escribir métodos para cambiar el estado de los botones y casillas de verificación en la aplicación de la viuda.
  5. Crear memoria compartida en la dll. Para que al acceder desde MT5 se ponga la bandera de cambio de estado de los botones y casillas de verificación. A continuación, la aplicación de Windows accede a la memoria compartida, lee las banderas y las utiliza para conocer el estado de uno u otro elemento del formulario a modificar.
  6. Escribir una referencia cíclica a la DLL desde el temporizador en MT5 para leer las banderas de las llamadas a funciones o introducir texto en los campos.

    ¿Y si hay cientos de elementos?

    ¿Cómo organizar la memoria compartida?

    ¿Y si es necesario cambiar no sólo el estado de pulsación/desconexión de los elementos de un formulario, sino también su color (por ejemplo, para los botones)?

    ¿Qué pasa si necesita cambiar el texto de los campos de entrada en un formulario de forma programada desde MT5?


     
    Dmitry Fedoseev:

    En cuanto a los eventos como la pulsación de botones, probablemente sea mejor hacer un array y almacenar los eventos en él. Pero no es difícil, teniendo en cuenta la ventaja del trabajo visual con los controles.

    Antes lo hacía de forma más sencilla:

    1. El usuario presionó el botón en el formulario - el manejador de eventos OnClick() fue presionado y Button1.Disable fue creado;

    2. entonces depende de MT5 cómo se organizará el intercambio allí, me gusta que los clics de los botones sean interrogados en OnTick() - no es necesario hacer nada hasta que se alcance el tick de todos modos, se puede establecer un valor neutral de unos 300 ms en el temporizador - ni un usuario notará un encrespamiento, ni MT5 se ralentizará


    Pero el punto de mi ejemplo es que la visualización del panel en MT5 es ahora posible en 2 clics, los manejadores de botones funcionan en un .dll, y parte del script de la interfaz puede ser transferido a un formulario, las mismas tablas, manejo de datos... todo

    lo más valioso es el ahorro de tiempo en el desarrollo de renderizados, con la ayuda del diseñador de formularios todo se hace en horas ;)


    Rehtag Konow:

    Crear una memoria compartida en la DLL. Por lo tanto, al acceder desde MT5, la bandera de cambio de estado de los botones y casillas de verificación se establecerá. La aplicación accede a la memoria compartida, lee las banderas y sabe que el estado de uno u otro elemento del formulario debe ser cambiado.

    Escribir una referencia cíclica a la DLL desde el temporizador en MT5 para leer las banderas de las llamadas a funciones o introducir texto en los campos.

      ¿Y si hay cientos de elementos?

      ¿Cómo organizar la memoria compartida?

      Estás yendo en la dirección equivocada otra vez, ¡sal de los 2000 peludos! .... aunque de alguna manera creo que los 2000 no son el límite para ti ))))

      Sin ánimo de ofender, espero.

       
      Igor Makanu:

      Antes lo hacía de forma más sencilla:

      1. El usuario presionó el botón en el formulario - inmediatamente entró en el manejador OnClick(), hizo Button1.Disable allí;

      2. entonces depende de MT5 cómo se organizará el intercambio; me gusta que los clics de los botones se interroguen en OnTick() - de todos modos, hasta que no se alcance un tick, se puede establecer un valor neutral de unos 300 ms en el temporizador - ni un usuario notará un encrespamiento, ni MT5 se ralentizará


      Pero el punto de mi ejemplo es que la visualización del panel en MT5 es ahora posible en 2 clics, los manejadores de botones funcionan en un .dll, y parte del script de la interfaz puede ser transferido a un formulario, las mismas tablas, manejo de datos... todo

      lo mejor es el ahorro de tiempo en el renderizado, con el Forms Designer todo se hace en horas ;)


      Vuelves a ir en la dirección equivocada, ¡sal de los melenudos 2000! .... aunque creo que los 2000 no son el límite para ti ))))

      Espero que no haya resentimientos.

      Sin ánimo de ofender, es una pena que no esté en su punto.

      Estás tomando el ejemplo más cercano y extrapolando a partir de él, creyendo que la complejidad no aumentará. Esto es un error.

      Incluso el ejemplo más sencillo que has puesto es erróneo. Porque además de la forma creada, también hay que crear una DLL. Y luego crear una memoria TOTAL dentro de la DLL.

      A medida que el número de elementos del formulario crece y la funcionalidad del programa en MT5 se vuelve más compleja, esta interacción se vuelve MUY ocupada y complicada.

      He comprobado todo esto en la práctica.

       
      Реter Konow:

      DE ACUERDO.

      Así que es necesario:

      1. Crear una DLL.
      2. Conecte la DLL a la aplicación de Windows con un formulario.
      3. Escribir métodos que traduzcan los eventos de pulsar botones y casillas de verificación en dll.
      4. Escribir métodos para cambiar el estado de los botones y casillas de verificación en la aplicación de la viuda.
      5. Crear memoria compartida en la dll. Para que al acceder desde MT5 se ponga la bandera de cambio de estado de los botones y casillas de verificación. A continuación, la aplicación de Windows accede a la memoria compartida, lee las banderas y las utiliza para conocer el estado de uno u otro elemento del formulario que debe cambiar.
      6. Escribir una referencia cíclica a la DLL desde el temporizador en MT5 para leer las banderas de las llamadas a funciones o introducir texto en los campos.

        ¿Y si hay cientos de elementos?

        ¿Cómo organizar la memoria compartida?

        ¿Y si es necesario cambiar no sólo el estado de pulsación/desconexión de los elementos de un formulario, sino también su color (por ejemplo, para los botones)?

        Qué pasa si necesitamos cambiar el texto de los campos de entrada de un formulario mediante programación de МТ5?


        Si los eventos se gestionan correctamente, el número de controles no es un problema. En la dll, podemos crear un array o dos arrays, uno para el nombre del objeto y el segundo para el tipo de evento. En la dll escriba una función con dos parámetros, también nombre y tipo de evento. Desde cada manejador de eventos deseado, llame a esta función, para que los eventos se coloquen en matrices. Otro método - para realizar un seguimiento de los eventos de EA temporizador, tan conveniente o como resulta - las mismas matrices por referencia o lo que sea y también una variable - con el número de eventos en la matriz. Después de la llamada a ese método, las matrices se borran.

        O tal vez sea más fácil crear un array con una matriz; hay un objeto de evento en c#, así que puedo convertirlos en un array. Además, tal vez sea posible trastear de alguna manera y no llamar a una función desde cada manejador de eventos por sí mismo. Pero no importa; en cualquier caso es una nimiedad comparada con las capacidades de la interfaz y toda la potencia de c#.

        Razón de la queja: