Мой подход. Ядро - Движок. - страница 60

 
Igor Makanu:

...

но если знаете как работает событийная модель в Виндовс и имели опыт работы с компиляторами с дизайнерами (конструкторами) форм, то везде все одинаково устроено

ЗЫ: я Шарп втрой раз в жизни вижу, но имел большой опыт под Делфи, разницы вообще не вижу, все один в один работает, что не работает, гуглится с первого раза

Я не помню, как работает событийная модель Виндоус. И опыт работы с компиляторами и дизайнерами имел давно.

Мне нужно соединить созданную форму с Приложением на МТ и решить задачу. Вы говорили, что это легко.

 
Georgiy Merts:

Не показав, но при этом вполне себе четко описывая свои принципы. По ним и возражают, по ним и говорят, что "дорога неправильная".

Причем, "неправильная" она-то как раз не для автора, а для возражающих. У которых куринные мозги, и которые не могут запомнить, где и какие объекты они создали, где и кто на них ссылается, что каждая ячейка в массиве обозначает, откуда их можно менять, откуда нельзя... Понятное дело, что оппоненты и возмущены. Вместо того, чтобы тренировать свою память, чтобы с легкостью запомнить пару тысяч объектов и ссылки в программе - они, глупые, себе же обрезают права доступа, определяют какие-то разграничения, какие-то интерфейсы, какие-то полиморфные фунции... Мучают себя, как при царском режиме, эх...

Лапшу про крутизну памяти стряхните. Порой наблюдается, что нить вот этого форумного диалога не отслеживается, на глубину в две страницы. К тому же слишком много отрицания наблюдается, что бы память работала столь чудесно, как нам пытаются рассказать. 

 
Dmitry Fedoseev:

 

Помогите решить задачу.

  1. Нужно переслать событие нажатия кнопок и чекбоксов в МТ5. 
  2. Нужно программно изменить состояние чекбокса или кнопки в форме.
Как это сделать?
 

Виндоус форма есть. Она запускается и работает. Кнопки и чекбоксы нажимаются.

Теперь нужен ДЛЛ, чтобы соединить с МТ5. Кто знает, как это сделать?

 
Реter Konow:

Помогите решить задачу.

  1. Нужно переслать событие нажатия кнопок и чекбоксов в МТ5. 
  2. Нужно программно изменить состояние чекбокса или кнопки в форме.
Как это сделать?

2. Вчера Игорь показывал пример. В примере показано, как из эксперта можно вызывать метод класса находящегося в импортированной dll. То есть надо в c# написать функцию (метод) изменяющую состояние чекбокса. Как менять свойство чекбокса, не помню как называется метод, по выпадающему списку легко сориентироваться, надо ввести имя чекбокса, нажать точку...

1. Не знаю. Наверно никак. Надо из таймера вызывать функции dll и смотреть состояние чекбоксов. А вот что касается событий типа нажима кнопки, то наверно массив делать, в него складывать события. Но это не сложно, учитывая преимущество визуальной работы с элементами управления.

 
Реter Konow:

Поставил C#. Открыл проект. Сделал форму и добавил на нее две кнопки и три чекбокса.

Вот какой код в редакторе:

Вопрос: Почему есть функция одной кнопки и где функции второй кнопки и чекбоксов?

Нашел этот код:

 И как это использовать для взаимосвязи с МТ5?

Надо продемонстрировать что вторая кнопка нужна - двойной клик на ней сделать, тогда откроется код и будет добавлена функция. Там впереди ждет еще одно удивительное открытие - если потом кнопку удалить с формы, проект будет компилироваться с ошибкой, надо будет самостоятельно код удалять из какого-то файла, но не тот , который сам писал. 

 
Dmitry Fedoseev:

2. Вчера Игорь показывал пример. В примере показано, как из эксперта можно вызывать метод класса находящегося в импортированной dll. То есть надо в c# написать функцию (метод) изменяющую состояние чекбокса. Как менять свойство чекбокса, не помню как называется метод, по выпадающему списку легко сориентироваться, надо ввести имя чекбокса, нажать точку...

1. Не знаю. Наверно никак. Надо из таймера вызывать функции dll и смотреть состояние чекбоксов. А вот что касается событий типа нажима кнопки, то наверно массив делать, в него складывать события. Но это не сложно, учитывая преимущество визуальной работы с элементами управления.

Ок. 

