Il mio approccio. Il nucleo è il motore. - pagina 60

 
Igor Makanu:

...

Ma se sapete come funziona il modello degli eventi in Windows e avete avuto esperienza di lavoro con compilatori con progettisti di moduli, allora tutto è lo stesso ovunque

ZS: è la terza volta che vedo Sharp, ma ho avuto una grande esperienza con Delphi, non vedo affatto la differenza, tutto funziona allo stesso modo, ciò che non funziona, è googlato la prima volta

Non ricordo come funziona il modello di eventi di Windows. E hanno avuto esperienza con i compilatori e i progettisti per molto tempo.

Ho bisogno di collegare un modulo creato a un'applicazione MT e risolvere il problema. Hai detto che era facile.

 
Georgiy Merts:

Non mostrandolo, ma descrivendo i suoi principi molto chiaramente. Questo è ciò a cui si oppongono, questo è ciò che dicono: "la strada è sbagliata".

Inoltre, è "sbagliato" non per l'autore, ma per coloro che si oppongono. Hanno cervelli simili a quelli dei polli e non possono ricordare dove e quali oggetti hanno creato, dove e chi si riferisce ad essi, cosa significa ogni cella della matrice, da dove possono cambiare e dove no... È comprensibile che gli oppositori siano indignati. Invece di allenare la loro memoria, in modo che potessero facilmente memorizzare un paio di migliaia di oggetti e riferimenti nel programma, la gente sciocca taglia i propri diritti di accesso, definisce alcune distinzioni, alcune interfacce, alcune funzioni polimorfiche... Si torturano, come sotto il regime zarista, eh...

Scrollatevi di dosso le sciocchezze sulla freddezza della memoria. A volte si osserva che il filo del dialogo di questo forum non viene tracciato fino alla profondità di due pagine. Inoltre c'è troppa negazione, perché la memoria funzioni così meravigliosamente, come cercano di dirci.

 
Dmitry Fedoseev:

Aiutami a risolvere un problema.

  1. Abbiamo bisogno di inviare l'evento della pressione dei pulsanti e delle caselle di controllo a MT5.
  2. Abbiamo bisogno di cambiare programmaticamente lo stato di una casella di controllo o di un pulsante in un modulo.
Come fare?
 

Il modulo di Windows è lì. Si avvia e funziona. I pulsanti e le caselle di controllo sono cliccabili.

Ora serve una DLL per connettersi a MT5. Chi sa come farlo?

 
Реter Konow:

Aiutami a risolvere un problema.

  1. Abbiamo bisogno di inviare l'evento della pressione dei pulsanti e delle caselle di controllo a MT5.
  2. Abbiamo bisogno di cambiare programmaticamente lo stato di una casella di controllo o di un pulsante in un modulo.
Come fare?

2. Ieri Igor ha mostrato un esempio. Mostra come in Expert Advisor si può chiamare il metodo di una classe, contenuta nella dll importata. Cioè, dovete scrivere una funzione (metodo) in c# che cambi lo stato della casella di controllo. Come cambiare la proprietà della casella di controllo, non ricordo il nome del metodo, è facile navigare attraverso l'elenco a discesa, devi inserire il nome della casella di controllo, premere un punto...

1. Non lo so. Probabilmente no. Dovete chiamare una funzione dll dal timer e guardare lo stato delle caselle di controllo. E per quanto riguarda gli eventi come la pressione dei pulsanti, potremmo probabilmente creare un array e memorizzare gli eventi in esso. Ma non è difficile, considerando il vantaggio di lavorare con i controlli visivamente.

 
Реter Konow:

Installato C#. Aperto un progetto. Ho creato un modulo e vi ho aggiunto due pulsanti e tre caselle di controllo.

Ecco il codice nell'editor:

Domanda: perché c'è una funzione per un pulsante e dove sono le funzioni per il secondo pulsante e le caselle di controllo?

Ho trovato questo codice:

Come usarlo per interfacciarsi con MT5?

