2015-04-14 31 views
3

是否有一種通用的方法將listview右邊的特定項目(例如從1000開始的500)放置在其中心?現在我正在使用這個代碼:如何讓listview在中心顯示特定的項目?

lvData.Items[iIndex].MakeVisible(False); 

它很簡單,但有一個缺陷 - 主要是所需的項目出現在列表視圖的頂部或底部。是的,我知道,手動滾動它並不是一件大事,但我使用它的方式(選擇圖上的一個點並查看列表視圖中的附近點的值)會使此行爲有點不舒服。

+0

使用'TListView.TopItem'來查看是否要向上或向下滾動。 'TlistView.Scroll'滾動一定數量的像素。 –

+0

@LU如果這個項目總是出現在同一個位置,那麼它就是一種工作方法,但它不會,它可以顯示在任何地方。 – Molochnik

+0

@LU對不起,前一個回答對您未經修改的問題 – Molochnik

回答

8

您可以使用項目的DisplayRect,以確定它目前的生活。 鑑於ListView1是列表視圖,li是列表項和RTRect可變

R := li.DisplayRect(drBounds); 
ListView1.Scroll(0, R.Top - ListView1.ClientHeight div 2); 

將在中心滾動項目,只要有足夠的物品。

+0

此代碼完美工作 – Molochnik

3

只是想提供一個想法。 TopItem給出了最上面的項目,VisibleRowCount給出了有多少可見行。要完成此操作,請對新索引進行完整性檢查。

if (lvData.TopItem < iIndex) then 
    adjustedIndex := iIndex-(lvData.VisibleRowCount div 2) 
else 
    adjustedIndex := iIndex+(lvData.VisibleRowCount div 2); 
// Check adjustedIndex 
if (adjustedIndex < 0) then 
    adjustedIndex := 0; 
if (adjustedIndex >= lvData.Items.Count) then 
    adjustedIndex := lvData.Items.Count-1; 

lvData.Items[adjustedIndex].MakeVisible(false); 
+0

代碼在稍作改動後效果很好,謝謝! – Molochnik

相關問題