【问题标题】:Delay code execution in VCL Forms Application在 VCL Forms 应用程序中延迟代码执行
【发布时间】:2013-05-16 14:02:21
【问题描述】:

需要动画排序算法,用源代码逐行可视化。

简介:

首先,有一个表格(见附图)。在该表单的顶部显示了一个动态创建的 Edit 组件数组,其中包含要排序的数组。 在下方,右侧放置了一个包含算法的备忘录组件。在该算法的每一行的左侧,都放置了一个标签,表示算法中的行号。

这个想法是通过为该标签着色来突出显示行,此时执行在哪里。单击“开始”按钮时开始排序。它的动作如下:

int n = 10;
bool swapped = true; hl(1);
int j = 0; hl(2);
int tmp; hl(3);
while (swapped) { hl(4);
    swapped = false; hl(5);
    j++; hl(6);
    for (int i = 0; i < n - j; i++) { hl(7);
          if (arr[i] > arr[i + 1]) { hl(8);
                tmp = arr[i]; hl(9);
                arr[i] = arr[i + 1]; hl(10);
                arr[i + 1] = tmp; hl(11);
                swapped = true; hl(12);
          } hl(13);
    }  hl(14);
}  hl(15);

hl 函数必须为标签着色并使用 Sleep() 函数暂停执行

void TForm2::hl(int l)
{
    for (int i = 0; i < 24; i++) {
         Form2->lines[i]->Font->Color = clGray;
    }
    Form2->lines[l-1]->Font->Color = clRed;
    Sleep(300);
}

问题:

代码执行正在暂停(睡眠功能正常工作),但标签仍然是灰色的,没有可见的变化,除了最后一个,当事件结束时。第 15 行是红色的。

问题:

谁能告诉我,我哪里错了,如何做对?

http://i.stack.imgur.com/crGyC.jpg

【问题讨论】:

    标签: sorting c++builder


    【解决方案1】:

    您需要允许处理绘制消息以便直观地更新显示。您可以使用RefreshUpdate 过程来做到这一点:

    Form2->Lines[l-1]->Font->Color = clGray;
    Form2->Update();            // or Form2->Refresh();
    

    【讨论】:

    • Update() 通常更好用,因为它仅在实际存在等待处理的绘制消息时才处理挂起的绘制消息。另一方面,Refresh() 会强制重新绘制,即使没有任何变化。
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2013-10-02
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多