adbgrid.pas

来自「delphi编程控件」· PAS 代码 · 共 2,096 行 · 第 1/5 页

PAS
2,096 行
字号
                AColumn.FLevelIndex := AColumns.LevelItems[i, j].LevelIndex;
                AColumn.FWidth := AColumns.LevelItems[i, j].Width;
              end;
            end;  
          end;
    end;
    FAssignFlag := False;
  end else inherited Assign(Source);
end;

function TAutoGridColumns.GetLevelColumnCount(Index : Integer) : Integer;
Var
  i : Integer;
begin
  Result := 0;
  for i := 0 to Count - 1 do
    if(Items[i].FLevel = Index)then Inc(Result);
end;

procedure TAutoGridColumns.GetLevelColumnList(Index : Integer; List : TList);
Var
  i, j : Integer;
begin
  List.Clear;
  for i := 0 to Count - 1 do
    if(Items[i].FLevel = Index)then begin
      for j := 0 to List.Count - 1 do
        if(TAutoGridColumn(List[j]).FLevelIndex > Items[i].FLevelIndex) then
          break;
      if(j >= List.Count) Or (List.Count = 0) then
        List.Add(Items[i])
      else List.Insert(j, Items[i]);
    end;
end;

function TAutoGridColumns.GetItem(Index : Integer) : TAutoGridColumn;
begin
  Result := TAutoGridColumn(inherited Items[Index]);
end;

function TAutoGridColumns.GetLevelItem(Index1, Index2 : Integer) : TAutoGridColumn;
Var
  i : Integer;
begin
  Result := Nil;
  if(Index1 < GridLayout.FLevels) then
    for i := 0 to Count - 1 do
      if(Items[i].FLevel = Index1) And (Items[i].FLevelIndex = Index2) then begin
         Result := Items[i];
         break;
      end;
end;

procedure TAutoGridColumns.SetItem(Index : Integer; Value : TAutoGridColumn);
begin
  Items[Index].Assign(Value);
end;

function TAutoGridColumns.GetGridLayout : TAutoGridLayout;
begin
  Result := FGroup.GridLayout;
end;

function TAutoGridColumns.GetGroups : TAutoGridGroups;
begin
  Result := FGroup.Groups;
end;

procedure TAutoGridColumns.LevelsChanged;
Var
  OldMaxLevels, i, j : Integer;
  List, List1 : TList;
begin
  if(Count < 2) then exit;
  OldMaxLevels := 0;
  for i := 0 to Count - 1 do
    if(OldMaxLevels < Items[i].FLevel) then
      OldMaxLevels := Items[i].FLevel;

  if(OldMaxLevels = GridLayout.FLevels - 1) then exit;

  if(OldMaxLevels > GridLayout.FLevels - 1) then begin
    for i := 0 to Count - 1 do
      if(Items[i].FLevel >= GridLayout.FLevels) then
        Items[i].Level := GridLayout.FLevels - 1;
  end else begin
    List := TList.Create;
    List1 := TList.Create;
    if(GridLayout.FLevels >= Count) then begin
      for i := 0 to OldMaxLevels do begin
        GetLevelColumnList(i, List1);
        for j := 0 to List1.Count - 1 do
          List.Add(List1[j]);
      end;
      for i := 0 to List.Count - 1 do
        TAutoGridColumn(List[i]).Level := i;
    end else begin
      i := OldMaxLevels;
      while List.Count < GridLayout.FLevels - OldMaxLevels do begin
        if(List1.Count = 0) then begin
          GetLevelColumnList(i, List1);
          Dec(i);
        end;
        if(List1.Count > 0) then begin
          List.Add(List1[List1.Count - 1]);
          List1.Delete(List1.Count - 1);
        end;
      end;
      j := GridLayout.FLevels - 1;
      for i := 0 to List.Count - 1 do begin
        TAutoGridColumn(List[i]).Level := j;
        Dec(j);
      end;
    end;
    List.Free;
    List1.Free;
  end;
end;

procedure TAutoGridColumns.UpdateColumnWidth(Level : Integer; AColumn : TAutoGridColumn);
  function GetSum : Integer;
  Var
    i : Integer;
  begin
    Result := 0;
    for i := 0 to Count - 1 do
      if(Items[i].FLevel = Level) then
        Inc(Result, Items[i].FWidth);
  end;

Var
  i, j, dif, delta, colsum, AGroupWidth : Integer;
  List : TList;
