📄 rxgrids.pas
字号:
begin
if (ACol >= 0) and (ARow >= 0) and ((ACol < FixedCols) or (ARow < FixedRows)) then
begin
if Assigned(FOnCheckButton) then FOnCheckButton(Self, ACol, ARow, Enabled);
end
else Enabled := False;
end;
procedure TRxDrawGrid.TopLeftChanged;
begin
if (goRowSelect in Options) and DefaultDrawing then
InvalidateRow(Self.Row);
inherited TopLeftChanged;
if FTracking then StopTracking;
end;
procedure TRxDrawGrid.ColWidthsChanged;
begin
inherited ColWidthsChanged;
if FTracking then StopTracking;
if Assigned(FOnColumnSized) then FOnColumnSized(Self);
end;
procedure TRxDrawGrid.RowHeightsChanged;
begin
inherited RowHeightsChanged;
if FTracking then StopTracking;
if Assigned(FOnRowSized) then FOnRowSized(Self);
end;
procedure TRxDrawGrid.StopTracking;
begin
if FTracking then begin
TrackButton(-1, -1);
FTracking := False;
MouseCapture := False;
end;
end;
procedure TRxDrawGrid.TrackButton(X, Y: Integer);
var
Cell: TGridCoord;
NewPressed: Boolean;
begin
Cell := MouseCoord(X, Y);
NewPressed := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y))
and (FPressedCell.X = Cell.X) and (FPressedCell.Y = Cell.Y);
if FPressed <> NewPressed then begin
FPressed := NewPressed;
InvalidateCell(Cell.X, Cell.Y);
InvalidateCell(FPressedCell.X, FPressedCell.Y);
end;
end;
function TRxDrawGrid.IsActiveControl: Boolean;
var
H: Hwnd;
ParentForm: TCustomForm;
begin
Result := False;
ParentForm := GetParentForm(Self);
if Assigned(ParentForm) then begin
if (ParentForm.ActiveControl = Self) then
Result := True;
end
else begin
H := GetFocus;
while IsWindow(H) and (Result = False) do begin
if H = WindowHandle then Result := True
else H := GetParent(H);
end;
end;
end;
procedure TRxDrawGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
Cell: TGridCoord;
EnableClick, Fixed: Boolean;
begin
HideEditor;
if not (csDesigning in ComponentState) and (CanFocus or
(GetParentForm(Self) = nil)) then
begin
SetFocus;
if not IsActiveControl then begin
MouseCapture := False;
Exit;
end;
end;
if (Button = mbLeft) and (ssDouble in Shift) then begin
if FFixedCellsButtons then begin
Cell := MouseCoord(X, Y);
if not ((Cell.X >= 0) and (Cell.X < FixedCols)) and not
((Cell.Y >= 0) and (Cell.Y < FixedRows)) then
begin
DblClick;
Exit;
end;
end
else begin
DblClick;
Exit;
end;
end;
if Sizing(X, Y) then
inherited MouseDown(Button, Shift, X, Y)
else begin
Cell := MouseCoord(X, Y);
Fixed := ((Cell.X >= 0) and (Cell.X < FixedCols)) or
((Cell.Y >= 0) and (Cell.Y < FixedRows));
if FFixedCellsButtons and Fixed and not (csDesigning in ComponentState) then
begin
if ([goRowMoving, goColMoving] * Options <> []) and
(Button = mbRight) then
begin
Button := mbLeft;
FSwapButtons := True;
MouseCapture := True;
end
else if (Button = mbLeft) then begin
EnableClick := True;
CheckFixedCellButton(Cell.X, Cell.Y, EnableClick);
if EnableClick then begin
MouseCapture := True;
FTracking := True;
FPressedCell := Cell;
TrackButton(X, Y);
end else Beep;
Exit;
end;
end;
inherited MouseDown(Button, Shift, X, Y);
end;
end;
procedure TRxDrawGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if FTracking then TrackButton(X, Y);
inherited MouseMove(Shift, X, Y);
end;
procedure TRxDrawGrid.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
Cell: TGridCoord;
ACol, ARow: Longint;
DoClick: Boolean;
begin
if FTracking and (FPressedCell.Y >= 0) and (FPressedCell.X >= 0) then
begin
Cell := MouseCoord(X, Y);
DoClick := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y))
and (Cell.Y = FPressedCell.Y) and (Cell.X = FPressedCell.X);
StopTracking;
if DoClick then begin
ACol := Cell.X;
ARow := Cell.Y;
if (ARow < RowCount) and (ACol < ColCount) then
DoFixedCellClick(ACol, ARow);
end;
end
else if FSwapButtons then begin
FSwapButtons := False;
MouseCapture := False;
if Button = mbRight then Button := mbLeft;
end;
inherited MouseUp(Button, Shift, X, Y);
end;
procedure TRxDrawGrid.Paint;
var
R: TRect;
begin
FDefaultDrawing := inherited DefaultDrawing;
inherited DefaultDrawing := False;
try
inherited Paint;
finally
inherited DefaultDrawing := FDefaultDrawing;
end;
if not (csDesigning in ComponentState) and DefaultDrawing and Focused and
([goRowSelect, goRangeSelect] * Options = [goRowSelect]) then
begin
with Canvas do begin
Font.Color := Self.Font.Color;
Brush.Color := Self.Color;
end;
if Row >= FixedRows then begin
R := BoxRect(FixedCols, Row, ColCount - 1, Row);
if not (goHorzLine in Options) then Inc(R.Bottom, GridLineWidth);
DrawFocusRect(Canvas.Handle, R);
end;
end;
end;
procedure TRxDrawGrid.CallDrawCellEvent(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);
begin
inherited DrawCell(ACol, ARow, ARect, AState);
end;
procedure TRxDrawGrid.DoDrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);
begin
CallDrawCellEvent(ACol, ARow, ARect, AState);
end;
procedure TRxDrawGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);
var
Down: Boolean;
{$IFDEF WIN32}
TempRect: TRect;
FrameFlags1, FrameFlags2: DWORD;
const
EdgeFlag: array[Boolean] of UINT = (BDR_RAISEDINNER, BDR_SUNKENINNER);
{$ENDIF}
begin
if FDefaultDrawing or (csDesigning in ComponentState) then
with Canvas do begin
Font := Self.Font;
if ([goRowSelect, goVertLine] * Options = [goRowSelect]) and
not (gdFixed in AState) then Inc(ARect.Right, GridLineWidth);
if ([goRowSelect, goHorzLine] * Options = [goRowSelect]) and
not (gdFixed in AState) then Inc(ARect.Bottom, GridLineWidth);
if (gdSelected in AState) and (not (gdFocused in AState) or
([goDrawFocusSelected, goRowSelect] * Options <> [])) then
begin
Brush.Color := clHighlight;
Font.Color := clHighlightText;
end
else begin
if gdFixed in AState then Brush.Color := FixedColor
else Brush.Color := Color;
end;
FillRect(ARect);
end;
Down := FFixedCellsButtons and (gdFixed in AState) and Ctl3D and
not (csLoading in ComponentState) and FPressed and FDefaultDrawing and
(FPressedCell.X = ACol) and (FPressedCell.Y = ARow);
inherited DefaultDrawing := FDefaultDrawing;
if Down then begin
Inc(ARect.Left, GridLineWidth);
Inc(ARect.Top, GridLineWidth);
end;
try
DoDrawCell(ACol, ARow, ARect, AState);
finally
inherited DefaultDrawing := False;
if Down then begin
Dec(ARect.Left, GridLineWidth);
Dec(ARect.Top, GridLineWidth);
end;
end;
if FDefaultDrawing and (gdFixed in AState) and Ctl3D then begin
{$IFDEF WIN32}
FrameFlags1 := 0;
FrameFlags2 := 0;
if goFixedVertLine in Options then begin
FrameFlags1 := BF_RIGHT;
FrameFlags2 := BF_LEFT;
end;
if goFixedHorzLine in Options then begin
FrameFlags1 := FrameFlags1 or BF_BOTTOM;
FrameFlags2 := FrameFlags2 or BF_TOP;
end;
if (FrameFlags1 or FrameFlags2) <> 0 then begin
TempRect := ARect;
if ((FrameFlags1 and BF_RIGHT) = 0) and
(goFixedVertLine in Options) then
Inc(TempRect.Right, GridLineWidth)
else if ((FrameFlags1 and BF_BOTTOM) = 0) and
(goFixedVertLine in Options) then
Inc(TempRect.Bottom, GridLineWidth);
DrawEdge(Canvas.Handle, TempRect, EdgeFlag[Down], FrameFlags1);
DrawEdge(Canvas.Handle, TempRect, EdgeFlag[Down], FrameFlags2);
end;
{$ELSE}
with Canvas do begin
Pen.Color := clBtnHighlight;
if FFixedCellsButtons then begin
if Down then begin
Pen.Color := clBtnShadow;
with ARect do begin
PolyLine([Point(Left, Bottom - 1), Point(Left, Top),
Point(Right, Top)]);
Inc(Left, 2); Inc(Top, 2);
end;
end
else Frame3D(Canvas, ARect, clBtnHighlight, clBtnShadow, 1);
end
else begin
Polyline([Point(ARect.Left, ARect.Bottom - 1), ARect.TopLeft,
Point(ARect.Right, ARect.Top)]);
end;
end;
{$ENDIF WIN32}
end;
if FDefaultDrawing and not (csDesigning in ComponentState) and
(gdFocused in AState) and
([goEditing, goAlwaysShowEditor] * Options <>
[goEditing, goAlwaysShowEditor])
and not (goRowSelect in Options) then
DrawFocusRect(Canvas.Handle, ARect);
end;
{$IFDEF WIN32}
procedure TRxDrawGrid.WMRButtonUp(var Message: TWMMouse);
begin
if not (FGridState in [gsColMoving, gsRowMoving]) then
inherited
else if not (csNoStdEvents in ControlStyle) then
with Message do MouseUp(mbRight, KeysToShiftState(Keys), XPos, YPos);
end;
{$ENDIF}
procedure TRxDrawGrid.WMLButtonDblClk(var Message: TWMLButtonDblClk);
var
Cell: TGridCoord;
{$IFNDEF WIN32}
Form: TForm;
{$ENDIF}
begin
if FFixedCellsButtons then begin
with Message do
Cell := MouseCoord(XPos, YPos);
if ((Cell.X >= 0) and (Cell.X < FixedCols)) or
((Cell.Y >= 0) and (Cell.Y < FixedRows)) then
begin
{$IFDEF WIN32}
SendCancelMode(Self);
{$ELSE}
Form := GetParentForm(Self);
if Form <> nil then Form.SendCancelMode(Self);
{$ENDIF}
if csCaptureMouse in ControlStyle then MouseCapture := True;
{$IFDEF WIN32}
if not (csNoStdEvents in ControlStyle) then
{$ENDIF}
with Message do
MouseDown(mbLeft, KeysToShiftState(Keys) - [ssDouble], XPos, YPos);
Exit;
end;
end;
inherited;
end;
procedure TRxDrawGrid.WMKillFocus(var Msg: TWMKillFocus);
begin
inherited;
if Assigned(FOnChangeFocus) then FOnChangeFocus(Self);
end;
procedure TRxDrawGrid.WMSetFocus(var Msg: TWMSetFocus);
begin
inherited;
if Assigned(FOnChangeFocus) then FOnChangeFocus(Self);
end;
procedure TRxDrawGrid.WMCancelMode(var Message: TMessage);
begin
StopTracking;
inherited;
end;
function TRxDrawGrid.CreateEditor: TInplaceEdit;
begin
{$IFDEF WIN32}
Result := TRxInplaceEdit.Create(Self);
{$ELSE}
Result := inherited CreateEditor;
{$ENDIF}
TEdit(Result).OnChange := EditChanged;
end;
{$IFDEF WIN32}
function TRxDrawGrid.GetEditAlignment(ACol, ARow: Longint): TAlignment;
begin
Result := taLeftJustify;
if Assigned(FOnGetEditAlign) then FOnGetEditAlign(Self, ACol, ARow, Result);
end;
function TRxDrawGrid.GetEditStyle(ACol, ARow: Longint): TInplaceEditStyle;
begin
Result := esSimple;
if Assigned(FOnGetEditStyle) then FOnGetEditStyle(Self, ACol, ARow, Result);
end;
procedure TRxDrawGrid.GetPicklist(ACol, ARow: Longint; PickList: TStrings);
begin
if Assigned(FOnGetPicklist) then FOnGetPicklist(Self, ACol, ARow, PickList);
end;
procedure TRxDrawGrid.EditButtonClick;
begin
if Assigned(FOnEditButtonClick) then FOnEditButtonClick(Self);
end;
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -