Как сделать управление виртуальным деревом, чтобы всегда прокручиваться по строкам? - PullRequest
4 голосов
/ 30 мая 2009

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

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

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

Ответы [ 2 ]

5 голосов
/ 01 июня 2009

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

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;
5 голосов
/ 01 июня 2009

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

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

...