adbgrid.pas

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

PAS
2,096 行
字号
      Pen.Color := GetGrayColor;
      Polyline([Point(r.Right, r.Top), Point(r.Left, r.Top),
        Point(r.Left, r.Top + 1), Point(r.Right - AWidth div 2, r.Bottom - 1)]);
    end;
    Pen.Color := OldColor;  
  end;
end;

procedure AssignGridFont(ADest, ASource : TFont);
Var
  OnChangeEvent : TNotifyEvent;
begin
  OnChangeEvent := ADest.Onchange;
  try
    ADest.Onchange := Nil;
    ADest.Assign(ASource);
  finally
    ADest.Onchange := OnChangeEvent;
  end;
end;


{TAutoGridColumn}
constructor TAutoGridColumn.Create(Collection : TCollection);
Var
  i, j, colcount : Integer;
begin
  inherited Create(Collection);
  Columns := TAutoGridColumns(Collection);
  FGridField := Nil;
  FSorted := gcsNone;
  if GridLayout.CanUpdateGrid And Not Columns.FAssignFlag then begin
    j := GridLayout.FLevels - 1;
    for i := GridLayout.FLevels - 2 downto 0 do
      if(Columns.GetLevelColumnCount(i) = 0) then
        Dec(j);
    FLevel := j;
    colcount := Columns.GetLevelColumnCount(FLevel);
    FLevelIndex := colcount - 1;
    j := Columns.FGroup.Width div colcount;
    if( j < AutoDBGridMinColWidth) then
      self.Free
    else Width := j;
  end else   FLevel := 0;
end;

destructor TAutoGridColumn.Destroy;
Var
  OldColunms : TAutoGridColumns;
  OldGridLayout : TAutoGridLayout;
  OldLevel : Integer;
  IsSorted : Boolean;
begin
  if GridLayout.CanUpdateGrid then begin
    GridLayout.ColumnDestroying(self);
    if(FGridField <> Nil) And (FGridField.FColumn = self) then
      FGridField.FColumn := Nil;
    IsSorted := FSorted <> gcsNone;
    OldColunms := Columns;
    OldLevel := Level;
    OldGridLayout := GridLayout;
    FLevel := -1;
    if(GridLayout.Grid <> Nil) And (GridLayout.Grid.FSelectedColumn = self) then
      GridLayout.Grid.FSelectedColumn := Nil;
  end else begin
    OldColunms := Nil;
    OldGridLayout := Nil;
    OldLevel := -1;
    IsSorted := False;
  end;
  inherited;
  if(OldColunms <> Nil) then begin
    OldGridLayout.BeginDrawGrid;
    if(IsSorted) then
       OldGridLayout.FSortedColumn := Nil;
    OldColunms.UpdateLevelIndex(OldLevel);
    OldColunms.UpdateColumnWidth(OldLevel, Nil);
    OldGridLayout.EndDrawGrid;
  end;
end;

procedure TAutoGridColumn.Assign(Source: TPersistent);
Var
  AColumn : TAutoGridColumn;
begin
  if(Source is TAutoGridColumn) then begin
    AColumn := TAutoGridColumn(Source);
    FWidth := AColumn.Width;
    FSorted := AColumn.Sorted;
    if(FSorted <> gcsNone) then
      GridLayout.FSortedColumn := self;
    if(AColumn.GridLayout = GridLayout) then
       FGridField := AColumn.FGridField;
  end else inherited Assign(Source);
end;

procedure TAutoGridColumn.ReadFieldIndex(Reader: TReader);
Var
  AIndex : Integer;
begin
  AIndex := Reader.ReadInteger;
  if(AIndex > -1) And (AIndex < GridLayout.Fields.Count) then begin
    FGridField := GridLayout.Fields[AIndex];
    if(FGridField <> Nil) then
      FGridField.FColumn := self;
  end;
end;

procedure TAutoGridColumn.WriteFieldIndex(Writer: TWriter);
begin
  Writer.WriteInteger(FGridField.Index);
end;

procedure TAutoGridColumn.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('FieldIndex', ReadFieldIndex, WriteFieldIndex, True);
end;


function TAutoGridColumn.GetAlignment : TAlignment;
begin
  if(FGridField <> Nil) then
    Result := FGridField.Alignment
  else Result := taLeftJustify;
end;

function TAutoGridColumn.GetCaption : String;
begin
  if(FGridField <> Nil) then
    Result := FGridField.Caption
  else Result := '';
end;

function TAutoGridColumn.GetColor : TColor;
begin
  if(FGridField <> Nil) then
    Result := FGridField.Color
  else begin
    if(GridLayout.Grid <> nil) then
      Result := GridLayout.Color
    else Result := clWindow;
  end;
end;

function TAutoGridColumn.GetField : TField;
begin
  if(FGridField <> Nil) then
    Result := FGridField.Field
  else Result := Nil;
end;

