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