begin
  if(Level >= GridLayout.FLevels) Or (Level < 0)
  Or (csLoading in GridLayout.FOwner.ComponentState)
  Or (GetLevelColumnCount(Level) = 0) then  exit;

  List := TList.Create;
  GetLevelColumnList(Level, List);

  if(List.Count = 1) then
    TAutoGridColumn(List[0]).FWidth := FGroup.Width
  else begin
    colsum := GetSum;
    AGroupWidth := FGroup.Width - AutoDBGridLineWidth * (List.Count - 1);
    j := 2;
    if(AColumn <> Nil) And (AColumn.FLevelIndex = List.Count - 1) then
      Inc(j);
    while AGroupWidth <> colSum do begin
      colsum := GetSum;
      dif := AGroupWidth - colSum;
      if(List.Count - j < 0) then
        i := 0
      else begin
        for i := 0 to List.Count - j do
          if(TAutoGridColumn(List[i]) <> AColumn) then begin
            Delta := (dif * TAutoGridColumn(List[i]).FWidth) div colSum;
            if(TAutoGridColumn(List[i]).FWidth + Delta >= AutoDBGridMinColWidth) then
              Inc(TAutoGridColumn(List[i]).FWidth, Delta);
          end;
        if(List.Count - j > -1) then
          i := List.Count - j + 1
        else i := 0;  
      end;
      dif := AGroupWidth - GetSum;
      if(TAutoGridColumn(List[i]).FWidth + dif >= AutoDBGridMinColWidth) then
        Inc(TAutoGridColumn(List[i]).FWidth, dif);
    end;
  end;
  List.Free;
end;

procedure TAutoGridColumns.UpdateLevelIndex(Level : Integer);
Var
  i, j : Integer;
  List : TList;
begin
  List := TList.Create;
  GetLevelColumnList(Level, List);
  if(List.Count > 0) then
    for i := 0 to List.Count - 1 do
      TAutoGridColumn(List[i]).FLevelIndex := i
  else begin
    for j := Level + 1 to GridLayout.Levels - 1 do begin
      GetLevelColumnList(j, List);    
      for i := 0 to List.Count - 1 do
        TAutoGridColumn(List[i]).FLevel := j - 1;
    end;
  end;    
  List.Free;  
end;

{TAutoGridGroup}
constructor TAutoGridGroup.Create(Collection : TCollection);
begin
  inherited Create(Collection);
  Groups := TAutoGridGroups(Collection);
  FColumns := TAutoGridColumns.Create(self);
  FWidth := 150;
  FFont := TFont.Create;
  FFont.Assign(DefaultFont);  
  FFont.OnChange := FontChanged;
  FCaption := LoadStr(ACDB_GRIDNEWGROUP);
end;

destructor TAutoGridGroup.Destroy;
begin
  FFont.Free;
  FColumns.Free;
  inherited Destroy;
end;

function TAutoGridGroup.GetGridLayout : TAutoGridLayout;
begin
  Result := Groups.GridLayout;
end;

function TAutoGridGroup.GetAlignment : TAlignment;
begin
  if ggvAlignment in FAssignedValues then
    Result := FAlignment
  else Result := DefaultAlignment;
end;

function TAutoGridGroup.GetColor : TColor;
begin
  if ggvColor in FAssignedValues then
    Result := FColor
  else Result := DefaultColor;
end;

function TAutoGridGroup.GetFont : TFont;
begin
  if (ggvFont in FAssignedValues)
  or (csLoading in GridLayout.Owner.ComponentState) then
    Result := FFont
  else Result := DefaultFont;
end;

function TAutoGridGroup.GetLeft : Integer;
Var
  i : Integer;
begin
  Result := GridLayout.IndicatorOffset;
  if(Result > AutoDBGridLineWidth) then
    Inc(Result, AutoDBGridLineWidth);
  for i := 0 to Index - 1 do
    Inc(Result, Groups[i].FWidth + AutoDBGridLineWidth);
  if(Index >= GridLayout.FixedGroups) then
    Dec(Result, Groups.GetLeftVis);
end;

function TAutoGridGroup.GetVisibleLeft : Integer;
begin
  Result := Left;
  if(Index >= GridLayout.FixedGroups) then begin
    if(Result < GridLayout.FixedOffSet + GridLayout.IndicatorOffSet) then
      Result := GridLayout.FixedOffSet + GridLayout.IndicatorOffSet;
  end else
    if (Result < GridLayout.IndicatorOffSet) then
      Result := GridLayout.IndicatorOffSet;
end;

