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