2011-07-08 9 views
3

VSNetStyleを選択したJVCLのJvDockingサンプルコードでAdvanceDemoを実行すると、2番目のフォームをメインフォームにドラッグできます。 2番目のフォームのタイトルのタブが表示されます。別のフォームをメインフォームの同じ面にドラッグすると、別のタブが作成されます。 2つのタブが重なります:JvDockServerコンポーネントでのタブの表示方法を制御できますか?

screenshot of overlapping tabs

これら二つのタブが重なってどのくらい制御する方法はありますか?私はタブが十分に分離されているので、ユーザーは両方のタブのテキストを読むことができます。いつものように

おかげで、 - アルC.

+0

あなたが画像を含む場合、私は、あなたがこの質問への答えを得るであろうと思いますあなたが達成したい仕事の – RRUZ

+0

どうすればいいですか?あなたが教えてくれれば:-) –

+0

http://meta.stackexchange.com/questions/75491/how-to-upload-an-image-to-a-post – RRUZ

答えて

5

AINがコメントしたように、私もそれはバグだと思います。より正確には、タブを描画するTJvDockVSChannel.Paintのバグです(内部でタブはブロックと呼ばれます)。このようなブロックは、保護されたプロパティInactiveBlockWidthを持ち、名前の幅を制御することを推奨します。 このプロパティはタブ自体には問題ありませんが、キャプションはTJvDockVSChannel.Paintで同じ量だけ再度シフトされますが、これは問題のようです。

次のようにDockServerのOnFinishSetDockPanelSizeイベントを割り当てることによって、試すことができます:

type 
    TJvDockVSBlockAccess = class(TJvDockVSBlock); 

procedure TMainForm.lbDockServer1FinishSetDockPanelSize(
    DockPanel: TJvDockPanel); 
var 
    Channel: TJvDockVSChannel; 
    Block: TJvDockVSBlockAccess; 
    i: Integer; 
begin 
    if DockPanel is TJvDockVSNETPanel then 
    begin 
    Channel := TJvDockVSNETPanel(DockPanel).VSChannel; 
    for i := 0 to Channel.BlockCount - 1 do 
    begin 
     Block := TJvDockVSBlockAccess(Channel.Block[i]); 
     Block.InactiveBlockWidth := 100; 
    end; 
    end; 
end; 

これが今の保護されたプロパティですので、それは建設下され、その機能を示している可能性があります。 Jediの開発チームは、タブの幅を動的に処理するための完全な実装がないため、各非アクティブタブのグリフだけを描画することを決定しました。例えば。各タブの最小幅を設定できる必要があります。バー(つまり、そのバーが置かれているコンテナ)の高さが変わると、すべてのタブがそれに応じて拡大または縮小されます。

編集:柔軟な設計に

おかげで、あなたはDockServerのDockPanelClassプロパティを設定することによって、バグを回避することができます。 Styleプロパティを設定する前にプロパティを設定する必要があると思います。 InactiveBlockWidthが今度は仮想ではないGetBlockRect、にも使用されているので、全体のペイントルーチンをリライト:

type 
    TJvDockVSBlockAccess = class(TJvDockVSBlock); 

    THackJvDockVSNETPanel = class(TJvDockVSNETPanel) 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

    THackJvDockVSChannel = class(TJvDockVSChannel) 
    protected 
    procedure Paint; override; 
    procedure ResetBlock; override; 
    procedure Resize; override; 
    end; 

const 
    InactiveTabWidth = 100; 

{ TMainForm } 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    ... 
    JvDockVSNetStyle1.DockPanelClass := THackJvDockVSNETPanel; 
end; 

{ THackJvDockVSNETPanel } 

constructor THackJvDockVSNETPanel.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    VSChannelClass := THackJvDockVSChannel; 
end; 

{ THackJvDockVSChannel } 

procedure THackJvDockVSChannel.Paint; 
var 
    I: Integer; 

    procedure DrawSingleBlock(Block: TJvDockVSBlockAccess); 
    var 
    DrawRect: TRect; 
    I: Integer; 
    OldGraphicsMode: Integer; 
    VisiblePaneCount: Integer; 

    procedure AdjustImagePos; 
    begin 
     if Align = alLeft then 
     begin 
     Inc(DrawRect.Left, 3); 
     Inc(DrawRect.Top, 4); 
     end 
     else if Align = alTop then 
     begin 
     Inc(DrawRect.Left, 4); 
     Inc(DrawRect.Top, 2); 
     end 
     else if Align = alRight then 
     begin 
     Inc(DrawRect.Left, 4); 
     Inc(DrawRect.Top, 4); 
     end 
     else if Align = alBottom then 
     begin 
     Inc(DrawRect.Left, 4); 
     Inc(DrawRect.Top, 3); 
     end; 
    end; 

    begin 
    VisiblePaneCount := 0; 
    for I := 0 to Block.VSPaneCount - 1 do 
    begin 
     if not Block.VSPane[I].Visible then 
     Continue; 
     GetBlockRect(Block, I, DrawRect); 
     Canvas.Brush.Color := TabColor; 
     Canvas.FillRect(DrawRect); 
     Canvas.Brush.Color := clGray; 
     Canvas.FrameRect(DrawRect); 
     AdjustImagePos; 
     Block.ImageList.Draw(Canvas, DrawRect.Left, DrawRect.Top, I); 
     if Align in [alTop, alBottom] then 
     Inc(DrawRect.Left, 24) 
     else if Align in [alLeft, alRight] then 
     begin 
     Inc(DrawRect.Top, 24); 
     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; 
     DrawText(Canvas.Handle, PChar(Block.VSPane[I].DockForm.Caption), -1, 
     DrawRect, DT_END_ELLIPSIS or DT_NOCLIP); 
     SetGraphicsMode(Canvas.Handle, OldGraphicsMode); 
     Inc(VisiblePaneCount); 
    end; 
    if VisiblePaneCount > 0 then 
     CurrentPos := CurrentPos + BlockInterval; 
    end; 

begin 
    ResetBlock; 
    CurrentPos := BlockStartOffset; 
    for I := 0 to BlockCount - 1 do 
    DrawSingleBlock(TJvDockVSBlockAccess(Block[I])); 
end; 

procedure THackJvDockVSChannel.ResetBlock; 
var 
    I: Integer; 
begin 
    inherited ResetBlock; 
    for I := 0 to BlockCount - 1 do 
    TJvDockVSBlockAccess(Block[I]).InactiveBlockWidth := InactiveTabWidth; 
end; 

procedure THackJvDockVSChannel.Resize; 
begin 
    { Here you could widen or narrow the tabs according the total space and 
    depending on the number of tabs } 
    inherited Resize; 
end; 

Sample of widened tabs

+0

ありがとう、NGLN!私は本当にあなたの応答の深さと明快さに感謝します! ...私はコードを試してみました。それは期待通りにブロックサイズを増やしました。残りの唯一の問題は、各タブにテキストを表示することです。あなたは既に親切な存在ですが、各タブのテキスト(つまり字幕を表示する方法)について考えているなら、それを聞いてみたいと思います。 –

+0

@Al私の考えは編集中です。 – NGLN

+0

私はあなたが私を助けてくれる努力によって吹き飛ばされます。ありがとうございました! ...そのように、新しいコードがまだ「機能していない」と言うのはいっそう難しく、タブにはまだフォームキャプションが表示されていません。コードを完全に理解するにはあまりにも初心者です。私は何が起こっているのか把握するための知識を持っていたらいいのに! –

関連する問題