2013-05-16 42 views
0

需要使用源代碼逐行顯示來爲排序算法設置動畫。在VCL Forms應用程序中執行延遲代碼

INTRO:

對於開始時,有一個表格(看到它在附圖)。在該窗體的頂部顯示一個由Dinamicaly創建的編輯組件陣列,其中包含要排序的數組。 稍低一點,在右側放置一個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); 

HL功能必須彩色標籤,並通過使用睡眠暫停執行()函數

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

問題:

代碼執行暫停(睡眠功能正常工作),但標籤仍爲灰色,沒有明顯的變化,除最後一個事件外飾面。第十五行是紅色的。

問題:

可有人告訴我,在這裏我錯了,怎麼做是正確的?

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

回答

2

您需要允許以被處理,以在視覺上更新顯示的繪製消息。你可以用RefreshUpdate程序來做到這一點:

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

非常感謝。我不知道這個,現在它正在工作! –

+3

'Update()'通常更好用,因爲它只在實際上有待處理的繪製消息時才處理掛起的繪製消息。另一方面,刷新()會強制完全重新繪製,即使沒有任何變化。 –