2015-04-14 2 views
3

Существует ли универсальный метод размещения определенного элемента (например, 500-й от 1000) списка в его центре? Теперь я использую этот код:Как сделать список, чтобы показывать определенный элемент в центре?

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

Это простой, но имеет один недостаток - в основном нужный пункт появляется в верхней или нижней части ListView. Да, я знаю, это не очень важно прокручивать его вручную, но способ, которым я его использую (выбор точки на графике и просмотр значений соседних точек в списке), делает это поведение немного неудобным.

+0

Используйте 'TListView.TopItem', чтобы увидеть, хотите ли вы пролистать вверх или вниз. 'TlistView.Scroll' для прокрутки определенного количества пикселей. –

+0

@LU Это был бы рабочий метод, если бы этот элемент всегда появлялся в том же положении, но это не так, его можно показать где угодно. – Molochnik

+0

@LU Извините, предыдущий ответ был на ваш неотредактированный вопрос – Molochnik

ответ

8

Вы можете использовать DisplayRect, чтобы определить, где он находится сейчас. Учитывая ListView1 является ListView, li является элементом списка и R является TRect переменной

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

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