📄 dbgrideh.pas
字号:
property OnTitleClick;
{$IFDEF EH_LIB_4} {Borland Delphi 4.0 or C++ Builder 4.0}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
property OnEndDock;
property OnStartDock;
{$ENDIF}
//ddd
property AllowedOperations;
property FooterRowCount;
property FrozenCols;
property FooterFont;
property FooterColor;
property TitleHeight;
property TitleLines;
property VTitleMargin;
// property HTitleMargin;
property UseMultiTitle;
property AutoFitColWidths;
property MinAutoFitWidth;
property RowHeight;
property RowSizingAllowed;
property RowLines;
property DrawMemoText;
property SumList;
property HorzScrollBar;
property VertScrollBar;
property TitleImages;
property OptionsEh;
property Flat;
property EditActions;
property OnDrawFooterCell;
property OnGetFooterParams;
property OnCheckButton;
property OnGetBtnParams;
property OnTitleBtnClick;
property OnGetCellParams;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnSumListRecalcAll;
property OnSortMarkingChanged;
property OnColWidthsChanged;
//Wang Zhenhua Add
property WzhStyle;
property DrawCurrency;
property CurrencyStyle;
property OnGetEditText;
property OnSetEditText;
property OnTopLeftChanged;
property OnGetConfirmText;
// property OnEditorChanged;
//Wang Zhenhua Add End
//\\\
end;
{const
IndicatorWidth = 11;}
var
SortMarkerFont :TFont;
const
ColSelectionAreaHeight : Integer = 7;
procedure WriteTextEh(ACanvas: TCanvas; // Canvas
ARect: TRect; // Draw rect and ClippingRect
FillRect:Boolean; // Fill rect Canvas.Brash.Color
DX, DY: Integer; // InflateRect(Rect, -DX, -DY) for text
Text: string; // Draw text
Alignment: TAlignment; // Text alignment
Layout: TTextLayout; // Text layout
MultyL:Boolean; // Word break
EndEllipsis:Boolean; // Truncate long text by ellipsis
LeftMarg, // Left margin
RightMarg:Integer); // Right margin
implementation
uses DBConsts, Dialogs, Comctrls, CommCtrl, DBGridEhImpExp, Clipbrd;
{$R DBGRIDEH.RES}
const
bmArrow = 'DBGARROWEH';
bmEdit = 'DBEDITEH';
bmInsert = 'DBINSERTEH';
bmMultiDot = 'DBMULTIDOTEH';
bmMultiArrow = 'DBMULTIARROWEH';
//ddd
bmSmDown = 'DBSMDOWNEH';
bmSmUp = 'DBSMUPEH';
bmEditWhite = 'DBGARROWEHW';
hcrDownCurEh:HCursor = 0;
hcrRightCurEh:HCursor = 0;
//\\\
MaxMapSize = (MaxInt div 2) div SizeOf(Integer); { 250 million }
var
FCheckBoxWidth, FCheckBoxHeight: Integer;
procedure GetCheckSize;
begin
with TBitmap.Create do
try
Handle := LoadBitmap(0, PChar(32759));
FCheckBoxWidth := Width div 4;
FCheckBoxHeight := Height div 3;
finally
Free;
end;
end;
{ Error reporting }
procedure RaiseGridError(const S: string);
begin
raise EInvalidGridOperation.Create(S);
end;
procedure KillMessage(Wnd: HWnd; Msg: Integer);
// Delete the requested message from the queue, but throw back
// any WM_QUIT msgs that PeekMessage may also return
var
M: TMsg;
begin
M.Message := 0;
if PeekMessage(M, Wnd, Msg, Msg, pm_Remove) and (M.Message = WM_QUIT) then
PostQuitMessage(M.wparam);
end;
//ddd
//Pure RX
type
//ddd
TCharSet = Set of Char;
//\\\
function ExtractWord(N: Integer; const S: string; WordDelims: TCharSet): string; forward;
function GetDefaultSection(Component: TComponent): string;
var
F: TCustomForm;
Owner: TComponent;
begin
if Component <> nil then begin
if Component is TCustomForm then Result := Component.ClassName
else begin
Result := Component.Name;
if Component is TControl then begin
F := GetParentForm(TControl(Component));
if F <> nil then Result := F.ClassName + Result
else begin
if TControl(Component).Parent <> nil then
Result := TControl(Component).Parent.Name + Result;
end;
end
else begin
Owner := Component.Owner;
if Owner is TForm then
Result := Format('%s.%s', [Owner.ClassName, Result]);
end;
end;
end
else Result := '';
end;
function Max(A, B: Longint): Longint;
begin
if A > B then Result := A
else Result := B;
end;
function Min(A, B: Longint): Longint;
begin
if A < B then Result := A
else Result := B;
end;
function iif(Condition:Boolean;V1,V2:Integer):Integer;
begin
if (Condition) then Result := V1 else Result := V2;
end;
//\\\
procedure GridInvalidateRow(Grid: TCustomDBGridEh; Row: Longint);
var
I: Longint;
begin
for I := 0 to Grid.ColCount - 1 do Grid.InvalidateCell(I, Row);
end;
{function DefineCursor(Identifier: PChar): TCursor;
var Handle:HCursor;
begin
Handle := LoadCursor(hInstance, Identifier);
if Handle = 0 then raise EOutOfResources.Create('Cannot load cursor resource');
for Result := 1 to High(TCursor) do
if Screen.Cursors[Result] = Screen.Cursors[crArrow] then
begin
Screen.Cursors[Result] := Handle;
Exit;
end;
raise EOutOfResources.Create('Too many user-defined cursors');
end;}
function GetTextWidth(Canvas:TCanvas; Text:String):Integer;
var ARect:TRect;
uFormat:Integer;
begin
uFormat := DT_CALCRECT or DT_LEFT or DT_NOPREFIX;
ARect := Rect(0,0,1,0);
DrawText(Canvas.Handle, PChar(Text), Length(Text), ARect, uFormat);
Result := ARect.Right - ARect.Left;
end;
function PointInGridRect(Col, Row: Longint; const Rect: TGridRect): Boolean;
begin
Result := (Col >= Rect.Left) and (Col <= Rect.Right) and (Row >= Rect.Top)
and (Row <= Rect.Bottom);
end;
{ TDBGridInplaceEdit }
{ TDBGridInplaceEdit adds support for a button on the in-place editor,
which can be used to drop down a table-based lookup list, a stringlist-based
pick list, or (if button style is esEllipsis) fire the grid event
OnEditButtonClick. }
type
TEditStyle = (esSimple, esEllipsis, esPickList, esDataList, esDateCalendar ,esUpDown, esDropDown);
TPopupListbox = class;
TPopupMonthCalendar = class;
TDBGridInplaceEdit = class(TInplaceEdit)
private
FButtonWidth: Integer;
FDataList: TDBLookupListBox;
FPickList: TPopupListbox;
FActiveList: TWinControl;
FLookupSource: TDatasource;
FEditStyle: TEditStyle;
FListVisible: Boolean;
FTracking: Boolean;
FPressed: Boolean;
//ddd
FPopupMonthCalendar: TPopupMonthCalendar;
FWordWrap: Boolean;
FUpDown:TUpDown;
procedure ListMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure ListMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure UpDownChanging (Sender: TObject; var AllowChange: Boolean);
procedure UpDownClick(Sender: TObject; Button: TUDBtnType);
//\\\
procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SetEditStyle(Value: TEditStyle);
procedure StopTracking;
procedure TrackButton(X,Y: Integer);
procedure CMCancelMode(var Message: TCMCancelMode); message CM_CancelMode;
procedure WMCancelMode(var Message: TMessage); message WM_CancelMode;
procedure WMKillFocus(var Message: TMessage); message WM_KillFocus;
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message wm_LButtonDblClk;
procedure WMPaint(var Message: TWMPaint); message wm_Paint;
procedure WMSetCursor(var Message: TWMSetCursor); message WM_SetCursor;
procedure SetWordWrap(const Value: Boolean);
protected
procedure BoundsChanged; override;
procedure CloseUp(Accept: Boolean);
//ddd
procedure CreateParams(var Params: TCreateParams); override;
//\\\
procedure DoDropDownKeys(var Key: Word; Shift: TShiftState);
procedure DropDown;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure PaintWindow(DC: HDC); override;
procedure UpdateContents; override;
procedure WndProc(var Message: TMessage); override;
//ddd
procedure KeyPress(var Key: Char); override;
property WordWrap: Boolean read FWordWrap write SetWordWrap;
//\\\
property EditStyle: TEditStyle read FEditStyle write SetEditStyle;
property ActiveList: TWinControl read FActiveList write FActiveList;
property DataList: TDBLookupListBox read FDataList;
property PickList: TPopupListbox read FPickList;
public
constructor Create(Owner: TComponent); override;
end;
{ TPopupListbox }
TPopupListbox = class(TCustomListbox)
private
FSearchText: String;
FSearchTickCount: Longint;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure KeyPress(var Key: Char); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
end;
//ddd
{ TPopupMonthCalendar }
TPopupMonthCalendar = class(TMonthCalendar)
protected
procedure CreateParams(var Params: TCreate
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -