📄 jvcomctrls.pas
字号:
procedure TJvTabControl.WMRButtonDown(var Msg: TWMRButtonDown);
var
I: Integer;
R: TRect;
P: TPoint;
begin
if RightClickSelect then
begin
with Msg do
P := SmallPointToPoint(SmallPoint(XPos,YPos));
for I := 0 to Tabs.Count -1 do
begin
R := TabRect(I);
if PtInRect(R, P) then
begin
if (TabIndex <> I) and CanChange then
begin
TabIndex := I;
Change;
end;
Break;
end;
end;
end;
inherited;
end;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure TJvTabControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key = VK_TAB) and (Shift * KeyboardShiftStates >= [ssCtrl]) then
begin
if (Shift * KeyboardShiftStates >= [ssShift]) then
begin
if TabIndex = 0 then
TabIndex := Tabs.Count - 1
else
TabIndex := TabIndex - 1;
end
else
TabIndex := (TabIndex + 1) mod Tabs.Count;
Key := 0;
end
else
inherited KeyDown(Key, Shift);
end;
procedure TJvTabControl.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
I: Integer;
R: TRect;
P: TPoint;
begin
if RightClickSelect and (Button = mbRight) then
begin
P := Point(X,Y);
for I := 0 to Tabs.Count -1 do
begin
R := TabRect(I);
if PtInRect(R, P) then
begin
if (TabIndex <> I) and CanChange then
begin
TabIndex := I;
Change;
end;
Break;
end;
end;
end;
inherited MouseDown(Button, Shift, X, Y);
end;
function TJvTabControl.DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean): Boolean;
begin
Result := True;
if Assigned(TabPainter) then
TabPainter.DrawTab(Self, Canvas, Images, TabIndex, Tabs[TabIndex].Caption, Rect, TabIndex = Self.TabIndex, Enabled)
else
Result := inherited DrawTab(TabIndex, Rect, Active);
end;
{$ENDIF VisualCLX}
{$IFDEF VCL}
procedure TJvTabControl.DrawTab(TabIndex: Integer; const Rect: TRect; Active: Boolean);
begin
if Assigned(TabPainter) then
TabPainter.DrawTab(Self, Canvas, Images, TabIndex, Tabs[TabIndex], Rect, TabIndex = Self.TabIndex, Enabled)
else
inherited DrawTab(TabIndex, Rect, Active);
end;
{$ENDIF VCL}
procedure TJvTabControl.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = TabPainter) then
TabPainter := nil;
end;
procedure TJvTabControl.SetTabPainter(const Value: TJvTabControlPainter);
begin
if FTabPainter <> Value then
begin
if FTabPainter <> nil then
FTabPainter.UnRegisterChange(Self);
FTabPainter := Value;
if FTabPainter <> nil then
begin
FTabPainter.FreeNotification(Self);
FTabPainter.RegisterChange(Self);
end;
Invalidate;
end;
end;
//=== { TJvPageControl } =====================================================
constructor TJvPageControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FClientBorderWidth := JvDefPageControlBorder;
FHintSource := hsDefault;
end;
function TJvPageControl.FormKeyPreview: Boolean;
var
F: TCustomForm;
begin
F := GetParentForm(Self);
if F <> nil then
Result := F.KeyPreview
else
Result := False;
end;
function TJvPageControl.WantKey(Key: Integer; Shift: TShiftState;
const KeyText: WideString): Boolean;
var
ThisTab, Tab: TTabSheet;
Forwrd: Boolean;
begin
Result := False;
if HandleGlobalTab and not FormKeyPreview and
(Key = VK_TAB) and (Shift * KeyboardShiftStates >= [ssCtrl]) then
begin
ThisTab := ActivePage;
Forwrd := (Shift * KeyboardShiftStates >= [ssShift]);
Tab := ThisTab;
repeat
Tab := FindNextPage(Tab, Forwrd, True);
until (Tab = nil) or Tab.Enabled or (Tab = ThisTab);
if Tab <> ThisTab then
begin
if CanChange then
begin
ActivePage := Tab;
Result := True;
Change;
end;
Exit;
end;
end;
Result := inherited WantKey(Key, Shift, KeyText);
end;
{$IFDEF VCL}
procedure TJvPageControl.DrawTab(TabIndex: Integer; const Rect: TRect;
Active: Boolean);
{$ENDIF VCL}
{$IFDEF VisualCLX}
function TJvPageControl.DrawTab(TabIndex: Integer; const Rect: TRect;
Active: Boolean): Boolean;
{$ENDIF VisualCLX}
var
I, RealIndex: Integer;
begin
{$IFDEF VisualCLX}
Result := False;
{$ENDIF VisualCLX}
if TabPainter <> nil then
begin
RealIndex := 0;
I := 0;
while I <= TabIndex + RealIndex do
begin
if not Pages[I].TabVisible then
Inc(RealIndex);
Inc(I);
end;
RealIndex := RealIndex + TabIndex;
if RealIndex < PageCount then
TabPainter.DrawTab(Self, Canvas, Images, Pages[RealIndex].ImageIndex, Pages[RealIndex].Caption, Rect, Active, Pages[RealIndex].Enabled);
end
else
{$IFDEF VisualCLX} Result := {$ENDIF} inherited DrawTab(TabIndex, Rect, Active);
end;
procedure TJvPageControl.Loaded;
begin
inherited Loaded;
HideAllTabs := FHideAllTabs;
end;
procedure TJvPageControl.SetClientBorderWidth(const Value: TBorderWidth);
begin
if FClientBorderWidth <> Value then
begin
FClientBorderWidth := Value;
RecreateWnd;
end;
end;
procedure TJvPageControl.SetHideAllTabs(const Value: Boolean);
var
I: Integer;
SaveActivePage: TTabSheet;
begin
FHideAllTabs := Value;
if (csDesigning in ComponentState) then
Exit;
if HandleAllocated then
begin
SaveActivePage := ActivePage;
for I := 0 to PageCount - 1 do
Pages[I].TabVisible := Pages[I].TabVisible and not FHideAllTabs;
ActivePage := SaveActivePage;
if FHideAllTabs and (SaveActivePage <> nil) then
SaveActivePage.TabStop := False;
end;
end;
{$IFDEF VCL}
procedure TJvPageControl.TCMAdjustRect(var Msg: TMessage);
var
Offset: Integer;
begin
inherited;
if (Msg.WParam = 0) and (FClientBorderWidth <> JvDefPageControlBorder) then
begin
Offset := JvDefPageControlBorder - FClientBorderWidth;
InflateRect(PRect(Msg.LParam)^, Offset, Offset);
end;
end;
{$ENDIF VCL}
procedure TJvPageControl.UpdateTabImages;
begin
inherited UpdateTabImages;
end;
{$IFDEF VCL}
procedure TJvPageControl.WMLButtonDown(var Msg: TWMLButtonDown);
var
hi: TTCHitTestInfo;
I, TabIndex, RealIndex: Integer;
begin
if csDesigning in ComponentState then
begin
inherited;
Exit;
end;
hi.pt.X := Msg.XPos;
hi.pt.Y := Msg.YPos;
hi.flags := 0;
TabIndex := Perform(TCM_HITTEST, 0, Longint(@hi));
I := 0;
RealIndex := 0;
while I <= TabIndex + RealIndex do
begin
if not Pages[I].TabVisible then
Inc(RealIndex);
Inc(I);
end;
RealIndex := RealIndex + TabIndex;
if (RealIndex < PageCount) and (RealIndex >= 0) and ((hi.flags and TCHT_ONITEM) <> 0) then
if not Pages[RealIndex].Enabled then
begin
Msg.Result := 0;
Exit;
end;
inherited;
end;
procedure TJvPageControl.WMRButtonDown(var Msg: TWMRButtonDown);
var
I: Integer;
R: TRect;
P: TPoint;
begin
if RightClickSelect then
begin
with Msg do
P := SmallPointToPoint(SmallPoint(XPos, YPos));
for I := 0 to PageCount -1 do
begin
R := TabRect(I);
if PtInRect(R, P) then
begin
if (ActivePageIndex <> I) and CanChange then
begin
ActivePageIndex := I;
Change;
end;
Break;
end;
end;
end;
inherited;
end;
{$ENDIF VCL}
function TJvPageControl.HintShow(var HintInfo: THintInfo): Boolean;
var
TabNo: Integer;
Tab: TTabSheet;
begin
Result := inherited HintShow(HintInfo);
if (FHintSource = hsDefault) or Result or (Self <> HintInfo.HintControl) then
Exit;
(*
hsDefault, // use default hint behaviour (i.e as regular control)
hsForceMain, // use the main controls hint even if subitems have hints
hsForceChildren, // always use subitems hints even if empty and main control has hint
hsPreferMain, // use main control hint unless empty then use subitems hints
hsPreferChildren // use subitems hints unless empty then use main control hint
);
*)
with HintInfo.CursorPos do
TabNo := IndexOfTabAt(X, Y); // X&Y are expected in Client coordinates
if (TabNo >= 0) and (TabNo < PageCount) then
Tab := Pages[TabNo]
else
Tab := nil;
if (FHintSource = hsForceMain) or ((FHintSource = hsPreferMain) and (GetShortHint(Hint) <> '')) then
HintInfo.HintStr := GetShortHint(Self.Hint)
else
if (Tab <> nil) and
((FHintSource = hsForceChildren) or ((FHintSource = hsPreferChildren) and (GetShortHint(Tab.Hint) <> '')) or
((FHintSource = hsPreferMain) and (GetShortHint(Hint) = ''))) then
begin
HintInfo.HintStr := GetShortHint(Tab.Hint);
HintInfo.CursorRect := TabRect(TabNo);
end;
end;
type
TTabSheetAccessProtected = class(TTabSheet);
function TJvPageControl.CanChange: Boolean;
begin
Result := inherited CanChange;
if Result and (ActivePage <> nil) and ReduceMemoryUse then
TTabSheetAccessProtected(ActivePage).DestroyHandle;
end;
procedure TJvPageControl.SetReduceMemoryUse(const Value: Boolean);
begin
FReduceMemoryUse := Value;
end;
procedure TJvPageControl.SetTabPainter(const Value: TJvTabControlPainter);
begin
if FTabPainter <> Value then
begin
if FTabPainter <> nil then
FTabPainter.UnRegisterChange(Self);
FTabPainter := Value;
if FTabPainter <> nil then
begin
FTabPainter.FreeNotification(Self);
FTabPainter.RegisterChange(Self);
end;
Invalidate;
end;
end;
procedure TJvPageControl.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = TabPainter) then
TabPainter := nil;
end;
{$IFDEF VisualCLX}
procedure TJvPageControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
I: Integer;
R: TRect;
P: TPoint;
begin
if RightClickSelect and (Button = mbRight) then
begin
P := Point(X,Y);
for I := 0 to PageCount -1 do
begin
R := TabRect(I);
if PtInRect(R, P) then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -