cxgridcommon.pas

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

PAS
614
字号
var
  I: Integer;
begin
  for I := 0 to Items.Count - 1 do
    TOptionTreeNodeData(Items[I].Data).Free;
  Items.Clear;
end;

function TcxGridOptionsTreeView.FindNodeByID(AID: Integer): TTreeNode;
var
  I: Integer;
begin
  for I := 0 to Items.Count - 1 do
  begin
    Result := Items[I];
    if GetNodeID(Result) = AID then Exit;
  end;
  Result := nil;
end;

function TcxGridOptionsTreeView.GetItemImageIndex(AKind: TcxGridOptionsTreeViewItemKind;
  AChecked: Boolean): Integer;
begin
  Result := 2 * Ord(AKind) + Ord(AChecked);
end;

function TcxGridOptionsTreeView.GetNodeID(ANode: TTreeNode): Integer;
begin
  Result := TOptionTreeNodeData(ANode.Data).ID;
end;

function TcxGridOptionsTreeView.GetNodeKind(ANode: TTreeNode): TcxGridOptionsTreeViewItemKind;
begin
  Result := TOptionTreeNodeData(ANode.Data).Kind;
end;

function TcxGridOptionsTreeView.GetNodeParentID(ANode: TTreeNode): Integer;
begin
  if ANode.Parent = nil then
    Result := -1
  else
    Result := GetNodeID(ANode.Parent);
end;

procedure TcxGridOptionsTreeView.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited;
  if (Key = VK_SPACE) and (Selected <> nil) then
    NodeClicked(Selected);
end;

procedure TcxGridOptionsTreeView.MouseDown(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ANode: TTreeNode;
begin
  if Button = mbLeft then
  begin
    ANode := GetNodeAt(X, Y);
    if (ANode <> nil) and (htOnItem in GetHitTestInfoAt(X, Y)) then
      NodeClicked(ANode);
  end;
  inherited;
end;

procedure TcxGridOptionsTreeView.NodeClicked(ANode: TTreeNode);
begin
  ItemValuesUpdateLocked := True;
  try
    ItemClicked(GetNodeParentID(ANode), GetNodeID(ANode));
  finally
    ItemValuesUpdateLocked := False;
  end;
  RefreshItemValues;
end;

procedure TcxGridOptionsTreeView.RefreshImages;
var
  AImage: TBitmap;
  AImageCanvas: TcxCanvas;
  AImageRect: TRect;
  AItemKind: TcxGridOptionsTreeViewItemKind;
  AChecked: Boolean;
begin
  if IsDestroying then Exit;

  Images.Clear;
  with CalculateImagesSize do
  begin
    Images.Width := cx;
    Images.Height := cy;
  end;

  AImage := TBitmap.Create;
  try
    AImage.Width := Images.Width;
    AImage.Height := Images.Height;
    AImageCanvas := TcxCanvas.Create(AImage.Canvas);
    try
      AImageRect := Rect(0, 0, AImage.Width, AImage.Height);
      for AItemKind := Low(AItemKind) to High(AItemKind) do
        for AChecked := Low(AChecked) to High(AChecked) do
        begin
          AImage.Canvas.Brush.Color := Color;
          AImage.Canvas.FillRect(AImageRect);
          DrawImage(AImageCanvas, AImageRect, AItemKind, AChecked);
          Images.Add(AImage, nil);
        end;
    finally
      AImageCanvas.Free;
    end;
  finally
    AImage.Free;
  end;
end;

procedure TcxGridOptionsTreeView.RefreshItemImageIndexes;
var
  I: Integer;
  ANode: TTreeNode;
begin
  Items.BeginUpdate;
  try
    for I := 0 to Items.Count - 1 do
    begin
      ANode := Items[I];
      ANode.ImageIndex := GetItemImageIndex(GetNodeKind(ANode),
        IsItemChecked(GetNodeParentID(ANode), GetNodeID(ANode)));
      ANode.SelectedIndex := ANode.ImageIndex;
    end;
  finally
    Items.EndUpdate;
  end;
end;

procedure TcxGridOptionsTreeView.ResetMaxID;
begin
  FMaxID := OptionsTreeViewMaxInternalID;
end;

function TcxGridOptionsTreeView.CalculateImagesSize: TSize;
begin
  Result := GetCategorySize;
  Result.cx := Max(Result.cx, Max(GetCheckBoxSize.cx, GetRadioButtonSize.cx));
  Result.cy := Max(Result.cy, Max(GetCheckBoxSize.cy, GetRadioButtonSize.cy));
end;

procedure TcxGridOptionsTreeView.DrawImage(ACanvas: TcxCanvas; const ARect: TRect;
  AItemKind: TcxGridOptionsTreeViewItemKind; AChecked: Boolean);
var
  R: TRect;
  B: TBitmap;
begin
  R := ARect;
  case AItemKind of
    otikCategory:
      begin
        R := cxRectCenter(R, GetCategorySize);
        B := GetCategoryBitmap;
        try
          if AChecked then
            ACanvas.RotateBitmap(B, raMinus90);
          ACanvas.DrawGlyph(R.Left, R.Top, B);
        finally
          B.Free;
        end;
      end;
    otikCheckBox:
      begin
        R := cxRectCenter(R, GetCheckBoxSize);
        LookAndFeelPainter.DrawCheckButton(ACanvas, R, cxbsNormal, AChecked);
      end;
    otikRadioButton:
      begin
        R := cxRectCenter(R, GetRadioButtonSize);
        LookAndFeelPainter.DrawRadioButton(ACanvas, R.Left, R.Top, cxbsNormal,
          AChecked, False, ACanvas.Brush.Color);
      end;
  end;
end;

function TcxGridOptionsTreeView.GetCategoryBitmap: TBitmap;
begin
  Result := TBitmap.Create;
  Result.LoadFromResourceName(HInstance, 'CXGRIDOPTIONSTREEVIEWCATEGORYBITMAP');
end;

function TcxGridOptionsTreeView.GetCategorySize: TSize;
begin
  with GetCategoryBitmap do
    try
      Result.cx := Width;
      Result.cy := Height;
    finally
      Free;
    end;
end;

function TcxGridOptionsTreeView.GetCheckBoxSize: TSize;
begin
  Result := LookAndFeelPainter.CheckButtonSize;
end;

function TcxGridOptionsTreeView.GetRadioButtonSize: TSize;
begin
  Result := LookAndFeelPainter.RadioButtonSize;
end;

function TcxGridOptionsTreeView.AddCategory(AParentID, AID: Integer;
  const ACaption: string): Integer;
begin
  Result := AddItem(AParentID, AID, ACaption, otikCategory);
end;

function TcxGridOptionsTreeView.AddCheckBox(AParentID, AID: Integer;
  const ACaption: string): Integer;
begin
  Result := AddItem(AParentID, AID, ACaption, otikCheckBox);
end;

function TcxGridOptionsTreeView.AddRadioButton(AParentID, AID: Integer;
  const ACaption: string): Integer;
begin
  Result := AddItem(AParentID, AID, ACaption, otikRadioButton);
end;

procedure TcxGridOptionsTreeView.AddRadioButtons(AParentID: Integer;
  ATypeInfo: PTypeInfo; AGetTypeItemCaption: TcxGridOptionsTreeViewGetTypeItemCaptionFunction);
var
  ATypeData: PTypeData;
  I: Integer;
begin
  if ATypeInfo.Kind <> tkEnumeration then Exit;
  ATypeData := GetTypeData(ATypeInfo);
  for I := ATypeData.MinValue to ATypeData.MaxValue do
    AddRadioButton(AParentID, I, AGetTypeItemCaption(I));
end;

procedure TcxGridOptionsTreeView.RefreshItems;
begin
  Items.BeginUpdate;
  try
    ClearItems;
    ResetMaxID;
    AddItems;
    RefreshItemValues;
    FullExpand;
    TopItem := Items.GetFirstNode;
  finally
    Items.EndUpdate;
  end;
end;

procedure TcxGridOptionsTreeView.RefreshItemValues;
begin
  if not ItemValuesUpdateLocked then
    RefreshItemImageIndexes;
end;

{ functions }

function GetValidName(AComponent: TComponent; const AName: string;
  AIsBaseName: Boolean = False): string;
var
  AOwner: TComponent;
  I: Integer;

  function GetNextName: string;
  begin
    Result := AName + IntToStr(I);
    Inc(I);
  end;

begin
  Result := AName;
  AOwner := AComponent.Owner;
  if AOwner = nil then Exit;
  I := 1;
  if AIsBaseName then Result := GetNextName;
  while AOwner.FindComponent(Result) <> nil do
    Result := GetNextName;
end;

procedure GetCellTextAreaSize(var ATextSize: Integer);
begin
  Inc(ATextSize, 2 * cxGridCellTextOffset);
end;

function GridCellStateToButtonState(ACellState: TcxGridCellState): TcxButtonState;
const
  ButtonStates: array[TcxGridCellState] of TcxButtonState =
    (cxbsNormal, cxbsHot, cxbsPressed);
begin
  Result := ButtonStates[ACellState];
end;

initialization
  crcxGridHorzSize := crcxHorzSize;
  crcxGridVertSize := crcxVertSize;
  crcxGridRemove := crcxRemove;
  crcxGridNoDrop := crcxNoDrop;
  crcxGridDrag := crcxDrag;
  crcxGridMultiDrag := crcxDragMulti;
  Screen.Cursors[crcxGridSelectRow] := LoadCursor(HInstance, 'CX_GRIDSELECTROWCURSOR');

end.

⌨️ 快捷键说明

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