function TAutoGridColumn.GetFont : TFont;
begin
  if(FGridField <> Nil)
  or (csLoading in GridLayout.Owner.ComponentState) then
    Result := FGridField.InternalFont
  else Result := GridLayout.ColumnFont;
end;

function TAutoGridColumn.GetTitleAlignment : TAlignment;
begin
  if(FGridField <> Nil) then
    Result := FGridField.TitleAlignment
  else Result := taLeftJustify;
end;

function TAutoGridColumn.GetTitleColor : TColor;
begin
  if(FGridField <> Nil) then
    Result := FGridField.TitleColor
  else Result := clBtnFace;
end;

function TAutoGridColumn.GetTitleFont : TFont;
begin
  if(FGridField <> Nil) then
    Result := FGridField.InternalTitleFont
  else Result := GridLayout.ColumnFont;
end;

function TAutoGridColumn.GetDBDefControl : TAutoDBDefControl;
begin
  if(FGridField <> Nil) then
    Result := FGridField.DBDefControl
  else Result := Nil;
end;

function TAutoGridColumn.GetGridLayout : TAutoGridLayout;
begin
  Result := Columns.GridLayout;
end;

function TAutoGridColumn.UseMaxGridHeight : Boolean;
Var
  ADBDefControl : TAutoDBDefControl;
begin
  ADBDefControl := DBDefControl;
  if(ADBDefControl <> Nil) then
    Result := ADBDefControl.UseMaxGridHeight
  else Result := False;  
end;

function TAutoGridColumn.GetLeft : Integer;
var
  i : Integer;
begin
  Result := 0;
  if(FLevelIndex > -1) then      
    for i := 0 to FLevelIndex - 1 do
      Inc(Result, AutoDBGridLineWidth + Columns.LevelItems[FLevel, i].FWidth);
  Inc(Result, Columns.Group.Left);
end;

function TAutoGridColumn.GetVisibleLeft : Integer;
begin
  Result := Left;
  if(Result < Columns.Group.VisibleLeft) then
    Result := Columns.Group.VisibleLeft;
end;

function TAutoGridColumn.GetRect : TRect;
Var
  ATop, ALeft, ABottom : Integer;
begin
  ATop := GridLayout.GroupOffSet + FLevel * (GridLayout.ColumnHeight + AutoDBGridLineWidth);
  ABottom := ATop + GridLayout.ColumnHeight + AutoDBGridLineWidth;  
  if(GridLayout.GroupOffSet > AutoDBGridLineWidth) then
    Inc(ATop, AutoDBGridLineWidth);
  ALeft := Left;
  SetRect(Result, ALeft, ATop, ALeft + FWidth, ABottom);
end;

function TAutoGridColumn.GetRight : Integer;
begin
  Result := Left + FWidth;
end;


function TAutoGridColumn.GetRowRect(Index : Integer) : TRect;
Var
  dy : Integer;
begin
  Result := Rect;
  Result.Top := FLevel * (GridLayout.LevelHeight + AutoDBGridLineWidth) + AutoDBGridLineWidth;
  if (Columns.Group.Levels < GridLayout.Levels) And (Level = Columns.Group.Levels - 1)
  And (UseMaxGridHeight) then
    Result.Bottom := GridLayout.RowHeight - GridLayout.RecordLineOffSet
  else Result.Bottom := Result.Top + GridLayout.LevelHeight;
  dy := GridLayout.ColumnOffSet + GridLayout.GroupOffSet + Index * (GridLayout.RowHeight);
  Inc(Result.Top, dy);
  Inc(Result.Bottom, dy);
end;

procedure TAutoGridColumn.SetLevel(Value : Integer);
Var
  OldLevel, i : Integer;
begin
  if(Value <> FLevel) And (Value < GridLayout.Levels) And (Value > -1) then begin
    if (csLoading in GridLayout.FOwner.ComponentState) then
      FLevel := Value
    else begin
      if (FLevel < Value) And (Columns.GetLevelColumnCount(FLevel) = 1)
      And (Value > 0) then begin
        for i := Value to GridLayout.Levels - 1 do
          while (Columns.GetLevelColumnCount(i) > 0) do
            Columns.LevelItems[i, 0].FLevel := Columns.LevelItems[i, 0].FLevel - 1;
        Dec(Value);
      end;
      OldLevel := FLevel;      
      FLevel := Value;
      if GridLayout.CanUpdateGrid then begin
        GridLayout.BeginDrawGrid;
        FLevelIndex := Columns.GetLevelColumnCount(FLevel) - 1;
        if(OldLevel > -1) then begin
          Columns.UpdateLevelIndex(OldLevel);
          Columns.UpdateColumnWidth(OldLevel, Nil);
        end;
        Columns.UpdateColumnWidth(FLevel, Nil);
        GridLayout.EndDrawGrid;
      end;  
    end;
  end;
end;

procedure TAutoGridColumn.SetLevelIndex(Value : Integer);
Var
  OldLevelIndex : Integer;
  i : Integer;
  LIst : TList;