function TAutoGridGroup.GetLevels : Integer;
Var
  i : Integer;
begin
  Result := 0;
  if(Columns.Count > 0) then begin
    for i := 0 to Columns.Count - 1 do
      if(Result <= Columns[i].Level) then
        Result := Columns[i].Level + 1;
  end;
end;

function TAutoGridGroup.GetMinWidth : Integer;
Var
  MaxColCount : Integer;
  i : Integer;
begin
  if(Columns.Count = 0) then
    Result := AutoDBGridMinColWidth
  else begin
    MaxColCount := 1;
    for i := 0 to GridLayout.FLevels - 1 do
      if(MaxColCount < Columns.GetLevelColumnCount(i)) then
        MaxColCount := Columns.GetLevelColumnCount(i);
    Result := AutoDBGridMinColWidth * MaxColCount;
  end;
end;

function TAutoGridGroup.GetRect : TRect;
begin
  SetRect(Result, Left, 0, Right, GridLayout.GroupOffSet);
end;

function TAutoGridGroup.GetRight : Integer;
begin
  Result := Left + Width;
end;

procedure TAutoGridGroup.SetCaption(Value : String);
begin
  if(FCaption <> Value) then begin
    FCaption := Value;
    Changed;
  end;
end;

procedure TAutoGridGroup.SetAlignment(Value : TAlignment);
begin
  if(FAlignment <> Value) then begin
    Include(FAssignedValues, ggvAlignment);
    FAlignment := Value;
    Changed;
  end;
end;

procedure TAutoGridGroup.SetColor(Value : TColor);
begin
  if(FColor <> Value) then begin
    Include(FAssignedValues, ggvColor);
    FColor := Value;
    Changed;
  end;
end;

procedure TAutoGridGroup.SetFont(Value : TFont);
begin
  FFont.Assign(Value);
end;

procedure TAutoGridGroup.SetColumns(Value : TAutoGridColumns);
begin
  FColumns.Assign(Value);
end;

procedure TAutoGridGroup.Assign(Source: TPersistent);
Var
  AGroup : TAutoGridGroup;
begin
  if(Source is TAutoGridGroup) then begin
    AGroup := Source as TAutoGridGroup;
    FAssignedValues := AGroup.FAssignedValues;
    FAlignment := AGroup.Alignment;
    FCaption := AGroup.Caption;
    FColor := AGroup.Color;
    AssignGridFont(FFont, AGroup.Font);
    Width := AGroup.Width;
    Columns.Assign(AGroup.Columns);
  end else inherited Assign(Source);
end;

procedure TAutoGridGroup.SetWidth(Value : Integer);
Var
  i : Integer;
begin
  if(FWidth <> Value) then begin
    if(Value < MinWidth) then
      Value := MinWidth;
    FWidth := Value;
    for i := 0 to GridLayout.FLevels - 1 do
      Columns.UpdateColumnWidth(i, Nil);
    if GridLayout.CanUpdateGrid then begin
      GridLayout.BeginDrawGrid;
      GridLayout.EndDrawGrid;
    end;
  end;
end;

function TAutoGridGroup.IsAlignmentStored : Boolean;
begin
  Result := (ggvAlignment in FAssignedValues) And (FAlignment <> DefaultAlignment);
end;

function TAutoGridGroup.IsColorStored : Boolean;
begin
  Result := (ggvColor in FAssignedValues) And (FColor <> DefaultColor);
end;

function TAutoGridGroup.IsFontStored : Boolean;
begin
  Result := (ggvFont in FAssignedValues) And (FFont <> DefaultFont);
end;

procedure TAutoGridGroup.FontChanged(Sender : TObject);
begin
  Include(FAssignedValues, ggvFont);
  Changed;
end;

procedure TAutoGridGroup.Changed;
begin
  Gridlayout.BeginDrawGrid;
  Gridlayout.EndDrawGridEx(Rect);
end;

procedure TAutoGridGroup.RestoreDefaults;
begin
  FAssignedValues := [];
  FAlignment := DefaultAlignment;  
  FColor := DefaultColor;
  AssignGridFont(FFont, DefaultFont);
  Changed;
end;

function TAutoGridGroup.DefaultAlignment : TAlignment;
begin
  Result := taCenter;
end;

function TAutoGridGroup.DefaultColor : TColor;
begin
  Result := clBtnFace;
end;

function TAutoGridGroup.DefaultFont : TFont;
begin
  Result := Gridlayout.GroupFont;

⌨️ 快捷键说明

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