cxgrid.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,183 行 · 第 1/5 页
PAS
2,183 行
end;
procedure TcxCustomGrid.BoundsChanged;
begin
SizeChanged;
inherited;
StructureNavigatorChanged;
end;
procedure TcxCustomGrid.DoCancelMode;
begin
inherited;
FController.DoCancelMode;
end;
procedure TcxCustomGrid.DoContextPopup(MousePos: TPoint; var Handled: Boolean);
begin
inherited;
if not Handled then
Handled := SendNotifications(gnkContextMenu, TObject((MousePos.X = -1) and (MousePos.Y = -1)));
end;
procedure TcxCustomGrid.FocusChanged;
begin
inherited;
if not IsDestroying and Focused and (FocusedView <> nil) then
TcxCustomGridViewAccess.FocusChanged(FocusedView, True);
end;
procedure TcxCustomGrid.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
I: Integer;
begin
inherited;
for I := 0 to ViewCount - 1 do
if Views[I].Owner = Root then
Proc(Views[I]);
for I := 0 to FLevels.Count - 1 do
if FLevels[I].Owner = Root then
Proc(FLevels[I]);
end;
function TcxCustomGrid.GetCursor(X, Y: Integer): TCursor;
begin
Result := FController.GetCursor(X, Y);
if Result = crDefault then
Result := inherited GetCursor(X, Y);
end;
function TcxCustomGrid.GetDesignHitTest(X, Y: Integer; Shift: TShiftState): Boolean;
var
AHitTest: TcxCustomGridHitTest;
begin
Result := inherited GetDesignHitTest(X, Y, Shift);
if not Result and (ssLeft in Shift) then
begin
AHitTest := ViewInfo.GetHitTest(X, Y);
Result := AHitTest.HitTestCode = htTab;
end;
end;
function TcxCustomGrid.GetIsFocused: Boolean;
var
AForm: TCustomForm;
begin
Result := FIsPopupControl{8} or inherited GetIsFocused;
if not Result then
begin
AForm := GetParentForm(Self);
Result := (AForm <> nil) and (AForm.ActiveControl <> Self) and
ContainsControl(AForm.ActiveControl) and AForm.ActiveControl.Focused and
(not (AForm.ActiveControl is TcxControl) or TcxControl(AForm.ActiveControl).IsFocused);
end;
end;
procedure TcxCustomGrid.Loaded;
begin
inherited;
BeginUpdate;
try
LayoutChanged;
finally
EndUpdate;
end;
StructureNavigatorChanged;
end;
function TcxCustomGrid.MayFocus: Boolean;
begin
Result := False;
end;
procedure TcxCustomGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
FController.MouseDown(Button, Shift, X, Y);
end;
procedure TcxCustomGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
inherited;
FController.MouseMove(Shift, X, Y);
end;
procedure TcxCustomGrid.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
FController.MouseUp(Button, Shift, X, Y);
end;
procedure TcxCustomGrid.LookAndFeelChanged(Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues);
var
I: Integer;
begin
inherited;
//SizeChanged;
for I := 0 to ViewCount - 1 do
TcxCustomGridViewAccess.LookAndFeelChanged(Views[I]);
SizeChanged;
end;
procedure TcxCustomGrid.Paint;
begin
inherited;
FPainter.Paint;
end;
procedure TcxCustomGrid.ReadState(Reader: TReader);
begin
if StructureNavigator <> nil then StructureNavigator.BeforeGridLoading;
inherited;
end;
procedure TcxCustomGrid.SetChildOrder(Child: TComponent; Order: Integer);
begin
inherited;
if Child is TcxGridLevel then
TcxGridLevel(Child).Index := Order - ViewCount;
end;
procedure TcxCustomGrid.SetName(const NewName: TComponentName);
var
AOldName: TComponentName;
ALevels: TList;
procedure RetriveLevels;
procedure AddLevel(ALevel: TcxGridLevel);
var
I: Integer;
begin
if ALevel.Name <> '' then ALevels.Add(ALevel);
for I := 0 to ALevel.Count - 1 do
AddLevel(ALevel[I]);
end;
begin
AddLevel(Levels);
end;
begin
AOldName := Name;
inherited;
if Name <> AOldName then
begin
RenameComponents(Self, Owner, Name, AOldName, ViewCount, @cxGrid.GetView);
ALevels := TList.Create;
try
RetriveLevels;
FTag := ALevels;
RenameComponents(Self, Owner, Name, AOldName, ALevels.Count, @cxGrid.GetLevel);
finally
ALevels.Free;
end;
StructureNavigatorChanged;
end;
end;
procedure TcxCustomGrid.WndProc(var Message: TMessage);
begin
{if (Message.Msg = WM_MOUSEACTIVATE) and IsDesigning then
Exit;}
inherited WndProc(Message);
end;
procedure TcxCustomGrid.DoEndDrag(Target: TObject; X, Y: Integer);
begin
FController.EndDrag(Target, X, Y);
inherited;
end;
procedure TcxCustomGrid.DoStartDrag(var DragObject: TDragObject);
begin
inherited;
FController.StartDrag(DragObject);
end;
procedure TcxCustomGrid.DragOver(Source: TObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
inherited;
FController.DragOver(Source, X, Y, State, Accept);
end;
procedure TcxCustomGrid.CreateHandlers;
begin
FController := GetControllerClass.Create(Self);
FPainter := GetPainterClass.Create(Self);
FViewInfo := GetViewInfoClass.Create(Self);
FNavigatorNotifier := TcxNavigatorControlNotifier.Create;
CreateStructureNavigator;
end;
procedure TcxCustomGrid.DestroyHandlers;
begin
FreeAndNil(FStructureNavigator);
FreeAndNil(FNavigatorNotifier);
FreeAndNil(FViewInfo);
FreeAndNil(FPainter);
FreeAndNil(FController);
end;
procedure TcxCustomGrid.DoActiveTabChanged(ALevel: TcxGridLevel);
begin
if StructureNavigator <> nil then StructureNavigator.BringToFront;
if Assigned(FOnActiveTabChanged) then FOnActiveTabChanged(Self, ALevel);
end;
procedure TcxCustomGrid.DoChange(AGridChange: TcxCustomGridChange);
begin
try
if {IsLoading or - because of details} IsDestroying then Exit;
with AGridChange do
begin
Control := Self;
Execute;
end;
finally
AGridChange.Free;
end;
end;
procedure TcxCustomGrid.DoLayoutChanged(AGridView: TcxCustomGridView);
begin
if Assigned(FOnLayoutChanged) then FOnLayoutChanged(Self, AGridView);
end;
procedure TcxCustomGrid.DoProcessChangesStack;
begin
FProcessingChangesStack := True;
try
DoUpdate(FChangesStack);
finally
FProcessingChangesStack := False;
end;
end;
procedure TcxCustomGrid.DoUpdate(AChanges: TList);
var
AFinalChanges: TList;
procedure BuildFinalChangesList;
var
I, J: Integer;
AChange: TcxCustomGridChange;
function FinalChangesContainClass(AChange: TcxCustomGridChange): Boolean;
var
I: Integer;
begin
for I := 0 to AFinalChanges.Count - 1 do
begin
Result := TcxCustomGridChange(AFinalChanges[I]).IsEqual(AChange);
if Result then Exit;
end;
Result := False;
end;
begin
for I := 0 to AChanges.Count - 1 do
begin
AChange := TcxCustomGridChange(AChanges[I]);
if not AChange.IsCumulative or not FinalChangesContainClass(AChange) then
AFinalChanges.Add(AChange)
else
AChange.Free;
end;
AChanges.Clear;
I := 0;
while I < AFinalChanges.Count do
begin
AChange := TcxCustomGridChange(AFinalChanges[I]);
for J := I + 1 to AFinalChanges.Count - 1 do
if AChange.IsCompatibleWith(TcxCustomGridChange(AFinalChanges[J])) then
begin
AChange.Free;
AFinalChanges.Delete(I);
Dec(I);
Break;
end;
Inc(I);
end;
//!!!
for I := AFinalChanges.Count - 1 downto 0 do
begin
AChange := TcxCustomGridChange(AFinalChanges[I]);
for J := I - 1 downto 0 do
if AChange.IsCompatibleWith(TcxCustomGridChange(AFinalChanges[J])) then
begin
AChange.Free;
AFinalChanges.Delete(I);
Break;
end;
end;
end;
procedure DoFinalChanges;
var
ALockChanges: Boolean;
I: Integer;
AChange: TcxCustomGridChange;
// T: Integer;
begin
// T := GetTickCount;
if AFinalChanges.Count = 0 then Exit;
ALockChanges := AFinalChanges.Count > 1;
if ALockChanges then
BeginUpdate;
try
for I := 0 to AFinalChanges.Count - 1 do
begin
AChange := TcxCustomGridChange(AFinalChanges[I]);
if ALockChanges and not AChange.CanExecuteWhenLocked then
EndUpdate;
DoChange(AChange);
if ALockChanges and not UpdateLocked then
BeginUpdate;
end;
finally
if ALockChanges then
EndUpdate;
end;
// Application.MainForm.Caption := IntToStr(GetTickCount - T);
end;
begin
AFinalChanges := TList.Create;
try
BuildFinalChangesList;
DoFinalChanges;
finally
AFinalChanges.Free;
end;
end;
procedure TcxCustomGrid.FocusedViewChanged(APrevFocusedView, AFocusedView: TcxCustomGridView);
begin
if IsDestroying then Exit;
RefreshNavigators;
SendNotifications(gnkFocusedViewChanged);
if Assigned(FOnFocusedViewChanged) then
FOnFocusedViewChanged(Self, APrevFocusedView, AFocusedView);
end;
function TcxCustomGrid.GetControllerClass: TcxGridControllerClass;
begin
Result := TcxGridController;
end;
function TcxCustomGrid.GetDefaultViewClass: TcxCustomGridViewClass;
begin
Result := nil;
end;
function TcxCustomGrid.GetLevelsClass: TcxGridLevelClass;
begin
Result := TcxGridRootLevel;
end;
function TcxCustomGrid.GetLevelTabsClass: TcxGridLevelTabsClass;
begin
Result := TcxGridLevelTabs;
end;
function TcxCustomGrid.GetPainterClass: TcxGridPainterClass;
begin
Result := TcxGridPainter;
end;
function TcxCustomGrid.GetViewInfoClass: TcxGridViewInfoClass;
begin
Result := TcxGridViewInfo;
end;
procedure TcxCustomGrid.StructureNavigatorChanged;
begin
if StructureNavigator <> nil then StructureNavigator.Changed;
end;
function TcxCustomGrid.UpdateOnRootViewDataChange: Boolean;
begin
Result := (RootLevelOptions.DetailTabsPosition <> dtpNone) and
not RootLevelOptions.TabsForEmptyDetails;
end;
procedure TcxCustomGrid.Invalidate(AHardUpdate: Boolean = False);
procedure InvalidateView(AView: TcxCustomGridView);
var
I: Integer;
begin
if AView = nil then Exit;
AView.Invalidate(AHardUpdate);
for I := 0 to TcxGridLevel(AView.Level).VisibleCount - 1 do
InvalidateView(TcxGridLevel(AView.Level).VisibleItems[I].GridView);
end;
begin
if IsDestroying then Exit;
if AHardUpdate then
LayoutChanged
else
inherited Invalidate;
InvalidateView(ActiveView);
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?