2010-11-06 60 views
3

在Delphi 2010中,我需要顯示一個具有大約15列x 5行的水平滾動條的網格。水平滾動條移動時StringGrid的實時更新?

我選擇使用StringGrid。

但是,當鼠標按鈕向下拖動水平滾動條時,我想讓網格滾動直播

顯示的StringGrid組件不會實時滾動。它會一直等到鼠標按鈕被釋放後再更新列並在必要時滾動。

此外,水平滾動條按鈕(即所謂的)與列數不成正比。而對於一個向下的箭頭,當在底部行移動到右邊的下一列的頂部...

這些似乎是常見的需求,所以我很驚訝沒有找到他們在TStringGrid。

任何有關解決這兩個問題的建議?我可以使用DbGrid或其他標準組件,但是如果我可以避免它,我的首選是不使用商業網格。而且我不打算使用共享軟件或免費軟件...

TIA

回答

3

對於第一個問題,你可以設置goThumbTracking在StringGrid的Options在設計時,或在運行時:

StringGrid1.Options := StringGrid1.Options + [goThumbTracking];


對於第三個問題,你可以提供你需要使用鍵盤事件的功能控制器的處理程序。一個例子;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
var 
    StringGrid: TStringGrid; 
begin 
    StringGrid := Sender as TStringGrid; 
    case Key of 
    VK_DOWN: 
     if StringGrid.Row = StringGrid.RowCount - 1 then begin 
     Key := 0; 
     StringGrid.Row := StringGrid.FixedRows; 
     if StringGrid.Col = StringGrid.ColCount - 1 then 
      StringGrid.Col := StringGrid.FixedCols 
     else 
      StringGrid.Col := StringGrid.Col + 1; 
     end; 
    VK_UP: //...; 
    VK_RIGHT: //; 
    VK_LEFT: //; 
    end; 
end; 


對於第二個問題,滾動碼似乎是埋藏在TCustomGrid私有方法。我不知道如何做到這一點..

+0

謝謝,Sertac。我沒有注意到goThumbTracking選項。很棒。我以類似於您的建議代碼的方式處理了OnKeyDown中的箭頭鍵。 (感謝您將它添加到您的回覆中。)我會放棄讓Thumb變大。再次感謝! – RobertFrank 2010-11-06 14:28:30

3

如果發現你不感興趣的第三方組件 - 免費軟件,我不喜歡這些要麼,但我們都必須做出犧牲有時如果我們想解決問題。這是這些犧牲之一!這個組件很好被忽略。如果你沒有幾年的空閒時間,你不會自己創造出類似的東西。

寫根據TStringGrid一個新的組件(我不會 - 它不是在盒子開始的最佳工具)

但需要一定的時間和學習TVirtualStringTree。該組件比TStrignGrid早幾年。來源是可用的,並且有許多人使用它。

而且目前已經實現對滾動條反應事件的變化 OnScroll,OnShowScrollbar

http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

搜索的計算器,你可以閱讀更多關於tvirtualstringtree

+0

+1 VirtualTreeView是一個優秀的組件,如果不是最好的組件。這是一個非常聰明的概念,並得到很好的實施。 – Remko 2010-11-06 11:21:26

+0

+1對於TVirtualStringTree建議 – RobertFrank 2010-11-06 14:32:16

0

其次使用TVirtualStringTree建議。使用TStringGrid組件就像用生鏽的剪刀在肚子裏刺傷自己。