2013-05-16 4 views
0

Нужно анимировать алгоритм сортировки, с исходным кодом, строчным визуализацией.Выполнение кода задержки в VCL Forms Application

INTRO:

Для начала, есть форма (см это на картинке прилагается). В верхней части этой формы отображается динамически созданный массив компонентов Edit, содержащий массив для сортировки. Немного ниже справа справа находится компонент Memo, содержащий алгоритм. Слева от каждой строки этого алгоритма dinamicaly помещается метка, которая указывает номер строки в алгоритме.

Идея состоит в том, чтобы выделить линию, окрашивая эту метку, где выполняется выполнение на данный момент. Сортировка начинается при нажатии кнопки «Пуск». Действие для него заключается в следующем:

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); 

гектолитров функция должна цвет этикетки и приостановить выполнение с помощью 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

ответ

2

Вы должны разрешить сообщение краски должны быть обработаны для того, чтобы визуально обновить экран. Вы можете сделать это либо с Refresh или Update процедур:

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

Спасибо большое. Я не знал об этом, теперь он работает! –

+3

'Update()' обычно лучше использовать, поскольку обрабатывает ожидающие сообщения с краской только в том случае, если на самом деле есть сообщения с краской, ожидающие обработки. 'Refresh()', с другой стороны, заставляет полные repaint, даже если ничего не изменилось. –

Смежные вопросы