文章 "图形界面 X: 在多行文本框中选择文本 (集成构建 13)" - 页 7

 
Konstantin:

方法X(const int x) 和 Y(const int y) 不会以任何方式影响表格在表单中的位置,它始终位于左上角

在自定义类中创建元素时会设置 相对坐标:

//--- 创建一个控件
   if(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);

//---

任务是什么?

 
Anatoli Kazharski:

在自定义类中创建元素时会设置 相对坐标:

//---

任务是什么?

将两个表格水平放置,x_gap,y_gap 改变水平滚动的位置,就这样((.

PS. 所以,看起来是移动了,但由于某些原因,两个表格被移动了 ))

在该方法中

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

如果有两个表,第一个参数总是 0 还是相同对象的序列号?

由于某种原因,第一个表一直移动到第二个表下面。

 
Konstantin:

...

PS. 因此,它似乎发生了移动,但由于某种原因,有两张表发生了移动 ))

而在该方法中:

CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

如果有两个表,第一个参数总是 0 还是相同对象的序列号?

第一个参数是项目所属表格的编号。也许您在共同元素列表中添加了一个相同的表格。
 
Anatoli Kazharski:
第一个参数是附加元素的表格编号。也许您正在将同一个表格添加到项目的公共列表中。


在公共列表中是什么意思?

下面是表单类中的创建方法:

/*!
 \brief Create object
 \param const string a_name - program name
 \param const uint a_pause - pause for status line update
 \return true if successful, otherwise false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- 将表格对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

GetTbl 方法 返回一个指向 CCanvasTable m_table 的指针

 
Konstantin:

...

这是你想要的结果吗?

//---

我在档案中附上了一个示例:

附加的文件:
 
Konstantin:

这里是表单类中的创建方法:

GetTbl 方法 返回指向 CCanvasTable m_table 的指针

//--- 创建一个控件
   if(!m_canvas_table2.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);
//--- 将对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0,m_canvas_table2);
 
Anatoli Kazharski:

你想要这样的结果吗?

//---

档案中附有一个示例:


我是这样做的:

/*!
 \brief Create object
 \param const string a_name - program name
 \param const uint a_pause - pause for status line update
 \return true if successful, otherwise false
*/
bool CMainForm::Create(const string a_name,const uint a_pause) {
   m_counter500.SetParameters(16, a_pause);
   m_counter16.SetParameters(16, 16);

   if(!CreateForm(m_form, a_name))
      return false;

   if(!CreateStatusBar(m_status_bar, m_form, 1, STATUS_SIZE_HEIGHT))
      return false;

   if(!m_table_sign.Create(m_form, m_chart_id, m_subwin, 1, 20))
      return false;

   //--- 将表格对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0, m_table_sign.GetTbl());

   if(!m_table_pair.Create(m_form, m_chart_id, m_subwin, 450, 20))
      return false;
   //--- 将表格对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0, m_table_pair.GetTbl());

   m_chart.Redraw();
//---
   return true;
}

结果发现,在创建对象后,应立即将其放入容器中,然后再创建另一个对象 ))


 
Anatoli Kazharski:

不,我把表格放在其他类中,我使用模块化编程 ))这样更便于管理功能--主表单类、表格类 1、表格类 2 等,最终所有元素都作为单独的现成对象组合在主表单类中。
 
Konstantin:

不,我把表格放在其他类中,我使用模块化编程 ))这样更便于管理功能--主表单类、表单类 1、表单类 2 等。
同意。这个库的许多用户都是这样做的,但我无法使用。)
 
Anatoli Kazharski:
我同意。这个图书馆的许多用户都是这么做的,但我就是拿不到。)


顺便说一下,有一个问题:

CWndEvents::CWndEvents(void) : m_chart_id(0),
                               m_subwin(0),
                               m_active_window_index(0),
                               m_indicator_shortname(""),
                               m_program_name(PROGRAM_NAME),
                               m_subwindow_handle(INVALID_HANDLE),
                               m_subwindow_shortname(""),
                               m_subwindows_total(1)

  {
//--- 启动计时器
   if(!::MQLInfoInteger(MQL_TESTER))
      ::EventSetMillisecondTimer(TIMER_STEP_MSC);
//--- 获取当前图表的 ID
   m_chart.Attach();
//--- 启用鼠标事件跟踪
   m_chart.EventMouseMove(true);
//--- 禁用命令行调用空格键和回车键
   m_chart.SetInteger(CHART_QUICK_NAVIGATION,false);
//-- 确定子窗口编号
   DetermineSubwindow();
  }

选定的行不允许在测试器中工作。最好这样选择:

enum ENUM_GRAPHICS {
   GRAPHICS_NO    = 0,  // 无需图形
   GRAPHICS_REAL  = 1,  // 真实交易图表
   GRAPHICS_TEST  = 2   // 测试图形
};

/*!
 获取运行程序的指示
*/
ENUM_GRAPHICS CCheck::GetGraphics(void) { return m_graphics; }
//-----------------------------------------------------------------------------+
/*!
 图形显示的符号
 (从 ENUM_GRAPHICS 枚举中返回程序运行的符号
*/
ENUM_GRAPHICS CCheck::CheckGraphicsDisplay(void) {
   if(MQLInfoInteger(MQL_OPTIMIZATION) || (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)))
      m_graphics = GRAPHICS_NO;
   else if(!MQLInfoInteger(MQL_OPTIMIZATION) && !MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_REAL;
   else if(MQLInfoInteger(MQL_VISUAL_MODE))
      m_graphics = GRAPHICS_TEST;
//---
   return m_graphics;
}

并在程序中做出这样的选择:

   //--- 设置 OnTimer()
   uint _pause = 0;
   if(in_param.graphics == GRAPHICS_REAL)
      _pause = 500;                       // 500 ms
   else if(in_param.graphics == GRAPHICS_TEST)
      _pause = 60000;                     // 1 分钟

   if(!main_form.Create(name_mts, _pause)) {
      ::Print(__FUNCTION__," > 创建图形用户界面失败!");
      return INIT_FAILED;
   }

或直接使用标志进行选择