cxgridpopupmenu.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 482 行 · 第 1/2 页

PAS
482
字号
  AdjustMenuInfo(GetPopupMenuInfo(AMenu, AView), AMenu, AHitTypes, ADoPopupProc,
    nil, AView);
end;

procedure TcxGridPopupMenu.RegisterPopupMenu(const AMenu: TComponent;
  AHitTypes: TcxGridViewHitTypes; ADoPopupProc: TcxGridOnPopupProc;
  AViewClass: TcxCustomGridViewClass);
begin
  FGridDefaultPopupMenu.RegisterPopupMenu(AMenu, AHitTypes, ADoPopupProc, AViewClass);
end;

procedure TcxGridPopupMenu.UnregisterPopupMenu(const AMenu: TComponent;
          const AGridView: TcxCustomGridView; AHitTypes: TcxGridViewHitTypes);
var
  AMenuInfo: TcxPopupMenuInfo;
begin
  AMenuInfo := GetPopupMenuInfo(AMenu, AGridView, false);
  If (AMenuInfo <> nil) then
    If AMenuInfo.HitTypes = AHitTypes then
      AMenuInfo.Free
    else
      AMenuInfo.HitTypes := AMenuInfo.HitTypes - AHitTypes;
end;

procedure TcxGridPopupMenu.UnregisterPopupMenu(const AMenu: TComponent;
  AGridViewClass: TcxCustomGridViewClass; AHitTypes: TcxGridViewHitTypes = []);
begin
  FGridDefaultPopupMenu.UnRegisterPopupMenu(AMenu, AGridViewClass, AHitTypes);
end;

function TcxGridPopupMenu.DoOnPopup(ASenderMenu: TComponent;
  AHitTest: TcxCustomGridHitTest; X,
  Y: Integer): Boolean;
begin
  Result := True;
  if Assigned(FOnPopup) then
    FOnPopup(ASenderMenu, AHitTest, X, Y, Result);
end;

function TcxGridPopupMenu.DoPopup(AAPPSKeyPressed: Boolean): Boolean;

  function DoAutoPopup(AMenuInfo:TcxPopupMenuInfo; AHitTest: TcxCustomGridHitTest;
    APoint: TPoint): Boolean;
  begin
    Result := Assigned(AMenuInfo.PopupMenu);
    if Result then
      Result := TryPopupAsIDoPopupIntf(AMenuInfo.PopupMenu, AHitTest, APoint) or
        TryPopupAsIcxPopupMenuIntf(AMenuInfo.PopupMenu, AHitTest, APoint) or
        TryPopupAsVCLPopupMenu(AMenuInfo.PopupMenu, AHitTest, APoint);
  end;

  function DoPopupByAPPSKey(var AHitCode: Integer; var APoint: TPoint): Boolean;
  var
    AViewInfo: TcxCustomGridCellViewInfo;
    ABounds: TRect;
  begin
    Result := FHitGridView is TcxCustomGridTableView;
    if not Result then Exit;
    with TcxCustomGridTableView(FHitGridView).Controller do
    begin
      if (FocusedRecord <> nil) then
      begin
        if not FocusedRecord.Visible then
          MakeFocusedRecordVisible;
        if (FocusedItem <> nil) and (FocusedItem.FocusedCellViewInfo <> nil) then
        begin
          ABounds := FocusedItem.FocusedCellViewInfo.ContentBounds;
          AViewInfo := FocusedItem.FocusedCellViewInfo;
        end
        else
        begin
          ABounds := FocusedRecord.ViewInfo.ContentBounds;
          if ABounds.Left < 0 then
             ABounds.Left := 0;
          AViewInfo := FocusedRecord.ViewInfo;
        end;
        with ABounds do
          APoint := Point(Left, Bottom);
        FHitTest := TcxCustomGridCellViewInfoAccess(AViewInfo).GetHitTestClass.Instance(APoint);
        TcxCustomGridCellViewInfoAccess(AViewInfo).InitHitTest(FHitTest);
      end
      else
      begin
        APoint := Point(0,0);
        FHitTest := TcxGridViewNoneHitTest.Instance(APoint);
        TcxCustomGridViewInfoAccess(FHitGridView.Site.ViewInfo).InitHitTest(FHitTest);
      end;
      AHitCode := FHitTest.HitTestCode;
      FHitPoint := APoint;
      APoint := FHitGridView.Site.ClientToScreen(APoint);
    end;
  end;

  function InternalPopup(AHitType: TcxGridViewHitType; APoint: TPoint;
    AHitTest: TcxCustomGridHitTest): Boolean;
  var
    AMenuInfo: TcxPopupMenuInfo;
  begin
    Result := False;
    if FHitGridView = nil then Exit;
    AMenuInfo := FindPopupMenuInfo(FHitGridView.PatternGridView, AHitType, AHitTest);
    if AMenuInfo = nil then
      Exit;
    if Assigned(AMenuInfo.OnPopup) then
    begin
      if Assigned(AMenuInfo.PopupMenu) or FAlwaysFireOnPopup then
      begin
        if DoOnPopup(AMenuInfo.PopupMenu, AHitTest, APoint.X, APoint.Y) then
          AMenuInfo.OnPopup(AMenuInfo.PopupMenu, AHitTest, APoint.X, APoint.Y);
        Result := True;
      end;
    end
    else
      Result := DoAutoPopup(AMenuInfo, AHitTest, APoint);
  end;

