Как установить размер неактивных (скрытых) вкладок док-клиентов в компоненте JVCL Docking?

Единственный известный мне стиль док-станции в JVCL с функцией автоматического скрытия (для закрепления клиентов док-станции) — это JvDockVSNetStyle. Я использую его, но не могу установить размер вкладок неактивных закрепленных панелей. Когда вкладки скрыты, на вкладках не отображается заголовок панели, отображается только имя активной панели. Извините, я не могу опубликовать пример изображения, потому что это мой первый вопрос.

В инспекторе объектов есть параметр ChannelOption со свойством ActivePaneSize. Есть ли способ установить размер неактивной панели, чтобы она могла отображать свое имя? Или, может быть, есть другой стиль док-станции, который я упускаю, который имеет те же функции?

Я использую C++Builder и JVCL 3.45.


person gabrielmdu    schedule 30.08.2012    source источник


Ответы (2)


я сделал это, закомментировав эти части кода:

procedure TJvDockVSChannel.GetBlockRect(Block: TJvDockVSBlock; Index: Integer;
  var ARect: TRect);
var
  BlockWidth: Integer;
begin
// HERE 

//  if Block.VSPane[Index] <> Block.ActivePane then
//    BlockWidth := Block.InactiveBlockWidth
//  else
    BlockWidth := Block.ActiveBlockWidth;

<snip>



procedure TJvDockVSChannel.Paint;
var
  I: Integer;

<snip>

  begin
    VisiblePaneCount := 0;
    for I := 0 to Block.VSPaneCount - 1 do
    begin
      if not Block.VSPane[I].FVisible then
        Continue;

      GetBlockRect(Block, I, DrawRect);
      Canvas.Brush.Color := TabColor;
      Canvas.FillRect(DrawRect);
      Canvas.Brush.Color := clGray;
      Canvas.FrameRect(DrawRect);

      AdjustImagePos;
      Block.FImageList.Draw(Canvas, DrawRect.Left, DrawRect.Top, I, dsTransparent, itImage);

// HERE 
//      if Block.ActivePane = Block.VSPane[I] then
      begin
        if Align in [alTop, alBottom] then
          Inc(DrawRect.Left, Block.InactiveBlockWidth)
        else
        if Align in [alLeft, alRight] then
        begin
          Inc(DrawRect.Top, Block.InactiveBlockWidth);
          if Align = alLeft then
            DrawRect.Left := 15
          else
            DrawRect.Left := 20;
          DrawRect.Right := DrawRect.Left + (DrawRect.Bottom - DrawRect.Top);
        end;
        Canvas.Brush.Color := TabColor;
        Canvas.Pen.Color := clBlack;

        Dec(DrawRect.Right, 3);

        OldGraphicsMode := SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
        Canvas.Brush.Style := bsClear;
// HERE (changed options)
        DrawText(Canvas.Handle, PChar(Block.VSPane[I].FDockForm.Caption), -1, DrawRect, {DT_END_ELLIPSIS or} DT_NOCLIP);
person X-Ray    schedule 19.11.2012
comment
Ваше решение - просто плохая практика, что, если в будущем вы обновите библиотеку JEDI. Да, все ваши изменения будут удалены, и вы удивитесь, почему ничего не работает. Почему бы не назначить значки форм, чтобы определить, что они из себя представляют, как задумано библиотекой? Если ваши формы не имеют значков по умолчанию, вы можете установить значок для каждой панели, (Self.Parent.Parent.Parent.Parent as TJvDockVSPopupPanel).VSChannel.Block[0].ImageList.ReplaceIcon(X, ICON); (self.Parent.Parent.Parent.Parent as TJvDockVSPopupPanel).VSChannel.Refresh; - person Scott Alexander; 15.02.2013
comment
Модификация JVCL, безусловно, была моим наименее любимым выбором, но архитектор продукта хочет, чтобы это работало определенным образом... В конце концов мы отказались от использования JVCL. - person X-Ray; 16.02.2013
comment
Спасибо, Рентген! Он работал именно так, как мы хотели. И мы не планируем обновлять JVCL в нашем проекте. - person gabrielmdu; 25.03.2013

В TJvDockServer есть событие под названием DoFinishSetDockPanelSize.

В функции, которую вы создаете для этого события, вы можете получить доступ к размеру формы с помощью Dockpanel. Здесь может быть способ установить размер вкладок.

person Scott Alexander    schedule 05.11.2012