Ошибки, баги, вопросы - страница 2521

 
fxsaber:

Так это удобно, вроде. В контексте структур, конечно.

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

p.s. Допускаю лишь исключение, если класс B не имеет собственных полей, т.е. полностью совпадает с классом A (полностью эквивалентен ему), тогда нет причин препятствовать такому присвоению.  Хотя в C++ оно всё-равно не работает, но в MQL можно разрешить.

 
Slava:

В opt-файле в куске, где прописаны все входные параметры, значение для оптимизируемых параметров (определяется через поля size и offset) содержит не Value (как без оптимизации), а Start.

Логично, если там будет Value.

 
Alexey Navoykov:

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

Суть присваивания в том, что объекту присваивается эквивалентный объект. Т.е. того же типа. 

Суть операций для пользовательских типов заранее не определена. А определен лишь их порядок, который в данном случае заключается в вызове подходящего operator= 

В MQL в отличие от С++ operator= наследуется, поэтому b = a; эквивалентно вызову А::operator=(const A&);

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

 
A100:

В MQL в отличие от С++ operator= наследуется, поэтому b = a; эквивалентно вызову b.operator=(const A&);

Ну да, в этом и проблема. Но разница в написании тут роли не играет.  В С++ не скомпилируется в обоих случаях.

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

Противоречие будет хотя бы с С++.  Если такое компилируется, значит правый операнд неявно кастится к левому, и затем происходит полное замещение объекта.  Как оно и должно работать по логике.  Пример с int->long я приводил.  А замещение части внутренностей объекта не есть присваивание.  Поэтому тут всё в одном: и противоречие, и нестыковка.

p.s. Хотя ещё может быть перегружен оператор B::operator=(A&) , но я полагаю, здравомыслящий программист там тоже полностью заменит объект B, а не частично.  Ибо в этом суть присваивания.

Если кому хочется лаконичного написания,  то можно было бы сделать для этого какой-то другой оператор:  &= или |=  например .  Они по крайней мере не являются общеупотребительными, поэтому не перепутаешь.

[Удален]  
Alexey Navoykov:

..........

Противоречие будет хотя бы с С++. ......

..........

С чего Вы взяли, что MQL должна полностью соответствовать С++ ???

С-подобный - вовсе не означает эквивалентный!

MQL разработан для вполне определённых задач и вовсе не обязан полностью копировать язык, на основе которого был создан. 

Может уже хватит возмущаться?

А вот в Паскале можно .........

А в Ассемблере так .....

А на ява ....

А на Бэйсик ....

Вы что, в сравнение языков тут практикуетесь?

=======

П.С. Это я не только Вам...

 
Сергей Таболин:

С чего Вы взяли, что MQL должна полностью соответствовать С++ ???

...

Вы что, в сравнение языков тут практикуетесь?

Я отвечал на конкретную фразу. Успокойтесь. Выпейте валерьянки и ложитесь спать, вам вредно волноваться.    ...Эк же у некоторых тут подгорает при слове "C++" )

 

Прошу помощи по WinAPI. Нужно уметь делать эти два действия в MT5.

Вызвать показанное меню и выбрать сохранение отчета.


Вызвать показанное меню и выбрать загрузку set-файла.


В MT4 с подобными вещами очень просто. В MT5 никак не выходит.

Т.е. нужно только вызвать меню и выбрать в нем соответсвующий пункт. Но не выходит.


ЗЫ Похоже, это нужно

 

Если записать Message log для вызова контекстного меню по задаче №2, то можно получить следующий результат: 


Пробуйте програмно вызвать это меню через SendMessage WinApi.

 
Sergey Dzyublik:

Если записать Message log для вызова контекстного меню по задаче №2, то можно получить следующий результат: 

Пробуйте програмно вызвать это меню через SendMessage WinApi.

Не получилось

#include <WinAPI\winuser.mqh>

#define GA_ROOT           0x00000002

#define GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {}; // Пробовал углубляться по дереву окон - не помогает.
  GET_HANDLE
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}
 
fxsaber:

Не получилось

Скорее всего не тот хендл используете.
Чарты реализованы в рамках объекта MDIClient, вам же нужно подняться к root окну terminal.exe, а затем спуститься по окнам к выделенному "SysListView32" и использовать его хендл.
Может можно как-то и проще, пробуйте...