var
  AHitCode: Integer;
  APoint: TPoint;
begin
  Result := True;
  FHitGridView := Grid.FocusedView;
  ActiveGridPopupMenu := Self;
  AHitCode := 0;
  if AAPPSKeyPressed then
    Result := DoPopupByAPPSKey(AHitCode, APoint)
  else
  begin
    GetCursorPos(APoint);
    FHitPoint := Grid.ScreenToClient(APoint);
    FHitTest := Grid.ViewInfo.GetHitTest(FHitPoint.X, FHitPoint.Y);
    AHitCode := FHitTest.HitTestCode;
    if (FHitGridView = nil) or
      not PtInRect(FHitGridView.Site.ClientRect, FHitGridView.Site.ScreenToClient(APoint)) then
      AHitCode := AHitCode + cxhtGridBase;
  end;
  if Result then
  begin
    FHitType := GetHitTypeByHitCode(AHitCode);
    Result := InternalPopup(FHitType, APoint, FHitTest);
  end;
end;

procedure TcxGridPopupMenu.CreateBuiltInPopupMenus;
begin
  BuiltInPopupMenuList.RegisterItemsTo(FGridDefaultPopupMenu);
end;

procedure TcxGridPopupMenu.FreeBuiltInPopupMenus;
var
  I: Integer;
begin
  for I := FGridDefaultPopupMenu.Count - 1 downto 0 do
    if FGridDefaultPopupMenu[I].IsBuiltIn then
      FGridDefaultPopupMenu[I].Free;
end;

function TcxGridPopupMenu.GetPopupMenus: TcxPopupMenuInfos;
begin
  Result := PopupMenuInfos;
end;

procedure TcxGridPopupMenu.SetUseBuiltInPopupMenus(const Value: Boolean);
begin
  if FUseBuiltInPopupMenus <> Value then
    if Value then
      CreateBuiltInPopupMenus
    else
      FreeBuiltInPopupMenus;
  FUseBuiltInPopupMenus := Value;
end;

procedure TcxGridPopupMenu.SetGrid(const AValue: TcxGrid);
begin
  if FGrid <> AValue then
  begin
    FGridOperationHelper.Grid := AValue;
    if (FGrid <> nil) and not (csDestroying in FGrid.ComponentState) then
    begin
      FGrid.UnregisterNotification(FMouseupNotification);
      FGrid.RemoveFreeNotification(self);
      ClearMenuInfosGridView;
    end;
    FGrid := AValue;
    if FGrid <> nil then
    begin
      FGrid.FreeNotification(self);
      FGrid.RegisterNotification(FMouseupNotification);
    end;
  end;
end;

procedure TcxGridPopupMenu.SetPopupMenus(const AValue: TcxPopupMenuInfos);
begin
  PopupMenuInfos.Assign(AValue);
end;

function TcxGridPopupMenu.TryPopupAsIcxPopupMenuIntf(APopupMenu: TComponent;
  AHitTest: TcxCustomGridHitTest; APoint: TPoint): Boolean;
var
  AIcxPopupMenuIntf: IcxPopupMenu;
begin
  Result := False;
  if APopupMenu = nil then
    Exit;
  Result := Supports(APopupMenu, IcxPopupMenu, AIcxPopupMenuIntf);
  if Result and DoOnPopup(APopupMenu, AHitTest, APoint.X, APoint.Y) then
      AIcxPopupMenuIntf.Popup(APoint.X, APoint.Y);
end;

function TcxGridPopupMenu.TryPopupAsIDoPopupIntf(APopupMenu: TComponent;
  AHitTest: TcxCustomGridHitTest; APoint: TPoint): Boolean;
var
  AIDoPopupIntf: IDoPopup;
begin
  Result := False;
  if APopupMenu = nil then
    Exit;
  Result := Supports(APopupMenu, IDoPopup, AIDoPopupIntf);
  if Result and DoOnPopup(APopupMenu, AHitTest, APoint.X, APoint.Y) then
      TcxGridOnPopupProc(AIDoPopupIntf.GetPopupHandler)(
        APopupMenu, AHitTest, APoint.X, APoint.Y);
end;

function TcxGridPopupMenu.TryPopupAsVCLPopupMenu(APopupMenu: TComponent;
  AHitTest: TcxCustomGridHitTest; APoint: TPoint): Boolean;
begin
  Result := False;
  if APopupMenu = nil then
    Exit;
  Result :=
    (APopupMenu is TPopupMenu) or (APopupMenu.InheritsFrom(TPopupMenu));
  if Result and DoOnPopup(APopupMenu, AHitTest, APoint.X, APoint.Y) then
  begin
    TPopupMenu(APopupMenu).PopupComponent := FHitGridView;
    TPopupMenu(APopupMenu).Popup(APoint.X, APoint.Y);
  end;
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?