Столбцы VirtualStringTree должны адаптировать размер, когда один столбец скрыт

У меня есть VST с 3 колонками, которые равномерно занимают доступное пространство.

  • Я установил hoAutoSpring в Header.Options и
  • во всех столбцах Column[x].Option установлен coAutoSpring.

Теперь я хочу иметь возможность скрыть последний столбец и сохранить, чтобы другие столбцы равномерно занимали свободное пространство (немного похоже на элемент управления с alClient).

Когда я только устанавливаю столбец невидимым (см. Ниже), пространство, занимаемое столбцом, просто не используется.

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

Когда я устанавливаю для Header.Options.hoAutoResize значение True и устанавливаю для Header.AutoSizeIndex значение 1, 2-й столбец займет все новое пространство.

Есть ли способ указать столбцам заполнить доступное пространство и равномерно изменить размер?

Снимок экрана:

введите здесь описание изображения


person ralfiii    schedule 14.11.2013    source источник
comment
+1 только за картинку. Очень хороший первый вопрос. Добро пожаловать в СО!   -  person jpfollenius    schedule 14.11.2013
comment
Получается, что AutoFitColumns с smaAllColumns не показывает ожидаемого поведения. Я удалил свой ответ.   -  person jpfollenius    schedule 14.11.2013
comment
@jpfollenius: Спасибо! Я приятно удивлен, как быстро я нашел здесь качественные ответы. Думаю, я останусь здесь на некоторое время :)   -  person ralfiii    schedule 14.11.2013


Ответы (1)


Спасибо всем за очень быстрые и качественные ответы!

Поскольку кажется, что нет встроенного способа решить мою проблему, я закодировал это следующим образом (на случай, если кто-то столкнется с подобной проблемой):

// 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;
person ralfiii    schedule 14.11.2013
comment
Вы пытались показать тот же столбец, который вы скрываете таким образом? Установив ширину столбца-заполнителя вручную, вы сохраните для этого столбца автоматического размера небольшое пространство, если вы снова его покажете. - person TLama; 14.11.2013
comment
Ты прав. Для правильной работы Header.Options.hoAutoResize должно иметь значение false. (Я установил Header.options.hoAutoSpring и установил coAutoSpring для всех столбцов в своем приложении) - person ralfiii; 15.11.2013
comment
только что наткнулся на Tree.Header.ResizeColumns, что сделало код намного понятнее - отредактировал код в моем сообщении выше. - person ralfiii; 15.11.2013