📄 dbngrids.pas
字号:
{*******************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ }
{ Copyright (c) 1996,99 Inprise Corporation }
{ }
{*******************************************************}
unit dbngrids;
{$R-,H+,X+}
interface
uses SysUtils, Windows, Messages, Classes, Controls, Forms,
Graphics, Menus, DB;
type
{ TDBCtrlGrid }
TDBNGrid = class;
TDBnGridLink = class(TDataLink)
private
FDBnGrid: TDBnGrid;
protected
procedure ActiveChanged; override;
procedure DataSetChanged; override;
public
constructor Create(DBnGrid: TDBnGrid);
end;
TDBnPanel = class(TWinControl)
private
FDBnGrid: TDBnGrid;
procedure CMControlListChange(var Message: TCMControlListChange); message CM_CONTROLLISTCHANGE;
procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure PaintWindow(DC: HDC); override;
public
constructor CreateLinked(DBnGrid: TDBnGrid);
end;
TDBnGridOrientation = (goVertical, goHorizontal);
TDBnGridBorder = (gbNone, gbRaised);
TDBnGridKey = (gkNull, gkEditMode, gkPriorTab, gkNextTab, gkLeft,
gkRight, gkUp, gkDown, gkScrollUp, gkScrollDown, gkPageUp, gkPageDown,
gkHome, gkEnd, gkInsert, gkAppend, gkDelete, gkCancel);
TPaintPanelEvent = procedure(DBnGrid: TDBnGrid;
Index: Integer) of object;
TDBnGrid = class(TWinControl)
private
FDataLink: TDBnGridLink;
FPanel: TDBnPanel;
FCanvas: TCanvas;
FColCount: Integer;
FRowCount: Integer;
FPanelWidth: Integer;
FPanelHeight: Integer;
FPanelIndex: Integer;
FPanelCount: Integer;
FBitmapCount: Integer;
FPanelBitmap: HBitmap;
FSaveBitmap: HBitmap;
FPanelDC: HDC;
FOrientation: TDBnGridOrientation;
FPanelBorder: TDBnGridBorder;
FAllowInsert: Boolean;
FAllowDelete: Boolean;
FShowFocus: Boolean;
FFocused: Boolean;
FClicking: Boolean;
FSelColorChanged: Boolean;
FScrollBarKind: Integer;
FSelectedColor: TColor;
FOnPaintPanel: TPaintPanelEvent;
function AcquireFocus: Boolean;
procedure AdjustSize; reintroduce;
procedure CreatePanelBitmap;
procedure DataSetChanged(Reset: Boolean);
procedure DestroyPanelBitmap;
procedure DrawPanel(DC: HDC; Index: Integer);
procedure DrawPanelBackground(DC: HDC; const R: TRect; Erase, Selected: Boolean);
function FindNext(StartControl: TWinControl; GoForward: Boolean;
var WrapFlag: Integer): TWinControl;
function GetDataSource: TDataSource;
function GetEditMode: Boolean;
function GetPanelBounds(Index: Integer): TRect;
function PointInPanel(const P: TSmallPoint): Boolean;
procedure Reset;
procedure Scroll(Inc: Integer; ScrollLock: Boolean);
procedure ScrollMessage(var Message: TWMScroll);
procedure SelectNext(GoForward: Boolean);
procedure SetColCount(Value: Integer);
procedure SetDataSource(Value: TDataSource);
procedure SetEditMode(Value: Boolean);
procedure SetOrientation(Value: TDBnGridOrientation);
procedure SetPanelBorder(Value: TDBnGridBorder);
procedure SetPanelHeight(Value: Integer);
procedure SetPanelIndex(Value: Integer);
procedure SetPanelWidth(Value: Integer);
procedure SetRowCount(Value: Integer);
procedure SetSelectedColor(Value: TColor);
procedure UpdateDataLinks(Control: TControl; Inserting: Boolean);
procedure UpdateScrollBar;
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure WMSize(var Message: TMessage); message WM_SIZE;
procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY;
procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
function GetChildParent: TComponent; override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure PaintPanel(Index: Integer); virtual;
procedure PaintWindow(DC: HDC); override;
procedure ReadState(Reader: TReader); override;
property Panel: TDBnPanel read FPanel;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DoKey(Key: TDBnGridKey);
function ExecuteAction(Action: TBasicAction): Boolean; override;
procedure GetTabOrderList(List: TList); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
function UpdateAction(Action: TBasicAction): Boolean; override;
property Canvas: TCanvas read FCanvas;
property EditMode: Boolean read GetEditMode write SetEditMode;
property PanelCount: Integer read FPanelCount;
property PanelIndex: Integer read FPanelIndex write SetPanelIndex;
published
property Align;
property AllowDelete: Boolean read FAllowDelete write FAllowDelete default True;
property AllowInsert: Boolean read FAllowInsert write FAllowInsert default True;
property Anchors;
property ColCount: Integer read FColCount write SetColCount;
property Color;
property Constraints;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property DragCursor;
property DragMode;
property Enabled;
property Font;
property Orientation: TDBnGridOrientation read FOrientation write SetOrientation default goVertical;
property PanelBorder: TDBnGridBorder read FPanelBorder write SetPanelBorder default gbRaised;
property PanelHeight: Integer read FPanelHeight write SetPanelHeight;
property PanelWidth: Integer read FPanelWidth write SetPanelWidth;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property TabOrder;
property TabStop default True;
property RowCount: Integer read FRowCount write SetRowCount;
property SelectedColor: TColor read FSelectedColor write SetSelectedColor
stored FSelColorChanged default clWindow;
property ShowFocus: Boolean read FShowFocus write FShowFocus default True;
property ShowHint;
property Visible;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnPaintPanel: TPaintPanelEvent read FOnPaintPanel write FOnPaintPanel;
property OnStartDrag;
end;
implementation
uses DBConsts, VDBConsts;
{ TDBnGridLink }
constructor TDBnGridLink.Create(DBnGrid: TDBnGrid);
begin
inherited Create;
FDBnGrid := DBnGrid;
VisualControl := True;
RPR;
end;
procedure TDBnGridLink.ActiveChanged;
begin
FDBnGrid.DataSetChanged(False);
end;
procedure TDBnGridLink.DataSetChanged;
begin
FDBnGrid.DataSetChanged(False);
end;
{ TDBnPanel }
constructor TDBnPanel.CreateLinked(DBnGrid: TDBnGrid);
begin
inherited Create(DBnGrid);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csDoubleClicks, csOpaque, csReplicatable];
FDBnGrid := DBnGrid;
Parent := DBnGrid;
end;
procedure TDBnPanel.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params.WindowClass do
style := style and not (CS_HREDRAW or CS_VREDRAW);
end;
procedure TDBnPanel.PaintWindow(DC: HDC);
var
R: TRect;
Selected: Boolean;
begin
with FDBnGrid do
begin
if FDataLink.Active then
begin
Selected := (FDataLink.ActiveRecord = FPanelIndex);
DrawPanelBackground(DC, Self.ClientRect, True, Selected);
FCanvas.Handle := DC;
try
FCanvas.Font := Font;
FCanvas.Brush.Style := bsSolid;
FCanvas.Brush.Color := Color;
PaintPanel(FDataLink.ActiveRecord);
if FShowFocus and FFocused and Selected then
begin
R := Self.ClientRect;
if FPanelBorder = gbRaised then InflateRect(R, -2, -2);
FCanvas.Brush.Color := Color;
FCanvas.DrawFocusRect(R);
end;
finally
FCanvas.Handle := 0;
end;
end else
DrawPanelBackground(DC, Self.ClientRect, True, csDesigning in ComponentState);
end;
end;
procedure TDBnPanel.CMControlListChange(var Message: TCMControlListChange);
begin
FDBnGrid.UpdateDataLinks(Message.Control, Message.Inserting);
end;
procedure TDBnPanel.WMPaint(var Message: TWMPaint);
var
DC: HDC;
PS: TPaintStruct;
begin
if Message.DC = 0 then
begin
FDBnGrid.CreatePanelBitmap;
try
Message.DC := FDBnGrid.FPanelDC;
PaintHandler(Message);
Message.DC := 0;
DC := BeginPaint(Handle, PS);
BitBlt(DC, 0, 0, Width, Height, FDBnGrid.FPanelDC, 0, 0, SRCCOPY);
EndPaint(Handle, PS);
finally
FDBnGrid.DestroyPanelBitmap;
end;
end else
PaintHandler(Message);
end;
procedure TDBnPanel.WMNCHitTest(var Message: TWMNCHitTest);
begin
if csDesigning in ComponentState then
Message.Result := HTCLIENT else
Message.Result := HTTRANSPARENT;
end;
procedure TDBnPanel.WMEraseBkgnd(var Message: TMessage);
begin
Message.Result := 1;
end;
{ TDBnGrid }
constructor TDBnGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csOpaque, csDoubleClicks];
TabStop := True;
FDataLink := TDBnGridLink.Create(Self);
FCanvas := TCanvas.Create;
FPanel := TDBnPanel.CreateLinked(Self);
FColCount := 1;
FRowCount := 3;
FPanelWidth := 200;
FPanelHeight := 72;
FPanelBorder := gbRaised;
FAllowInsert := True;
FAllowDelete := True;
FShowFocus := True;
FSelectedColor := Color;
AdjustSize;
end;
destructor TDBnGrid.Destroy;
begin
FCanvas.Free;
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;
function TDBnGrid.AcquireFocus: Boolean;
begin
Result := True;
if not (Focused or EditMode) then
begin
SetFocus;
Result := Focused;
end;
end;
procedure TDBnGrid.AdjustSize;
var
W, H: Integer;
begin
W := FPanelWidth * FColCount;
H := FPanelHeight * FRowCount;
if FOrientation = goVertical then
Inc(W, GetSystemMetrics(SM_CXVSCROLL)) else
Inc(H, GetSystemMetrics(SM_CYHSCROLL));
SetBounds(Left, Top, W, H);
Reset;
end;
procedure TDBnGrid.CreatePanelBitmap;
var
DC: HDC;
begin
if FBitmapCount = 0 then
begin
DC := GetDC(0);
FPanelBitmap := CreateCompatibleBitmap(DC, FPanel.Width, FPanel.Height);
ReleaseDC(0, DC);
FPanelDC := CreateCompatibleDC(0);
FSaveBitmap := SelectObject(FPanelDC, FPanelBitmap);
end;
Inc(FBitmapCount);
end;
procedure TDBnGrid.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := Style or WS_CLIPCHILDREN;
WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
end;
end;
procedure TDBnGrid.CreateWnd;
begin
inherited CreateWnd;
if FOrientation = goVertical then
FScrollBarKind := SB_VERT else
FScrollBarKind := SB_HORZ;
if not FDataLink.Active then
SetScrollRange(Handle, FScrollBarKind, 0, 4, False);
UpdateScrollBar;
end;
procedure TDBnGrid.DataSetChanged(Reset: Boolean);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -