Minha abordagem. O núcleo é o motor. - página 60

 
Igor Makanu:

...

mas se você sabe como funciona o modelo do evento no Windows e tem experiência de trabalhar com compiladores com designers de formulários, então tudo é o mesmo em todos os lugares

ZS: é a terceira vez que vejo Sharp, mas tive uma grande experiência com Delphi, não vejo a diferença, tudo funciona da mesma maneira, o que não funciona, é pesquisado no Google da primeira vez.

Não me lembro como funciona o modelo do evento Windows. E têm experiência com compiladores e designers há muito tempo.

Eu preciso conectar um formulário criado a uma aplicação MT e resolver o problema. Você disse que era fácil.

 
Georgiy Merts:

Não mostrando-o, mas descrevendo seus princípios de forma bem clara. É a isso que eles se opõem, é o que eles dizem: "a estrada está errada".

Além disso, é "errado", não para o autor, mas para aqueles que se opõem. Eles têm cérebros de galinha e não conseguem lembrar onde e que objetos criaram, onde e quem se refere a eles, o que cada célula da matriz significa, de onde podem ser mudados e onde não podem... É compreensível que os oponentes estejam indignados. Em vez de treinar sua memória, para que pudessem facilmente memorizar alguns milhares de objetos e referências no programa, pessoas tolas cortam seus próprios direitos de acesso, definem algumas distinções, algumas interfaces, algumas funções polimórficas... Eles se torturam, como sob o regime czarista, eh...

Abandone o absurdo sobre a frieza da memória. Às vezes se observa que o fio deste diálogo do fórum não é rastreado até a profundidade de duas páginas. Além disso, há muita negação, para que a memória funcione tão maravilhosamente, como eles tentam nos dizer.

 
Dmitry Fedoseev:

Ajude-me a resolver um problema.

  1. Precisamos enviar o evento de apertar botões e caixas de seleção para o MT5.
  2. Precisamos programar a mudança do estado de uma caixa de seleção ou botão em um formulário.
Como fazer isso?
 

O formulário Windows está lá. Ele começa e funciona. Botões e caixas de seleção podem ser clicados.

Agora é preciso uma DLL para se conectar ao MT5. Quem sabe como fazer isso?

 
Реter Konow:

Ajude-me a resolver um problema.

  1. Precisamos enviar o evento de apertar botões e caixas de seleção para o MT5.
  2. Precisamos programar a mudança do estado de uma caixa de seleção ou botão em um formulário.
Como fazer isso?

2. Ontem Igor mostrou um exemplo. Ele mostra como no Expert Advisor você pode chamar o método de uma classe, contido na dll importada. Ou seja, você precisa escrever uma função (método) em c# que muda o estado da caixa de seleção. Como mudar a propriedade da caixa de seleção, não me lembro do nome do método, é fácil navegar pela lista suspensa, você tem que digitar o nome da caixa de seleção, pressionar um ponto...

1. Eu não sei. Provavelmente não. Você tem que chamar uma função dll a partir do temporizador e olhar o estado das caixas de seleção. E, quanto a eventos como o aperto de botões, provavelmente poderíamos criar uma matriz e armazenar eventos nela. Mas não é difícil, considerando a vantagem de trabalhar com controles visualmente.

 
Реter Konow:

C#. instalado. Abriu um projeto. Fez um formulário e lhe acrescentou dois botões e três caixas de seleção.

Aqui está o código no editor:

Pergunta: Por que existe uma função para um botão e onde estão as funções para o segundo botão e as caixas de seleção?

Encontrei este código:

Como utilizá-lo para fazer a interface com o MT5?

Você precisa demonstrar que o segundo botão é necessário - faça um duplo clique sobre ele, e então o código será aberto e a função será adicionada. O projeto será compilado com um erro se o botão for então removido do formulário, o código deve ser apagado manualmente de algum arquivo, mas não aquele que você escreveu.

 
Dmitry Fedoseev:

2. Ontem, Igor mostrou um exemplo. O exemplo mostra como um Expert Advisor pode chamar um método de uma classe na dll importada. Ou seja, você precisa escrever uma função (método) em c# que muda o estado da caixa de seleção. Como mudar a propriedade da caixa de seleção, não me lembro do nome do método, é fácil navegar pela lista suspensa, você tem que digitar o nome da caixa de seleção, pressionar um ponto...

1. Eu não sei. Provavelmente não. Você tem que chamar uma função dll a partir do temporizador e olhar o estado das caixas de seleção. E, quanto a eventos como o aperto de botões, provavelmente poderíamos criar uma matriz e armazenar eventos nela. Mas não é difícil, considerando a vantagem do manuseio visual dos controles.

Ok.

