2015-05-21 3 views
3

Когда я устанавливаю значение RibbonPage в false, мне также нужно, чтобы вкладка сверху тоже была отключена. Он должен быть недоступен, и пользователь не сможет перейти к нему. Мне удалось с PageControl, но я не могу найти способ сделать это с помощью RibbonPage.Вкладка TRibbon Disable

На приведенном ниже изображении показан элемент управления страницы с отключенной страницей. Мне нужно сделать то же самое со страницей ленты.

pagecontrol with disabled page

Так после того, как много борется, я, наконец, получил свой ответ. Я отправлю свой код на случай, если у кого-то будет такая же проблема. Я создал новую ленту, которая наследуется от TCustomRibbon. Благодаря этому я могу добраться до холста ТРИБОНА. Наконец, я скопировал код из процедуры DrawTab TCustomRibbon и отредактировал его, чтобы сделать вкладку, которая выглядит отключенной.

ribboncontrol with disabled page

type 
    // Grouped by the element that they below to. 
    TSkinRibbon = (srBackground, srBackgroundDisabled, srHeader, srBody, 
    srPage, srHelp); 

    TMyRibbon = class(TCustomRibbon) 
    private 
    { Private declarations } 
    FTabDataInitialised: Boolean; 
    function GetFirstVisibleIndex():Integer; 
    function GetLastVisibleIndex():Integer; 
    procedure DrawDisabled(); 



    protected 
    { Protected declarations } 
    procedure Paint; override; 
    public 
    { Public declarations } 
    procedure DrawTabDisabled(Index: Integer); 
    published 
    { Published declarations } 
    property ActionManager; 
    property ScreenTips; 
    property Align default alTop; 
    property Anchors; 
    property ApplicationMenu; 
    property BiDiMode; 
    property Caption; 
    property DocumentName; 
    property Enabled; 
    property Font; 
    property Height default TCustomRibbon.cRibbonHeight; 
    property HideTabs; 
    property ParentBiDiMode; 
    property ParentFont; 
    property QuickAccessToolbar; 
    property ShowHelpButton; 
    property Style; 
    property Tabs; 
    // Tab Index must be streamed after the Tabs collection 
    property TabIndex; 
    property UseCustomFrame; 
    property OnHelpButtonClick; 
    property OnRecentItemClick; 
    property OnTabChange; 
    property OnTabVisibleChanged; 
    end; 



implementation 
uses 
system.Types, vcl.graphics, Vcl.RibbonActnCtrls, Vcl.RibbonStyleActnCtrls, Winapi.Windows; 


{ TMyRibbon } 


//procedure TMyRibbon.DrawTab(const Index: Integer); 
procedure TMyRibbon.DrawDisabled; 
var 
I : Integer; 
begin 
    for I := 0 to tabs.Count-1 do 
     if (Tabs[I].Page.Enabled = false) then 
     DrawTabDisabled(I); 

end; 

procedure TMyRibbon.DrawTabDisabled(Index: Integer); 
procedure AdjustRect(var Rect: TRect; const ALeft, ATop, ARight, ABottom: Integer); inline; 
begin 
    Rect := System.Types.Rect(Rect.Left + ALeft, Rect.Top + ATop, 
    Rect.Right + ARight, Rect.Bottom + ABottom); 
end; 
function CenterInRect(ACanvas: TCanvas; const ARect: TRect; const ACaption: string): TPoint; 
var 
    LTextWidth: Integer; 
begin 
    LTextWidth := ACanvas.TextWidth(ACaption); 
    if LTextWidth > ARect.Right - ARect.Left then 
    Result.X := 0 
    else 
    Result.X := (ARect.Right - ARect.Left) div 2 - (LTextWidth div 2); 
    Result.Y := (ARect.Bottom - ARect.Top) div 2 - (ACanvas.TextHeight(ACaption) div 2); 
end; 
var 
    LRect: TRect; 
    LPt: TPoint; 
    LSeparatorRect: TRect; 
    LStyle: TRibbonStyleActionBars; 
    LModifyRect: Boolean; 
    LTabWidth: Integer; 
begin 
    if not ValidTab(Index) then 
    Exit; 
    LStyle := Style; 
    LRect := GetTabRect(Index); 
    LTabWidth := LRect.Right - LRect.Left; 
    begin 
    if not Minimized then 
     AdjustRect(LRect, -2, 0, 2, -1) 
    else 
     AdjustRect(LRect, -2, 0, 2, 0); 
    LStyle.DrawElement(stNormal, Canvas, LRect); 
    if not Minimized then 
     AdjustRect(LRect, 2, 0, -2, 1) 
    else 
     AdjustRect(LRect, 2, 0, -2, 0) 
    end; 
    Canvas.Brush.Style := bsClear; 
    Canvas.Font.Assign(Font); 
    Canvas.Font.Size := GetRibbonMetric(rmFontSize); 
    if TabIndex = Index then 
    Canvas.Font.Color := TCustomRibbonColorMap(ColorMap).ActiveTabFontColor 
    else 
    Canvas.Font.Color := TCustomRibbonColorMap(ColorMap).InactiveTabFontColor; 
    LPt := CenterInRect(Canvas, LRect, Tabs[Index].Caption); 
    LRect := Rect(LRect.Left + LPt.X, LRect.Top + LPt.Y, LRect.Right, LRect.Bottom); 
    LModifyRect := LTabWidth - 6 - Tabs[Index].MinTabwidth <= 0; 
    if LModifyRect then 
    AdjustRect(LRect, 4, 0, -4, 0); 
    Canvas.Font.Color := clGray; 
    DrawText(Canvas.Handle, Tabs[Index].Caption, -1, LRect, DT_LEFT); 
    if LModifyRect then 
    AdjustRect(LRect, -4, 0, 4, 0); 
end; 

function TMyRibbon.GetFirstVisibleIndex: Integer; 
var I,ind:integer; 
begin 
    ind := 0; 
    for I := 0 to Tabs.Count -1 do 
     if (Tabs[I].Visible = true) then 
     begin 
     ind := I; 
     break; 
     end; 
    Result := ind; 
end; 

function TMyRibbon.GetLastVisibleIndex: Integer; 
var I,ind:integer; 
begin 
    ind := 0; 
    for I := 0 to Tabs.Count -1 do 
     if (Tabs[Tabs.Count - 1 - I].Visible = true) then 
     begin 
     ind := I; 
     break; 
     end; 
    Result := ind; 
end; 

procedure TMyRibbon.Paint; 
begin 
    inherited; 
    DrawDisabled(); 
end; 

end. 
+2

Ответ на самом деле прост: «TRibbon» не то же самое, что «TPageControl» и не имеет возможности отключить вкладки ленты, только сами страницы могут быть отключены. Единственное, что вы можете сделать, это скрыть вкладку (это лучший пользовательский интерфейс, чем отображение закрытой вкладки, которую вы не можете нажать). – whosrdaddy

+1

... или, по крайней мере, запретить переключение на вкладку (в событии 'OnTabChange'' TRibbon'), если вы предпочитаете, чтобы отображалась вкладка. – TLama

+0

Спасибо за ваши комментарии. Я использовал комбинацию TLama, чтобы запретить переключение на вкладку и рисование на ленте. Я не знаю, почему они хранят так много функций и процедур, защищенных в классе TCustomRibbon. – Christo

ответ

1

После разрывая управления TRibbon друг от друга, я наконец-то нашел способ сделать это. Вкладки на самом деле рисуются в событии Paint на ленте, а не в событии Paint на вкладке (Страница). Я редактировал свой вопрос и добавил свой исходный код.

@Whosrdaddy, это может улучшить пользовательский интерфейс, чтобы скрыть вкладку, но иногда нельзя спорить с клиентом.

Смежные вопросы