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 + -
显示快捷键?