Portanto, precisamos fazê-lo:

  1. Criar uma DLL.
  2. Conecte-o ao pedido de viúva com o formulário.
  3. Escreva métodos para traduzir os eventos de pressionar os botões e caixas de seleção na dll.
  4. Escrever métodos para mudar o estado dos botões e caixas de seleção na aplicação da viúva.
  5. Criar memória compartilhada na dll. Para que ao acessar a partir do MT5 a bandeira de mudança de estado para botões e caixas de seleção seja definida. Então, o aplicativo Windows acessa a memória compartilhada, lê bandeiras e as utiliza para conhecer o estado de um ou outro elemento de forma a ser alterado.
  6. Escreva referência cíclica à DLL do cronômetro em MT5 para ler bandeiras de chamadas de função ou inserir texto nos campos.

    E se houver centenas de elementos?

    Como organizar a memória compartilhada?

    E se for necessário mudar não apenas o estado dos elementos pressionados/liberados em uma forma, mas também sua cor (por exemplo, para botões)?

    E se você precisar alterar o texto nos campos de entrada em um formulário programático do MT5?


     
    Dmitry Fedoseev:

    Quanto a eventos como a prensa de botões, provavelmente é melhor fazer uma matriz e armazenar os eventos nela contidos. Mas não é difícil, considerando a vantagem do trabalho visual com controles.

    Eu costumava fazer isso de uma maneira mais simples:

    O usuário pressionou o botão no formulário - o manipulador de eventos OnClick() foi clicado e o Botão1.Disable foi criado;

    2. depois é até MT5 como a troca será organizada lá, eu gosto de cliques de botão para ser interrogado em OnTick() - você não fará nada até que não haja nenhum tick; você pode definir um valor neutro de cerca de 300 ms no timer - nem um usuário notará um frizz, nem MT5 irá diminuir a velocidade


    Mas o ponto do meu exemplo é que a visualização do painel no MT5 agora é possível em 2 cliques, os manipuladores de botões trabalham em uma .dll e parte do script de interface pode ser transferida para um formulário, as mesmas tabelas, manipulação de dados... tudo

    o mais valioso é economizar tempo no desenvolvimento da renderização, com a ajuda do designer de formulários tudo é feito em horas ;)


    Rehtag Konow:

    Criar uma memória compartilhada em DLL. Assim, ao acessar a partir do MT5, a bandeira de mudança de estado dos botões e caixas de seleção será definida. O aplicativo acessa memória compartilhada, lê bandeiras e sabe que o estado de um ou outro elemento da forma deve ser alterado.

    Escreva referência cíclica à DLL do cronômetro em MT5 para ler bandeiras de chamadas de função ou inserir texto nos campos.

      E se houver centenas de elementos?

      Como organizar a memória compartilhada?

      Você está indo na direção errada novamente, saia da feria de 2000! .... embora de alguma forma eu ache que 2000 não é o limite para você ))))

      sem ofensa, espero eu?

       
      Igor Makanu:

      Eu costumava fazer isso de uma maneira mais simples:

      1. o usuário pressionou o botão no formulário - imediatamente entrou OnClick() handler, fez Button1.Disable lá;

      2. depois é até MT5 como a troca será organizada; eu gosto que cliques de botão sejam interrogados em OnTick() - de qualquer forma, até que um tick não seja alcançado, você pode definir um valor neutro de cerca de 300 ms no timer - nem um usuário notará um frizz, nem MT5 irá diminuir a velocidade


      Mas o ponto do meu exemplo é que a visualização do painel no MT5 agora é possível em 2 cliques, os manipuladores de botões trabalham em uma .dll e parte do script de interface pode ser transferida para um formulário, as mesmas tabelas, manipulação de dados... tudo

      a melhor parte é economizar tempo na renderização, com o Designer de Formulários tudo é feito em horas ;)


      Você está indo na direção errada novamente, saia da feria dos 2000s! .... embora eu ache que os 2000s não são o limite para você ))))

      Sem ressentimentos, espero eu?

      Sem ofensa, mas é uma pena que não esteja no ponto.

      Você está pegando o exemplo NEAREST e extrapolando a partir dele, acreditando que a complexidade não vai aumentar. Isto é um erro.

      Mesmo o exemplo mais simples que você deu está errado. Porque além da forma criada, você também precisa criar uma DLL. E depois criar uma memória TOTAL dentro da DLL.

      medida que o número de elementos da forma cresce e a funcionalidade do programa no MT5 se torna mais complexa, esta interação se torna CLEALMENTE ocupada e complicada.

      Eu testei tudo isso na prática.

       
      Реter Konow:

      OK.

      Portanto, é necessário:

      1. Criar uma DLL.
      2. Conecte a DLL ao aplicativo Windows com um formulário.
      3. Escreva métodos que traduzam eventos de pressão de botões e caixas de seleção em dll.
      4. Escrever métodos para mudar o estado dos botões e caixas de seleção na aplicação da viúva.
      5. Criar memória compartilhada na dll. Para que ao acessar a partir do MT5 a bandeira de mudança de estado para botões e caixas de seleção seja definida. Então o aplicativo Windows acessa a memória compartilhada, lê as bandeiras e as utiliza para conhecer o estado de um ou outro elemento de forma a ser alterado.
      6. Escreva referência cíclica à DLL do cronômetro em MT5 para ler bandeiras de chamadas de função ou inserir texto nos campos.

        E se houver centenas de elementos?

        Como organizar a memória compartilhada?

        E se for necessário mudar não apenas o estado dos elementos pressionados/liberados em uma forma, mas também sua cor (por exemplo, para botões)?

        E se precisarmos alterar o texto nos campos de entrada de um formulário de forma programática a partir de МТ5?


        Se os eventos forem tratados corretamente, então o número de controles não é um problema. Na dll, podemos criar uma matriz ou duas matrizes, uma para o nome do objeto e a segunda para o tipo de evento. Na dll escreva uma função com dois parâmetros, também nome e tipo do evento. A partir de cada responsável pelo evento desejado, chame esta função, para que os eventos sejam colocados em matrizes. Outro método - para rastrear eventos a partir do temporizador EA, tão conveniente ou conforme se revelar - as mesmas matrizes por referência ou o que quer que seja e também uma variável - com o número de eventos na matriz. Após a chamada desse método, as matrizes são desobstruídas.

        Ou talvez seja mais fácil criar um array com um array; há um objeto de evento em c#, para que eu possa transformá-los em um array. Além disso, talvez seja possível, de alguma forma, brincar e não chamar uma função de cada participante do evento por si só. Mas isso não importa; em qualquer caso é uma bagatela em comparação com as capacidades de interface e toda a potência do c#.