Dovete dimostrare che il secondo pulsante è necessario - fate un doppio clic su di esso, e poi il codice si aprirà e la funzione sarà aggiunta. Il progetto compilerà con un errore se il pulsante viene poi rimosso dal modulo, il codice dovrebbe essere eliminato manualmente da qualche file, ma non quello che hai scritto tu.

 
Dmitry Fedoseev:

2. Ieri Igor ha mostrato un esempio. L'esempio mostra come un Expert Advisor può chiamare un metodo di una classe nella dll importata. Cioè, dovete scrivere una funzione (metodo) in c# che cambi lo stato della casella di controllo. Come cambiare la proprietà della casella di controllo, non ricordo il nome del metodo, è facile navigare attraverso l'elenco a discesa, devi inserire il nome della casella di controllo, premere un punto...

1. Non lo so. Probabilmente no. Dovete chiamare una funzione dll dal timer e guardare lo stato delle caselle di controllo. E per quanto riguarda gli eventi come la pressione dei pulsanti, suggerisco di fare un array e impilare gli eventi in esso. Ma non è difficile, considerando il vantaggio della gestione visiva dei controlli.

Ok.

Quindi, abbiamo bisogno di farlo:

  1. Creare una DLL.
  2. Collegatelo all'applicazione vedova con modulo.
  3. Scrivere metodi per tradurre gli eventi della pressione dei pulsanti e del controllo delle caselle nella dll.
  4. Scrivere metodi che cambiano lo stato di pulsanti e caselle di controllo nell'applicazione widow.
  5. Crea la memoria condivisa nella dll. In modo che quando si accede da MT5 il flag di cambiamento di stato per i pulsanti e le caselle di controllo sia impostato. Poi l'applicazione Windows accede alla memoria condivisa, legge i flag e li usa per conoscere lo stato di uno o un altro elemento del modulo da cambiare.
  6. Scrivere il riferimento ciclico alla DLL dal timer in MT5 per leggere i flag delle chiamate di funzione o inserire il testo nei campi.

    E se ci sono centinaia di elementi?

    Come organizzare la memoria condivisa?

    Cosa succede se è necessario cambiare non solo lo stato premuto/rilasciato degli elementi in un modulo, ma anche il loro colore (per esempio, per i pulsanti)?

    Cosa succede se avete bisogno di cambiare il testo nei campi di input in un modulo programmaticamente da MT5?


     
    Dmitry Fedoseev:

    Per quanto riguarda gli eventi come la pressione dei pulsanti, è probabilmente meglio fare un array e memorizzare gli eventi in esso. Ma non è difficile, considerando il vantaggio del lavoro visivo con i controlli.

    Lo facevo in un modo più semplice:

    1. L'utente ha premuto il pulsante sul modulo - il gestore di eventi OnClick() è stato cliccato e Button1.Disable è stato creato;

    2. poi sta a MT5 come lo scambio sarà organizzato lì, mi piace che i clic dei pulsanti siano interrogati in OnTick() - non farete nulla finché non c'è un tick; potete impostare un valore neutro di circa 300 ms nel timer - né un utente noterà un frizz, né MT5 rallenterà


    Ma il punto del mio esempio è che la visualizzazione del pannello in MT5 è ora possibile in 2 clic, i gestori dei pulsanti lavorano in una .dll, e parte dello script dell'interfaccia può essere trasferito in un modulo, le stesse tabelle, la gestione dei dati... tutto

    La cosa migliore è che si risparmia tempo nel rendering, con il Forms Designer tutto è fatto in poche ore ;)


    Rehtag Konow:

    Creare una memoria condivisa nella DLL. Così, quando si accede da MT5, il flag di cambiamento di stato dei pulsanti e delle caselle di controllo sarà impostato. L'applicazione accede alla memoria condivisa, legge i flag e sa che lo stato di uno o un altro elemento del modulo deve essere cambiato.

    Scrivere il riferimento ciclico alla DLL dal timer in MT5 per leggere i flag delle chiamate di funzione o inserire il testo nei campi.

      E se ci sono centinaia di elementi?

      Come organizzare la memoria condivisa?

      Stai andando di nuovo nella direzione sbagliata, esci dagli arruffati anni 2000! .... anche se in qualche modo penso che gli anni 2000 non siano il limite per te ))))

      senza offesa, spero?

       
      Igor Makanu:

      Lo facevo in un modo più semplice:

      1. L'utente ha premuto il pulsante sul modulo - è entrato immediatamente nel gestore OnClick(), ha reso Button1.Disable lì;

      2. poi dipende da MT5 come sarà organizzato lo scambio; mi piace che i clic dei pulsanti siano interrogati in OnTick() - comunque, finché non si raggiunge un tick, si può impostare un valore neutro di circa 300 ms nel timer - né un utente noterà un frizz, né MT5 rallenterà


      Ma il punto del mio esempio è che la visualizzazione del pannello in MT5 è ora possibile in 2 clic, i gestori dei pulsanti lavorano in una .dll, e parte dello script dell'interfaccia può essere trasferito in un modulo, le stesse tabelle, la gestione dei dati... tutto

      la parte migliore è il risparmio di tempo nel rendering, con il Forms Designer tutto è fatto in ore ;)


      Stai andando di nuovo nella direzione sbagliata, esci dagli arruffati anni 2000! .... anche se penso che gli anni 2000 non siano il limite per te ))))

      Nessun rancore, spero?

      Senza offesa, ma è un peccato che non sia a punto.

      Stai prendendo l'esempio più vicino e lo estrapoli, credendo che la complessità non aumenterà. Questo è un errore.

      Anche l'esempio più semplice che hai fatto è sbagliato. Perché oltre al modulo creato, è necessario creare anche una DLL. E poi dovete creare una memoria TOTALE all'interno della DLL.

      Man mano che il numero di elementi del modulo cresce e la funzionalità del programma su MT5 diventa più complessa, questa interazione diventa MOLTO impegnata e complicata.

      Ho testato tutto questo nella pratica.

       
      Реter Konow:

      OK.

      Quindi è necessario:

      1. Creare una DLL.
      2. Collegare la DLL all'applicazione Windows con un modulo.
      3. Scrivere metodi che traducono gli eventi di pressione dei pulsanti e delle caselle di controllo in dll.
      4. Scrivere metodi per cambiare lo stato di pulsanti e caselle di controllo nell'applicazione widow.
      5. Crea la memoria condivisa nella dll. In modo che quando si accede da MT5 il flag di cambiamento di stato per i pulsanti e le caselle di controllo sia impostato. Poi l'applicazione Windows accede alla memoria condivisa, legge i flag e li usa per conoscere lo stato di uno o un altro elemento del modulo da cambiare.
      6. Scrivere il riferimento ciclico alla DLL dal timer in MT5 per leggere i flag delle chiamate di funzione o inserire il testo nei campi.

        E se ci sono centinaia di elementi?

        Come organizzare la memoria condivisa?

        Cosa succede se è necessario cambiare non solo lo stato premuto/rilasciato degli elementi in un modulo, ma anche il loro colore (per esempio, per i pulsanti)?

        Cosa succede se abbiamo bisogno di cambiare il testo nei campi di inserimento di un modulo programmaticamente da МТ5?


        Se gli eventi sono gestiti correttamente, allora il numero di controlli non è un problema. In dll, possiamo creare un array o due array, uno per il nome dell'oggetto e il secondo per il tipo di evento. In dll scrivete una funzione con due parametri, anche nome e tipo dell'evento. Da ogni gestore di eventi desiderato, chiamate questa funzione, in modo che gli eventi siano messi in array. Un altro metodo - per tracciare gli eventi da EA timer, come conveniente o come risulta - gli stessi array per riferimento o qualsiasi altra cosa e anche una variabile - con il numero di eventi nell'array. Dopo la chiamata di questo metodo, gli array vengono cancellati.

        O forse è più facile gestire un array; c'è un oggetto-evento in c#, quindi posso trasformarli in un array. Inoltre, forse è possibile in qualche modo smanettare e non chiamare una funzione da ogni gestore di eventi da solo. Ma non importa; in ogni caso è un'inezia rispetto alle capacità di interfaccia e a tutta la potenza di c#.

        Motivazione: