Как можно сделать так, чтобы виртуальный элемент управления Treeview всегда прокручивался по строкам?

StackOverflow https://stackoverflow.com/questions/929600

  •  06-09-2019
  •  | 
  •  

Вопрос

Виртуальное древовидное изображение прокручивается по вертикали пикселями, в отличие от способа, которым используются стандартные сетки Delphi, TListView и TTreeView (или большинство других подобных элементов управления, о которых я знаю) прокручивайте строку за строкой и постоянно сохраняйте видимой полную строку в верхней части элемента управления.Когда я использую клавиши управления курсором для навигации, то в зависимости от направления полностью видна либо первая, либо последняя строка.При прокрутке с помощью мыши выравнивание вообще отсутствует.

Такое поведение можно наблюдать, например, в окне Структуры в Delphi 2007 и 2009.

Есть ли какой-нибудь способ настроить множество свойств так, чтобы они вели себя как стандартные элементы управления Windows?Или где-то есть набор патчей для достижения этой цели?

Это было полезно?

Решение

Вы могли бы перехватить TBaseVirtualTree.Включите событие прокрутки и используйте возвращаемое значение виртуального treeview canvas для textheight('M') в качестве величины для изменения TBaseVirtualTree.offsety для увеличения (прокрутка вверх) или уменьшения (прокрутка вниз).Можно также проверить, чтобы убедиться, что модуль высоты текста перед прокруткой ('M') равен нулю (чтобы избежать прокрутки на нужную величину из неправильной позиции).

В качестве альтернативы, этот пост на виртуальном форуме Treeview предлагается другой подход:скройте собственные полосы прокрутки виртуального treeview с помощью полос прокрутки VCL, а затем выполните прокрутку самостоятельно (захват событий прокрутки VCL и программная прокрутка виртуального treeview).

Другие советы

Это то, что я придумал с помощью Argalatyr, похоже, он делает то, что я хочу:

procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
    VirtualStringTree1.DefaultNodeHeight;
end;

procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
var
  DY: integer;
begin
  with VirtualStringTree1 do begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    BottomSpace := ClientHeight mod DY;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;

procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
  DeltaY: Integer);
var
  DY: integer;
begin
  if DeltaY <> 0 then begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top