begin
  if(FLevelIndex <> Value) then begin
    if (csLoading in GridLayout.FOwner.ComponentState) then
      FLevelIndex := Value
    else begin
     if(Value < 0) then
       Value := 0;
     if(Value >= Columns.GetLevelColumnCount(FLevel)) then
       Value := Columns.GetLevelColumnCount(FLevel) - 1;
     if(FLevelIndex <> Value)
     And (Columns.GetLevelColumnCount(FLevel) > 1) then begin
       GridLayout.BeginDrawGrid;
       List := TList.Create;
       Columns.GetLevelColumnList(FLevel, List);
       OldLevelIndex := FLevelIndex;
       FLevelIndex := Value;
       if(OldLevelIndex > FLevelIndex) then
         for i := FLevelIndex to OldLevelIndex - 1 do
           TAutoGridColumn(List[i]).FLevelIndex := TAutoGridColumn(List[i]).FLevelIndex + 1;
       if(OldLevelIndex < FLevelIndex) then
         for i := OldLevelIndex + 1 to FLevelIndex do
           TAutoGridColumn(List[i]).FLevelIndex := TAutoGridColumn(List[i]).FLevelIndex - 1;
       List.Free;
       GridLayout.EndDrawGrid;
     end;
    end;
  end;
end;

procedure TAutoGridColumn.SetSorted(Value : TAutoGridColumnSort);
begin
  if(FSorted <> Value) then begin
    if(Value <> gcsNone) And (self <> GridLayout.SortedColumn) then begin
      if(GridLayout.SortedColumn <> Nil) then begin
        GridLayout.BeginDrawGrid;
        GridLayout.SortedColumn.FSorted := gcsNone;
        GridLayout.EndDrawGridEx(GridLayout.SortedColumn.Rect);
      end;
      GridLayout.FSortedColumn := self;
    end;
    if(self = GridLayout.SortedColumn) And (Value = gcsNone) then
      GridLayout.FSortedColumn := Nil;
    FSorted := Value;
    GridLayout.BeginDrawGrid;
    GridLayout.EndDrawGridEx(self.Rect);
  end;
end;

procedure TAutoGridColumn.SetWidth(Value : Integer);
Var
  colCount : Integer;

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

begin
  if(FWidth <> Value) then begin
    if(csLoading in GridLayout.FOwner.ComponentState) then
      FWidth := Value
    else begin
      GridLayout.BeginDrawGrid;
      colCount := Columns.GetLevelColumnCount(FLevel);
      if(colCount = 1) then
        FWidth := Columns.FGroup.Width
      else begin
        if(Value < AutoDBGridMinColWidth) then
          Value := AutoDBGridMinColWidth;
        if(Value > Columns.FGroup.Width - (colCount - 1) * (AutoDBGridMinColWidth + AutoDBGridLineWidth)) then
          Value := Columns.FGroup.Width - (colCount - 1) * (AutoDBGridMinColWidth + AutoDBGridLineWidth);
        FWidth := Value;
      end;
      Columns.UpdateColumnWidth(FLevel, self);
      GridLayout.EndDrawGrid;
    end;
  end;
end;

{TAutoGridColumns}
constructor TAutoGridColumns.Create(AGroup : TAutoGridGroup);
begin
  inherited Create(TAutoGridColumn);
  FGroup := AGroup;
  FAssignFlag := False;
end;

{$IFDEF DELPHI4}
function  TAutoGridColumns.GetOwner: TPersistent;
begin
  Result := GridLayout;
end;
{$ENDIF}

function TAutoGridColumns.Add(AGridField : TAutoGridField) : TAutoGridColumn;
begin
  GridLayout.BeginDrawGrid;
  Result := TAutoGridColumn(inherited Add);
  Result.FGridField := AGridField;
  AGridField.FColumn := Result;  
  GridLayout.EndDrawGrid;
end;

procedure TAutoGridColumns.Assign(Source: TPersistent);
Var
  AColumns : TAutoGridColumns;
  AColumn : TAutoGridColumn;
  AField : TAutoGridField;
  i, j : Integer;
begin
  if(Source is TAutoGridColumns) then begin
    FAssignFlag := True;
    AColumns := Source as TAutoGridColumns;
    if(AColumns.GridLayout.FDataLink.DataSet = GridLayout.FDataLink.DataSet) then begin
      Clear;
      for i := 0 to AColumns.Group.Levels - 1 do
        if(i < GridLayout.Levels) then
          for j := 0 to AColumns.LevelColumnCount[i] - 1 do begin
            if(AColumns.LevelItems[i, j] <> Nil)
            And (AColumns.LevelItems[i, j].FGridField <> Nil) then begin
              AField := GridLayout.Fields[AColumns.LevelItems[i, j].FGridField.Index];
              if(AField <> Nil) And (AField.FColumn = Nil) then begin
                AColumn := Add(AField);
                AField.FColumn := AColumn;
                AColumn.FLevel := AColumns.LevelItems[i, j].Level;

⌨️ 快捷键说明

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