2012-02-11 21 views
2

我在Delphi XE2中製作了一個簡單的應用程序,它專門使用了「碳」風格。有一個有成千上萬行的大型字符串網格。我有一個循環遍歷這個網格記錄的過程,做了一些工作,並對網格進行了一些更改。當過程循環時,當前正在處理的行會突出顯示(通過設置TStringGrid.Row)。在Delphi中使用樣式的字符串網格XE2 - 滾動條不更新

問題是,當我將樣式應用到此網格時,滾動條不會隨着行更改而更改位置。當循環處理時,循環會正確地突出顯示每一行,但當它到達列表的末尾時,右側的滾動條仍然位於頂部。

如何讓網格的滾動條隨之一起移動?

這裏是我如何循環的一個示例:當我不使用任何樣式

procedure TForm1.Button1Click(Sender: TObject); 
var 
    X: Integer; 
begin 
    FStop:= False; 
    for X:= 1 to Grid.RowCount - 1 do begin 
    if FStop then Break; //Ability to stop loop 
    Grid.Row:= X; //Highlight current row 
    DoSomeLenghyWork; 
    ChangeSomethingOnGrid; 
    Application.ProcessMessages; //Keep program responding 
    end; 
end; 

一切工作就好了。

+1

這聽起來像是對我的錯誤。 「無效」是強制執行繪製循環的方法。我想我會傾向於在後臺執行處理,並使用虛擬控件(例如虛擬模式下的列表視圖)來更新UI。在計時器上更新用戶界面,例如每一秒。 – 2012-02-11 20:15:49

+0

我正在將其轉換爲處理線程中的每個項目,並且正在爲各種事件添加消息。我可以有一個'MSG_BEGIN','MSG_END','MSG_NEXT','MSG_ERROR'等。 – 2012-02-11 20:26:14

+0

你應該有一個線程來完成這項工作,然後在主線程中運行一個定時器來獲取UI更新。使用虛擬列表視圖來顯示。用鎖同步化可能就足夠了。 – 2012-02-11 20:27:39

回答

2
  1. 如果無效,並重繪沒有爲你做任何事情,嘗試調整串格:

    Grid.Width:= Grid.Width - 1; Grid.Width:= Grid.Width + 1;

  2. 嘗試播放隱藏和顯示滾動條的字符串網格選項。在更新之前隱藏它們並在之後顯示它們。也許這會迫使他們重畫。

  3. 嘗試移動滾動位置並將其移回原始位置。

+0

謝謝,回到辦公室時會做。 #1將無法工作,因爲網格與alClient對齊(不能在不改變其父寬度的情況下更改寬度)。此外,這似乎是最後的手段快速修復:P其他人值得一試。 – 2012-02-11 19:40:46

+0

我在循環中暫時隱藏了滾動條(#2)。但我確信有一個技巧可以使這項工作正確。 – 2012-02-11 21:05:31

+0

你可以關閉alClient(align = alNone,然後alClient),但是肯定會閃爍。相反,請始終對齊alNone,然後設置錨點。該解決方法對於VCL網格滾動錯誤特別有用。 – 2012-02-12 03:10:43

2

這爲我工作 - 它迫使窗口重新繪製StringGrid的邊境地區:

SetWindowPos(Grid.Handle, 0, 0, 0, Grid.Width, Grid.Height, SWP_DRAWFRAME);