0

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

介绍:

首先,有一个表格(见附图)。在该表单的顶部显示了一个动态创建的 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

4

1 回答 1

2

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

Form2->Lines[l-1]->Font->Color = clGray;
Form2->Update();            // or Form2->Refresh();
于 2013-05-16T15:10:29.417 回答