Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VirtualStringTree columns should adapt size when one column is hidden

I have a VST with 3 columns that evenly take the available space.

  • I have set hoAutoSpring in Header.Options, and
  • all columns have Column[x].Option have coAutoSpring set.

Now I want to be able to hide the last column and maintain that the other columns evenly take the free space (a little bit like a control with alClient).

When I only set the column invisible (see below) the space that was taken by the column is then simply unused.

VST.Header.Columns[2].Options:=VST.Header.Columns[2].Options - [coVisible];

When I set Header.Options.hoAutoResize to True and set Header.AutoSizeIndex to 1, then the 2nd Column will take all the new space.

Is there a method to tell the columns to fill up the available space and resize evenly?

Screenshot:

enter image description here

like image 921
ralfiii Avatar asked Nov 14 '13 13:11

ralfiii


1 Answers

Thanks to all for your very quick and high quality responses!

As it seems that there's no built in way to solve my problem i've coded that the following way (just in case somebody runs into a similar problem):

// Show/hide a column and spread the space on all other visible columns
//   so that the proportions remain the same (as if AutoSpring was used)
procedure ChangeColumnVisibility(Tree: TVirtualStringTree; Column: TColumnIndex;
  NewVisible: boolean);
var Col : TVirtualTreeColumn;
begin
     Col:=Tree.Header.Columns[Column];
     if not (NewVisible xor (coVisible in Col.Options)) then
        Exit;

     if not NewVisible then
     begin
          Col.Options:=Col.Options - [coVisible];
          Tree.Header.ResizeColumns(Col.Width, 0, Tree.Header.Columns.Count-1);
     end
     else
     begin
          Tree.Header.ResizeColumns(-Col.Width, 0, Tree.Header.Columns.Count-1);
          Col.Options:=Col.Options + [coVisible];
     end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
     ChangeColumnVisibility(VST, 2, not (coVisible in VST.Header.Columns[2].Options));
end;
like image 122
ralfiii Avatar answered Sep 28 '22 22:09

ralfiii