Blaazen, I think he is asking for vertical centering.
Alextp, I would do it similarly as in the stackexchange post, but calculate which node must be the tree's TopItem instead of sending scroll messages:
procedure TForm1.Button3Click(Sender: TObject);
var
Rsel: TRect;
ycenter: Integer;
node, newTopNode: TTreeNode;
h: Integer;
begin
Rsel := TreeView1.Selected.DisplayRect(false);
h := Rsel.Bottom - Rsel.Top;
node := TreeView1.TopItem;
newTopNode := node;
ycenter := TreeView1.ClientHeight div 2;
if Rsel.Top > ycenter then begin
while (Rsel.Top > ycenter) and (node <> nil) do begin
newTopNode := node;
node := node.GetNextVisible;
dec(Rsel.Top, h);
end;
end else
begin
while (Rsel.Top < ycenter) and (node <> nil) do
begin
newTopNode := node;
node := node.GetPrevVisible;
inc(Rsel.Top, h);
end;
end;
TreeView1.TopItem := newTopNode;
end;
Not your question, but do you know that there is a MakeSelectionVisible method which at least moves the selected node into view, although not in the center?