Кто-нибудь решал такую задачу с переменными...

 

В один метод класса передается значение переменной.

Допустим переменная имеет имя tmp. Со значением этой переменной производятся какие-то действия.

Другой метод класса получает данные из какого-то источника. И должен эти данные передать переменной tmp. 

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

Как можно сохранить имя переменной при ее использовании в первом методе, так чтобы во втором методе в тексте программы явно не задавать имя переменной tmp, а брать его из сохраненного в первом методе источника.

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

 
Eugeni Neumoin:

В один метод класса передается значение переменной.

Допустим переменная имеет имя tmp. Со значением этой переменной производятся какие-то действия.

Другой метод класса получает данные из какого-то источника. И должен эти данные передать переменной tmp. 

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

Как можно сохранить имя переменной при ее использовании в первом методе, так чтобы во втором методе в тексте программы явно не задавать имя переменной tmp, а брать его из сохраненного в первом методе источника.

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

class CTest
{
   int  tmp;
   ...
   void funk1() { /*Do something with tmp*/ }
   void funk2() { /*Do something with tmp*/ }
};
 
Eugeni Neumoin:

В один метод класса передается значение переменной.

Допустим переменная имеет имя tmp. Со значением этой переменной производятся какие-то действия.

Другой метод класса получает данные из какого-то источника. И должен эти данные передать переменной tmp. 

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

Как можно сохранить имя переменной при ее использовании в первом методе, так чтобы во втором методе в тексте программы явно не задавать имя переменной tmp, а брать его из сохраненного в первом методе источника.

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

Только из редактора связей. 

 
Алексей Тарабанов:

Только из редактора связей. 

Можно ссылку на редактор связей?
 
Eugeni Neumoin:
Можно ссылку на редактор связей?

На MQL не получится. PL/1 устроит? 

 

Вот так передается значение переменной double tmp_double:

   void createButton(int x, int y, int min, int max, double tmp_double, string tooltip)
     {
      count++;
      ArrayResize(mm,count+1,20);
      mm[count].min=min; mm[count].max=max;
      
      // Выводим "кнопку"
      name_tmp=(string)ExtSet+"_"+m_name_double+(string)count;
      if (tmp_double<min) tmp_double=min; if (tmp_double>max && max>0) tmp_double=max;
      if (ObjectFind(name_tmp)==0) ObjectDelete(0,name_tmp);
      EditCreate(0,name_tmp,0,x,y,50,26,(string)tmp_double,"Arial",12,ALIGN_LEFT,false,CORNER_LEFT_UPPER,clrBlack,clrWhite,clrDarkBlue,false,false,true,10);
      ObjectSetString(0,name_tmp,OBJPROP_TOOLTIP,tooltip);

      // увеличиваем параметр
      if (max==0 || (max>0 && tmp_double<max))
        {
         name_tmp=(string)ExtSet+"_"+m_name_ret_up+(string)count;
         if (ObjectFind(name_tmp)==0) ObjectDelete(0,name_tmp);
         BitmapLabelCreate(0,name_tmp,0,x+51,y,"::Images\\Up_new.bmp","::Images\\Up_new.bmp",false,CORNER_LEFT_UPPER,ANCHOR_LEFT_UPPER,false,false,true,10); 
         ObjectSetString(0,name_tmp,OBJPROP_TOOLTIP,"\n");
        }

      // уменьшаем параметр
      if (tmp_double>min)
        {
         name_tmp=(string)ExtSet+"_"+m_name_ret_dn+(string)count;
         if (ObjectFind(name_tmp)==0) ObjectDelete(0,name_tmp);
         BitmapLabelCreate(0,name_tmp,0,x+51,y+14,"::Images\\Dn_new.bmp","::Images\\Dn_new.bmp",false,CORNER_LEFT_UPPER,ANCHOR_LEFT_UPPER,false,false,true,10); 
         ObjectSetString(0,name_tmp,OBJPROP_TOOLTIP,"\n");
        }
     }

значения min и max сохраняются в структуре.

А вот так потом обрабатывается от другого источника эта же переменная double& _param:

   void EditField(string tmp_edit, double& _param, int x)
     {
      double min=mm[x].min;
      double max=mm[x].max;

      _param=(double)tmp_edit;

      if (max>0)
        {
         if (_param>max) _param=max;
        }

      if (_param<min) _param=min;
     };

Сейчас приходится явно прописывать имя переменной во входных параметрах в обеих методах. Со значениями min и max решено элегантно. А вот с самой переменной не получается.

Это только для типа double. А там еще есть и другие типы. 

   void createButton(int x, int y, int min, int max, bool tmp_bool, string tooltip)
   void createButton(int x, int y, int min, int max, int& tmp_int, string tooltip)
   void createButton(int x, int y, int min, int max, double tmp_double, string tooltip)
   void createButtonIf(int x, int y, int min, int max, int tmp_int, string tooltip, bool yes)
   void createButtonIf(int x, int y, int min, int max, double tmp_double, string tooltip, bool yes)

И последующие обработчики:

   void EditArrow (bool UpDn, int& _param, int x)
   void EditArrow (bool UpDn, double& _param, int x)
   void EditField(string tmp_edit, int& _param, int x)
   void EditField(string tmp_edit, double& _param, int x)
   void EditGrossPeriod (bool UpDn)
 
Алексей Тарабанов:

На MQL не получится. PL/1 устроит? 

Программа находится в маркете. Необходимо решать на MQL
 

Сейчас используется где-то 20-30 переменных. В 15 менюшках.

А дальше будет в нескольких менюшках более сотни переменных. Переменные  будут в разных комбинациях.

Увязывать взаимосвязи, прописывая явно названия переменных, можно. Но очень велика вероятность внесения ошибки.

 

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

Просто реализация на другом языке скрыта от пользователя. При создании своей реализации вопрос упирается в эффективность создаваемого алгоритма.

Разобрался, как можно с помощью MQL решить поставленную задачу.

 
Eugeni Neumoin:

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

Просто реализация на другом языке скрыта от пользователя. При создании своей реализации вопрос упирается в эффективность создаваемого алгоритма.

Разобрался, как можно с помощью MQL решить поставленную задачу.

Пример можете показать?

 
void EditArrow (bool UpDn, int& _param, int x)
void EditArrow (bool UpDn, double& _param, int x)
void EditField(string tmp_edit, int& _param, int x)
void EditField(string tmp_edit, double& _param, int x)

должно работать аналогично:

template<typename T>
void EditArrow(bool UpDn,T &_param,int x)
template<typename T>
void EditField(string tmp_edit,T &_param,int x)

ну и по сабжу, если переменных под сотню, то только в массивы уходить, чтобы не путаться какая часть массива кому принадлежит сделайте макропостановки

не понятно почему такая ситуация у ТС, вроде все в классах, а передается по одной переменной, обычно класс это законченная "боевая единица", если функционал оказывается недостаточным, то наследуется и дописываются новые методы

Причина обращения: