Когда я устанавливаю значение RibbonPage в false, мне также нужно, чтобы вкладка сверху тоже была отключена. Он должен быть недоступен, и пользователь не сможет перейти к нему. Мне удалось с PageControl
, но я не могу найти способ сделать это с помощью RibbonPage
.Вкладка TRibbon Disable
На приведенном ниже изображении показан элемент управления страницы с отключенной страницей. Мне нужно сделать то же самое со страницей ленты.
Так после того, как много борется, я, наконец, получил свой ответ. Я отправлю свой код на случай, если у кого-то будет такая же проблема. Я создал новую ленту, которая наследуется от TCustomRibbon. Благодаря этому я могу добраться до холста ТРИБОНА. Наконец, я скопировал код из процедуры DrawTab TCustomRibbon и отредактировал его, чтобы сделать вкладку, которая выглядит отключенной.
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.
Ответ на самом деле прост: «TRibbon» не то же самое, что «TPageControl» и не имеет возможности отключить вкладки ленты, только сами страницы могут быть отключены. Единственное, что вы можете сделать, это скрыть вкладку (это лучший пользовательский интерфейс, чем отображение закрытой вкладки, которую вы не можете нажать). – whosrdaddy
... или, по крайней мере, запретить переключение на вкладку (в событии 'OnTabChange'' TRibbon'), если вы предпочитаете, чтобы отображалась вкладка. – TLama
Спасибо за ваши комментарии. Я использовал комбинацию TLama, чтобы запретить переключение на вкладку и рисование на ленте. Я не знаю, почему они хранят так много функций и процедур, защищенных в классе TCustomRibbon. – Christo