Значит, нужно:

  1. Создать ДЛЛ.
  2. Подключить ДЛЛ к виндоус приложению с формой.
  3. Написать методы транслирующие события нажатия на кнопки и чекбоксы в длл. 
  4. Написать методы изменяющие состояния кнопок и чекбоксов в виндоус приложении.
  5. Создать в ДЛЛ общую память. Чтобы при обращении из МТ5, ставился флаг изменения состояния кнопок и чекбоксов. Потом, виндоус приложение обращалось к общей памяти, считывало флаги и по ним узнавало, что нужно изменить состояние того или иного элемента формы.
  6. Написать цикличное обращение к ДЛЛ из таймера в МТ5 для считывания флагов вызовов функций или ввода текста в поля.

    А если элементов сотни?

    Как правильно организовать общую память? 

    Что если нужно менять не только нажатое/отжатое состояние элементов в форме, но и цвет (например у кнопок)?

    Что если нужно программно из МТ5 менять текст в полях ввода в форме? 


     
    Dmitry Fedoseev:

    А вот что касается событий типа нажима кнопки, то наверно массив делать, в него складывать события. Но это не сложно, учитывая преимущество визуальной работы с элементами управления.

    я обычно проще делал:

    1. юзер нажал кнопку на форме - сразу вошли в обработчик OnClick(), там сделали Button1.Disable;

    2. дальше дело за МТ5, как там будет организован обмен, мне нравится клики по кнопкам опрашивать в OnTick() - все равно пока нет тика ничего не сделаем, можно в таймере, поставить там нейтральное значение около 300 мс, ни юзер не заметит фризов ни МТ5 не будет подлагивать


    но суть моего примера, что визуализировать панель сейчас в МТ5 можно в 2 клика, обработчики кнопок работают в .dll, да и вообще часть сценария интерфейса можно перенести в форму, теже таблицы, обработки данных... да все

    самое ценное это экономия на времени разработки визуализации, с помощью дизайнера форм все делается за считанные часы ;)


    Реter Konow:

    Создать в ДЛЛ общую память. Чтобы при обращении из МТ5, ставился флаг изменения состояния кнопок и чекбоксов. Потом, виндоус приложение обращалось к общей памяти, считывало флаги и по ним узнавало, что нужно изменить состояние того или иного элемента формы

    Написать цикличное обращение к ДЛЛ из таймера в МТ5 для считывания флагов вызовов функций или ввода текста в поля.

      А если элементов сотни?

      Как правильно организовать общую память? 

      Вас опять куда то не туда понесло, ну выберитесь из лохматых 2000-х годов!.... хотя почему то думаю, что 2000-е это не предел у Вас ))))

      надеюсь без обид?

       
      Igor Makanu:

      я обычно проще делал:

      1. юзер нажал кнопку на форме - сразу вошли в обработчик OnClick(), там сделали Button1.Disable;

      2. дальше дело за МТ5, как там будет организован обмен, мне нравится клики по кнопкам опрашивать в OnTick() - все равно пока нет тика ничего не сделаем, можно в таймере, поставить там нейтральное значение около 300 мс, ни юзер не заметит фризов ни МТ5 не будет подлагивать


      но суть моего примера, что визуализировать панель сейчас в МТ5 можно в 2 клика, обработчики кнопок работают в .dll, да и вообще часть сценария интерфейса можно перенести в форму, теже таблицы, обработки данных... да все

      самое ценное это экономия на времени разработки визуализации, с помощью дизайнера форм все делается за считанные часы ;)


      Вас опять куда то не туда понесло, ну выберитесь из лохматых 2000-х годов!.... хотя полчему то думаю, что 2000-е это не предел у Вас ))))

      надеюсь без обид?

      Без обид, но жаль, что не по делу.

      Вы берете НАИПРОСТЕЙШИЙ пример и экстраполируете его, считая что сложность возрастать не будет. Это ошибка.

      Даже наипростейший пример Вы привели неверный. Потому что помимо созданной формы, нужно создать еще и ДЛЛ. А потом создать ОБЩУЮ память внутри ДЛЛ.

      При росте количества элементов формы и усложнении функционала программы на МТ5, это взаимодействие становится НЕРЕАЛЬНО загруженным и сложным.

      Я это все на практике проверял.

       
      Реter Konow:

      Ок. 

      Значит, нужно:

      1. Создать ДЛЛ.
      2. Подключить ДЛЛ к виндоус приложению с формой.
      3. Написать методы транслирующие события нажатия на кнопки и чекбоксы в длл. 
      4. Написать методы изменяющие состояния кнопок и чекбоксов в виндоус приложении.
      5. Создать в ДЛЛ общую память. Чтобы при обращении из МТ5, ставился флаг изменения состояния кнопок и чекбоксов. Потом, виндоус приложение обращалось к общей памяти, считывало флаги и по ним узнавало, что нужно изменить состояние того или иного элемента формы.
      6. Написать цикличное обращение к ДЛЛ из таймера в МТ5 для считывания флагов вызовов функций или ввода текста в поля.

        А если элементов сотни?

        Как правильно организовать общую память? 

        Что если нужно менять не только нажатое/отжатое состояние элементов в форме, но и цвет (например у кнопок)?

        Что если нужно программно из МТ5 менять текст в полях ввода в форме? 


        Если правильно организовать работу с событиями, то количество элементов управления не проблема. Можно сделать примерно так: в dll массив или два массива, один для имени объекта, второй для типа события. В dll написать функцию с двумя параметрами, тоже имя и тип события. Из каждого нужного обработчика событий вызывать эту функцию, что бы события помещались в массивы. Еще один метод - для отслеживания события из таймера советника, так как удобно или как получится - эти же массивы по ссылкам или еще как и еще переменная - с количество событий в массиве. После вызова того метода массивы очищать.

        А может с одним массивом проще, там в c# есть объект-событие, может из них массив сделать. Еще может быть можно как-то измудриться и самостоятельно не вызвать функцию из каждого обработчика событий. Но это не важно, в любом случае это мелочь по сравнению с возможностями по построению интерфейса и всей мощью  с# которая становится доступна.