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