📄 menus.pas
字号:
procedure TMenuItem.SetBreak(Value: TMenuBreak);
begin
if FBreak <> Value then
begin
FBreak := Value;
MenuChanged(True);
end;
end;
procedure TMenuItem.SetCaption(const Value: string);
begin
if FCaption <> Value then
begin
FCaption := Value;
MenuChanged(True);
end;
end;
procedure TMenuItem.TurnSiblingsOff;
var
I: Integer;
Item: TMenuItem;
begin
if FParent <> nil then
for I := 0 to FParent.Count - 1 do
begin
Item := FParent[I];
if (Item <> Self) and Item.FRadioItem and (Item.GroupIndex = GroupIndex) then
Item.SetChecked(False);
end;
end;
procedure TMenuItem.SetChecked(Value: Boolean);
begin
if FChecked <> Value then
begin
FChecked := Value;
if (FParent <> nil) and not (csReading in ComponentState) then
CheckMenuItem(FParent.Handle, FCommand, MF_BYCOMMAND or Checks[Value]);
if Value and FRadioItem then
TurnSiblingsOff;
end;
end;
procedure TMenuItem.SetEnabled(Value: Boolean);
begin
if FEnabled <> Value then
begin
FEnabled := Value;
if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Count <> 0)) or
((Parent <> nil) and Assigned(Parent.FMergedWith)) then
MenuChanged(True)
else
begin
if (FParent <> nil) and not (csReading in ComponentState) then
EnableMenuItem(FParent.Handle, FCommand, MF_BYCOMMAND or Enables[Value]);
MenuChanged(False);
end;
end;
end;
procedure TMenuItem.SetGroupIndex(Value: Byte);
begin
if FGroupIndex <> Value then
begin
if Parent <> nil then Parent.VerifyGroupIndex(Parent.IndexOf(Self), Value);
FGroupIndex := Value;
if FChecked and FRadioItem then
TurnSiblingsOff;
end;
end;
function TMenuItem.GetAction: TBasicAction;
begin
if FActionLink <> nil then
Result := FActionLink.Action else
Result := nil;
end;
function TMenuItem.GetActionLinkClass: TMenuActionLinkClass;
begin
Result := TMenuActionLink;
end;
function TMenuItem.GetCount: Integer;
begin
if FItems = nil then Result := 0
else Result := FItems.Count;
end;
function TMenuItem.GetItem(Index: Integer): TMenuItem;
begin
if FItems = nil then Error(@SMenuIndexError);
Result := FItems[Index];
end;
procedure TMenuItem.SetShortCut(Value: TShortCut);
begin
if FShortCut <> Value then
begin
FShortCut := Value;
MenuChanged(True);
end;
end;
procedure TMenuItem.SetVisible(Value: Boolean);
begin
if Value <> FVisible then
begin
FVisible := Value;
MenuChanged(True);
end;
end;
procedure TMenuItem.SetImageIndex(Value: TImageIndex);
begin
if Value <> FImageIndex then
begin
FImageIndex := Value;
MenuChanged(True);
end;
end;
function TMenuItem.GetMenuIndex: Integer;
begin
Result := -1;
if FParent <> nil then Result := FParent.IndexOf(Self);
end;
procedure TMenuItem.SetMenuIndex(Value: Integer);
var
Parent: TMenuItem;
Count: Integer;
begin
if FParent <> nil then
begin
Count := FParent.Count;
if Value < 0 then Value := 0;
if Value >= Count then Value := Count - 1;
if Value <> MenuIndex then
begin
Parent := FParent;
Parent.Remove(Self);
Parent.Insert(Value, Self);
end;
end;
end;
procedure TMenuItem.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
I: Integer;
begin
for I := 0 to Count - 1 do Proc(Items[I]);
end;
procedure TMenuItem.SetChildOrder(Child: TComponent; Order: Integer);
begin
(Child as TMenuItem).MenuIndex := Order;
end;
procedure TMenuItem.SetDefault(Value: Boolean);
var
I: Integer;
begin
if FDefault <> Value then
begin
if Value and (FParent <> nil) then
for I := 0 to FParent.Count - 1 do
if FParent[I].Default then FParent[I].FDefault := False;
FDefault := Value;
MenuChanged(True);
end;
end;
procedure TMenuItem.InitiateAction;
begin
if FActionLink <> nil then FActionLink.Update;
end;
procedure TMenuItem.Insert(Index: Integer; Item: TMenuItem);
begin
if Item.FParent <> nil then Error(@SMenuReinserted);
if FItems = nil then FItems := TList.Create;
if (Index - 1 >= 0) and (Index - 1 < FItems.Count) then
if Item.GroupIndex < TMenuItem(FItems[Index - 1]).GroupIndex then
Item.GroupIndex := TMenuItem(FItems[Index - 1]).GroupIndex;
VerifyGroupIndex(Index, Item.GroupIndex);
FItems.Insert(Index, Item);
Item.FParent := Self;
Item.FOnChange := SubItemChanged;
if FHandle <> 0 then RebuildHandle;
MenuChanged(Count = 1);
end;
procedure TMenuItem.Delete(Index: Integer);
var
Cur: TMenuItem;
begin
if (Index < 0) or (FItems = nil) or (Index >= GetCount) then Error(@SMenuIndexError);
Cur := FItems[Index];
FItems.Delete(Index);
Cur.FParent := nil;
Cur.FOnChange := nil;
if FHandle <> 0 then RebuildHandle;
MenuChanged(Count = 0);
end;
procedure TMenuItem.Click;
begin
if Enabled then
begin
if (not Assigned(ActionLink) and AutoCheck) or (Assigned(ActionLink) and
not (ActionLink.IsAutoCheckLinked) and AutoCheck) then
Checked := not Checked;
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
FActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
end;
end;
function TMenuItem.IndexOf(Item: TMenuItem): Integer;
begin
Result := -1;
if FItems <> nil then Result := FItems.IndexOf(Item);
end;
procedure TMenuItem.Add(Item: TMenuItem);
begin
Insert(GetCount, Item);
end;
procedure TMenuItem.Remove(Item: TMenuItem);
var
I: Integer;
begin
I := IndexOf(Item);
if I = -1 then Error(@SMenuNotFound);
Delete(I);
end;
procedure TMenuItem.MenuChanged(Rebuild: Boolean);
var
Source: TMenuItem;
begin
if (Parent = nil) and (Owner is TMenu) then
Source := nil else
Source := Self;
if Assigned(FOnChange) then FOnChange(Self, Source, Rebuild);
end;
procedure TMenuItem.SubItemChanged(Sender: TObject; Source: TMenuItem; Rebuild: Boolean);
begin
if Rebuild and ((FHandle <> 0) or Assigned(FMergedWith)) then RebuildHandle;
if Parent <> nil then Parent.SubItemChanged(Self, Source, False)
else if Owner is TMainMenu then TMainMenu(Owner).ItemChanged;
end;
function TMenuItem.GetBitmap: TBitmap;
begin
if FBitmap = nil then FBitmap := TBitmap.Create;
FBitmap.Transparent := True;
Result := FBitmap;
end;
procedure TMenuItem.SetAction(Value: TBasicAction);
begin
if Value = nil then
begin
FActionLink.Free;
FActionLink := nil;
end
else
begin
if FActionLink = nil then
FActionLink := GetActionLinkClass.Create(Self);
FActionLink.Action := Value;
FActionLink.OnChange := DoActionChange;
ActionChange(Value, csLoading in Value.ComponentState);
Value.FreeNotification(Self);
end;
end;
procedure TMenuItem.SetBitmap(Value: TBitmap);
begin
if FBitmap = nil then FBitmap := TBitmap.Create;
FBitmap.Assign(Value);
MenuChanged(True);
end;
procedure TMenuItem.InitiateActions;
var
I: Integer;
begin
for I := 0 to Count - 1 do
Items[I].InitiateAction;
end;
function TMenuItem.GetParentComponent: TComponent;
begin
if (FParent <> nil) and (FParent.FMenu <> nil) then
Result := FParent.FMenu else
Result := FParent;
end;
procedure TMenuItem.SetParentComponent(Value: TComponent);
begin
if FParent <> nil then FParent.Remove(Self);
if Value <> nil then
if Value is TMenu then
TMenu(Value).Items.Add(Self)
else if Value is TMenuItem then
TMenuItem(Value).Add(Self);
end;
function TMenuItem.GetParentMenu: TMenu;
var
MenuItem: TMenuItem;
begin
MenuItem := Self;
while Assigned(MenuItem.FParent) do MenuItem := MenuItem.FParent;
Result := MenuItem.FMenu
end;
procedure TMenuItem.SetRadioItem(Value: Boolean);
begin
if FRadioItem <> Value then
begin
FRadioItem := Value;
if FChecked and FRadioItem then
TurnSiblingsOff;
MenuChanged(True);
end;
end;
procedure TMenuItem.ActionChange(Sender: TObject; CheckDefaults: Boolean);
begin
if Sender is TCustomAction then
with TCustomAction(Sender) do
begin
if not CheckDefaults or (Self.AutoCheck = False) then
Self.AutoCheck := AutoCheck;
if not CheckDefaults or (Self.Caption = '') then
Self.Caption := Caption;
if not CheckDefaults or (Self.Checked = False) then
Self.Checked := Checked;
if not CheckDefaults or (Self.Enabled = True) then
Self.Enabled := Enabled;
if not CheckDefaults or (Self.HelpContext = 0) then
Self.HelpContext := HelpContext;
if not CheckDefaults or (Self.Hint = '') then
Self.Hint := Hint;
if RadioItem and (not CheckDefaults or (Self.GroupIndex = 0)) then
Self.GroupIndex := GroupIndex;
if not CheckDefaults or (Self.ImageIndex = -1) then
Self.ImageIndex := ImageIndex;
if not CheckDefaults or (Self.ShortCut = scNone) then
Self.ShortCut := ShortCut;
if not CheckDefaults or (Self.Visible = True) then
Self.Visible := Visible;
if not CheckDefaults or not Assigned(Self.OnClick) then
Self.OnClick := OnExecute;
end;
end;
procedure TMenuItem.DoActionChange(Sender: TObject);
begin
if Sender = Action then ActionChange(Sender, False);
end;
function TMenuItem.IsCaptionStored: Boolean;
begin
Result := (ActionLink = nil) or not FActionLink.IsCaptionLinked;
end;
function TMenuItem.IsCheckedStored: Boolean;
begin
Result := (ActionLink = nil) or not FActionLink.IsCheckedLinked;
end;
function TMenuItem.IsEnabledStored: Boolean;
begin
Result := (ActionLink = nil) or not FActionLink.IsEnabledLinked;
end;
function TMenuItem.IsHintStored: Boolean;
begin
Result := (ActionLink = nil) or not FActionLink.IsHintLinked;
end;
function TMenuItem.IsHelpContextStored: Boolean;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -