文章 "图形界面 X: 高级列表和表格管理。代码优化 (集成构建 7)" - 页 7 123456789101112 新评论 Artyom Trishkin 2017.01.23 09:24 #61 Anatoli Kazharski: 数据不足,无法复制。给我一个完整的示例,这样我就可以自己复制了。那就发私信吧--你需要额外的类。是的,重建表后会出现这种情况。 Artyom Trishkin 2017.01.23 18:25 #62 Anatoli Kazharski: 数据不足,无法重现。请附上一个完整的示例,这样我就可以自己重复一遍了。Tol,关于上一个问题和私人信息中没有手鼓的代码示例:以 Experts\Article10\TestLibrary06 中的示例为例。在定时器中的 Program.mqh 中,您只需编写几行 代码,编译并观察。//+------------------------------------------------------------------+//| 定时器|//+------------------------------------------------------------------+void CProgram::OnTimerEvent(void) { CWndEvents::OnTimerEvent();//--- 元素更新之间暂停 if(m_counter1.CheckTimeCounter()) { //-- 更新状态栏的第二个项目 m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS)); //--- 重绘图形 m_chart.Redraw(); }//--- 元素更新之间暂停 if(m_counter2.CheckTimeCounter()) { //--- 在第一行的价格栏中输入当前符号的价格值 MqlTick tick; if(SymbolInfoTick(Symbol(),tick)) { int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS); m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg); m_table.UpdateTable(); } //--- 如果总数小于指定数,则在表中添加一行 if(m_table.RowsTotal()<m_spin_edit1.GetValue()) m_table.AddRow(); //--- 如果列的总数少于指定数,则向表中添加一列。 if(m_table.ColumnsTotal()<m_spin_edit2.GetValue()) m_table.AddColumn(); //--- 如果总数量小于指定数量,则向列表中添加一个项目。 if(m_listview.ItemsTotal()<m_spin_edit5.GetValue()) { m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal())); //--- 将滚动条滑块移至列表末尾 m_listview.Scrolling(); } //--- 如果复选框总数小于指定的复选框总数,则从复选框中向列表添加一个项目 if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue()) { m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal())); //--- 将滚动条滑块移至列表末尾 m_checkbox_list.Scrolling(); } //--- 重绘图形 m_chart.Redraw(); } }//+------------------------------------------------------------------+如果没有表格更新行,第一行第一列中就没有价格。如果有,价格可以输入和更改,但表格会不断重绘,无法再使用。如果需要实时更新表格的许多行,该怎么办?(很多符号,每个符号都需要显示当前价格) Discussion of article "Graphical 图形界面 X: 高级列表和表格管理。代码优化 (集成构建 包含图形用户界面 (GUI) 的 EA Anatoli Kazharski 2017.01.23 18:57 #63 Artyom Trishkin:Tol,关于前一个问题和不带手鼓的代码示例的个人信息:以 Experts\Article10\TestLibrary06 中的示例为例。在定时器中的 Program.mqh 中编写几行 代码,然后编译并观察。...如果没有表格更新行,第一行第一列中就没有价格。如果有,价格可以输入和更改,但表格会不断重绘,无法再使用。如果需要实时更新表格的许多行,该怎么办?(很多符号,每个符号都需要显示当前价格)。也许(乍一看),有必要稍微修改一下CTable::SetValue() 方法,这样就可以在更改指定单元格的值时,只更新该单元格(如果它在可见区域内),而不是整个表格。等我写完这篇文章,我再看看。另外, 我还会修复高亮显示行的闪烁问题。 Artyom Trishkin 2017.01.23 21:12 #64 Anatoli Kazharski:也许(乍一看),您需要稍微修改一下CTable::SetValue() 方法,以便只更改指定单元格的值(如果该单元格位于可见区域),而不是整个表格。等我写完这篇文章,我再看看。另外, 我还会修复高亮显示行闪烁的问题。 有没有 "现在 "就能完成的 "快速 "解决方案? Anatoli Kazharski 2017.01.24 12:26 #65 Artyom Trishkin: 没有 "快速 "的解决方案,哪个是 "现在"?为防止选定的表格行闪烁,请在最后一个循环的CTable::UpdateTable() 方法中添加以下几行://--- 栏 for(uint c=l; c<m_visible_columns_total; c++) { //--- 获取垂直滚动条滑块的当前位置 v=m_scrollv.CurrentPos()+t; //--- 行 for(uint r=t; r<m_visible_rows_total; r++) { //--- 偏移表数据 if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- 对突出显示的一行进行调整 color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v]; color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v]; //--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式 SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; }//---剩下的就需要更多细节了。阿尔乔姆-特里什金如果每次收到新的勾时都更新表格,就无法使用表格了--表格会闪烁,选中的行也会闪烁, 等等等等....。这是什么?:pr.pr.pr...pr... Discussion of article "Graphical 图形界面 VII: 表格控件 (第一章) 图形界面 X: 时间控件, 复选框列表控件和表格排序 Artyom Trishkin 2017.01.24 12:36 #66 Anatoli Kazharski:为防止突出显示的行闪烁,请在最后一个循环的CTable::UpdateTable() 方法中添加以下几行://--- 栏 for(uint c=l; c<m_visible_columns_total; c++) { //--- 获取垂直滚动条滑块的当前位置 v=m_scrollv.CurrentPos()+t; //--- 行 for(uint r=t; r<m_visible_rows_total; r++) { //--- 偏移表数据 if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- 对突出显示的一行进行调整 color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v]; color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v]; //--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式 SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; }//---至于其他部分,你需要更多细节。这是什么?:Ave.pr。pr -- 感谢您对代码的更正,以及对 "pr、pr、pr、pr "的更正。- 也许我写得太匆忙了;)我会看看更正后的效果如何,然后再向您汇报。不过有一点我已经可以说了,那就是整个表格都在更新,而不是只更新一行。这导致在更新整个表格时,有时会出现明显的闪烁--这就是 "问题 "之一。 Artyom Trishkin 2017.01.24 12:46 #67 Anatoli Kazharski:为防止高亮显示的行闪烁,请在最后一个循环的CTable::UpdateTable() 方法中添加这几行://--- 栏 for(uint c=l; c<m_visible_columns_total; c++) { //--- 获取垂直滚动条滑块的当前位置 v=m_scrollv.CurrentPos()+t; //--- 行 for(uint r=t; r<m_visible_rows_total; r++) { //--- 偏移表数据 if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- 对突出显示的一行进行调整 color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v]; color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v]; //--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式 SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; } 不,行为上没有任何变化 - 它仍然闪烁。如果鼠标光标在表格上方,它就会闪烁;如果鼠标光标在窗口外,就根本看不到选择的行。 Anatoli Kazharski 2017.01.24 12:54 #68 Artyom Trishkin: 没有,行为上没有任何变化 - 它仍然闪烁。如果鼠标光标在表格上方,它就会闪烁;如果鼠标光标在窗口外,就根本看不到行选择。 而我的更改却不是这样。在您建议测试的示例中,高亮显示的行不再闪烁。 Artyom Trishkin 2017.01.24 12:56 #69 Anatoli Kazharski: 我所做的更改并没有出现这种情况。在你建议测试的示例中,突出显示的行不再闪烁。 托尔,我会看看那个示例的 - 我已经在我的程序中看过了,但现在我得走了。等我回来再给你回信。 Anatoli Kazharski 2017.01.24 13:04 #70 Artyom Trishkin: 托尔,我会看看那个例子的--我已经在我的程序里看过了,但现在我得走了。等我回来,再给你回信。 好的。稍后,让我们继续刚才的例子。完成它,直到问题开始出现。 123456789101112 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
数据不足,无法复制。给我一个完整的示例,这样我就可以自己复制了。
那就发私信吧--你需要额外的类。
是的,重建表后会出现这种情况。
数据不足,无法重现。请附上一个完整的示例,这样我就可以自己重复一遍了。
Tol,关于上一个问题和私人信息中没有手鼓的代码示例:以 Experts\Article10\TestLibrary06 中的示例为例。
在定时器中的 Program.mqh 中,您只需编写几行 代码,编译并观察。
//| 定时器|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
{
CWndEvents::OnTimerEvent();
//--- 元素更新之间暂停
if(m_counter1.CheckTimeCounter())
{
//-- 更新状态栏的第二个项目
m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS));
//--- 重绘图形
m_chart.Redraw();
}
//--- 元素更新之间暂停
if(m_counter2.CheckTimeCounter())
{
//--- 在第一行的价格栏中输入当前符号的价格值
MqlTick tick;
if(SymbolInfoTick(Symbol(),tick))
//--- 如果总数小于指定数,则在表中添加一行{
int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);
m_table.UpdateTable();
}
if(m_table.RowsTotal()<m_spin_edit1.GetValue())
m_table.AddRow();
//--- 如果列的总数少于指定数,则向表中添加一列。
if(m_table.ColumnsTotal()<m_spin_edit2.GetValue())
m_table.AddColumn();
//--- 如果总数量小于指定数量,则向列表中添加一个项目。
if(m_listview.ItemsTotal()<m_spin_edit5.GetValue())
{
m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal()));
//--- 将滚动条滑块移至列表末尾
m_listview.Scrolling();
}
//--- 如果复选框总数小于指定的复选框总数,则从复选框中向列表添加一个项目
if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue())
{
m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal()));
//--- 将滚动条滑块移至列表末尾
m_checkbox_list.Scrolling();
}
//--- 重绘图形
m_chart.Redraw();
}
}
//+------------------------------------------------------------------+
如果没有表格更新行,第一行第一列中就没有价格。如果有,价格可以输入和更改,但表格会不断重绘,无法再使用。
如果需要实时更新表格的许多行,该怎么办?(很多符号,每个符号都需要显示当前价格)
Tol,关于前一个问题和不带手鼓的代码示例的个人信息:以 Experts\Article10\TestLibrary06 中的示例为例。
在定时器中的 Program.mqh 中编写几行 代码,然后编译并观察。
如果没有表格更新行,第一行第一列中就没有价格。如果有,价格可以输入和更改,但表格会不断重绘,无法再使用。
如果需要实时更新表格的许多行,该怎么办?(很多符号,每个符号都需要显示当前价格)。
也许(乍一看),有必要稍微修改一下CTable::SetValue() 方法,这样就可以在更改指定单元格的值时,只更新该单元格(如果它在可见区域内),而不是整个表格。
等我写完这篇文章,我再看看。
另外, 我还会修复高亮显示行的闪烁问题。
也许(乍一看),您需要稍微修改一下CTable::SetValue() 方法,以便只更改指定单元格的值(如果该单元格位于可见区域),而不是整个表格。
等我写完这篇文章,我再看看。
另外, 我还会修复高亮显示行闪烁的问题。
没有 "快速 "的解决方案,哪个是 "现在"?
为防止选定的表格行闪烁,请在最后一个循环的CTable::UpdateTable() 方法中添加以下几行:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- 获取垂直滚动条滑块的当前位置
v=m_scrollv.CurrentPos()+t;
//--- 行
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- 偏移表数据
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- 对突出显示的一行进行调整
color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
//--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
//---
剩下的就需要更多细节了。
如果每次收到新的勾时都更新表格,就无法使用表格了--表格会闪烁,选中的行也会闪烁, 等等等等....。
这是什么?:
为防止突出显示的行闪烁,请在最后一个循环的CTable::UpdateTable() 方法中添加以下几行:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- 获取垂直滚动条滑块的当前位置
v=m_scrollv.CurrentPos()+t;
//--- 行
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- 偏移表数据
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- 对突出显示的一行进行调整
color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
//--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
//---
至于其他部分,你需要更多细节。
这是什么?:
为防止高亮显示的行闪烁,请在最后一个循环的CTable::UpdateTable() 方法中添加这几行:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- 获取垂直滚动条滑块的当前位置
v=m_scrollv.CurrentPos()+t;
//--- 行
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- 偏移表数据
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- 对突出显示的一行进行调整
color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
//--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
没有,行为上没有任何变化 - 它仍然闪烁。如果鼠标光标在表格上方,它就会闪烁;如果鼠标光标在窗口外,就根本看不到行选择。
我所做的更改并没有出现这种情况。在你建议测试的示例中,突出显示的行不再闪烁。
托尔,我会看看那个例子的--我已经在我的程序里看过了,但现在我得走了。等我回来,再给你回信。