📄 rxdbctrl.pas
字号:
Canvas.Font.Color := clWindowText;
with Selection do
DrawFocusRect(Canvas.Handle, BoxRect(Left, Top, Right, Bottom));
end;
end;
procedure TRxDBGrid.SetTitleButtons(Value: Boolean);
begin
if FTitleButtons <> Value then begin
FTitleButtons := Value;
Invalidate;
SetOptions(Options);
end;
end;
procedure TRxDBGrid.SetMultiSelect(Value: Boolean);
begin
if FMultiSelect <> Value then begin
FMultiSelect := Value;
if not Value then SelectedRows.Clear;
end;
end;
function TRxDBGrid.GetStorage: TFormPlacement;
begin
Result := FIniLink.Storage;
end;
procedure TRxDBGrid.SetStorage(Value: TFormPlacement);
begin
FIniLink.Storage := Value;
end;
function TRxDBGrid.AcquireFocus: Boolean;
begin
Result := True;
if FAcquireFocus and CanFocus and not (csDesigning in ComponentState) then
begin
SetFocus;
Result := Focused or (InplaceEditor <> nil) and InplaceEditor.Focused;
end;
end;
function TRxDBGrid.CanEditShow: Boolean;
var
F: TField;
begin
Result := inherited CanEditShow;
F := nil;
if Result and (Datalink <> nil) and Datalink.Active and (FieldCount > 0) and
(SelectedIndex < FieldCount) and (SelectedIndex >= 0) and
(FieldCount <= DataSource.DataSet.FieldCount) then
begin
F := Fields[SelectedIndex];
if F <> nil then Result := GetImageIndex(F) < 0;
end;
if Result and Assigned(FOnShowEditor) then
FOnShowEditor(Self, F, Result);
end;
procedure TRxDBGrid.GetCellProps(Field: TField; AFont: TFont;
var Background: TColor; Highlight: Boolean);
var
AColor, ABack: TColor;
begin
if Assigned(FOnGetCellParams) then
FOnGetCellParams(Self, Field, AFont, Background, Highlight)
else if Assigned(FOnGetCellProps) then begin
if Highlight then begin
AColor := AFont.Color;
FOnGetCellProps(Self, Field, AFont, ABack);
AFont.Color := AColor;
end
else FOnGetCellProps(Self, Field, AFont, Background);
end;
end;
procedure TRxDBGrid.DoTitleClick(ACol: Longint; AField: TField);
begin
if Assigned(FOnTitleBtnClick) then FOnTitleBtnClick(Self, ACol, AField);
end;
procedure TRxDBGrid.CheckTitleButton(ACol, ARow: Longint; var Enabled: Boolean);
var
Field: TField;
begin
if (ACol >= 0) and (ACol < Columns.Count) then
begin
if Assigned(FOnCheckButton) then begin
Field := Columns[ACol].Field;
{$IFDEF RX_D4}
if ColumnAtDepth(Columns[ACol], ARow) <> nil then
Field := ColumnAtDepth(Columns[ACol], ARow).Field;
{$ENDIF}
FOnCheckButton(Self, ACol, Field, Enabled);
end;
end
else Enabled := False;
end;
procedure TRxDBGrid.DisableScroll;
begin
Inc(FDisableCount);
end;
type
THackLink = class(TGridDataLink);
procedure TRxDBGrid.EnableScroll;
begin
if FDisableCount <> 0 then begin
Dec(FDisableCount);
if FDisableCount = 0 then
THackLink(DataLink).DataSetScrolled(0);
end;
end;
function TRxDBGrid.ScrollDisabled: Boolean;
begin
Result := FDisableCount <> 0;
end;
procedure TRxDBGrid.Scroll(Distance: Integer);
{$IFNDEF RX_D3}
var
IndicatorRect: TRect;
{$ENDIF}
begin
if FDisableCount = 0 then begin
inherited Scroll(Distance);
{$IFNDEF RX_D3}
if (dgIndicator in Options) and HandleAllocated and MultiSelect then
begin
IndicatorRect := BoxRect(0, 0, 0, RowCount - 1);
InvalidateRect(Handle, @IndicatorRect, False);
end;
{$ENDIF}
end;
end;
{$IFDEF RX_D4}
function TRxDBGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
Result := False;
if Assigned(OnMouseWheelDown) then
OnMouseWheelDown(Self, Shift, MousePos, Result);
if not Result then begin
if not AcquireFocus then Exit;
if Datalink.Active then begin
Result := Datalink.DataSet.MoveBy(1) <> 0;
end;
end;
end;
function TRxDBGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
Result := False;
if Assigned(OnMouseWheelUp) then
OnMouseWheelUp(Self, Shift, MousePos, Result);
if not Result then begin
if not AcquireFocus then Exit;
if Datalink.Active then begin
Result := Datalink.DataSet.MoveBy(-1) <> 0;
end;
end;
end;
{$ENDIF RX_D4}
procedure TRxDBGrid.EditChanged(Sender: TObject);
begin
if Assigned(FOnEditChange) then FOnEditChange(Self);
end;
procedure TRxDBGrid.TopLeftChanged;
begin
if (dgRowSelect in Options) and DefaultDrawing then
GridInvalidateRow(Self, Self.Row);
inherited TopLeftChanged;
if FTracking then StopTracking;
if Assigned(FOnTopLeftChanged) then FOnTopLeftChanged(Self);
end;
procedure TRxDBGrid.StopTracking;
begin
if FTracking then begin
TrackButton(-1, -1);
FTracking := False;
MouseCapture := False;
end;
end;
procedure TRxDBGrid.TrackButton(X, Y: Integer);
var
Cell: TGridCoord;
NewPressed: Boolean;
I, Offset: Integer;
begin
Cell := MouseCoord(X, Y);
Offset := TitleOffset;
NewPressed := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y)) and
(FPressedCol = GetMasterColumn(Cell.X, Cell.Y)) and (Cell.Y < Offset);
if FPressed <> NewPressed then begin
FPressed := NewPressed;
for I := 0 to Offset - 1 do
GridInvalidateRow(Self, I);
end;
end;
procedure TRxDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
Cell: TGridCoord;
MouseDownEvent: TMouseEvent;
EnableClick: Boolean;
begin
if not AcquireFocus then Exit;
if (ssDouble in Shift) and (Button = mbLeft) then begin
DblClick;
Exit;
end;
if Sizing(X, Y) then
inherited MouseDown(Button, Shift, X, Y)
else begin
Cell := MouseCoord(X, Y);
{$IFDEF RX_D4}
if (DragKind = dkDock) and (Cell.X < IndicatorOffset) and
(Cell.Y < TitleOffset) and (not (csDesigning in ComponentState)) then
begin
BeginDrag(False);
Exit;
end;
{$ENDIF}
if FTitleButtons and (Datalink <> nil) and Datalink.Active and
(Cell.Y < TitleOffset) and (Cell.X >= IndicatorOffset) and
not (csDesigning in ComponentState) then
begin
if (dgColumnResize in Options) and (Button = mbRight) then begin
Button := mbLeft;
FSwapButtons := True;
MouseCapture := True;
end
else if Button = mbLeft then begin
EnableClick := True;
CheckTitleButton(Cell.X - IndicatorOffset, Cell.Y, EnableClick);
if EnableClick then begin
MouseCapture := True;
FTracking := True;
FPressedCol := GetMasterColumn(Cell.X, Cell.Y);
TrackButton(X, Y);
end else Beep;
Exit;
end;
end;
if (Cell.X < FixedCols + IndicatorOffset) and Datalink.Active then begin
if (dgIndicator in Options) then
inherited MouseDown(Button, Shift, 1, Y)
else if Cell.Y >= TitleOffset then
if Cell.Y - Row <> 0 then Datalink.Dataset.MoveBy(Cell.Y - Row);
end
else inherited MouseDown(Button, Shift, X, Y);
MouseDownEvent := OnMouseDown;
if Assigned(MouseDownEvent) then MouseDownEvent(Self, Button, Shift, X, Y);
if not (((csDesigning in ComponentState) or (dgColumnResize in Options)) and
(Cell.Y < TitleOffset)) and (Button = mbLeft) then
begin
if MultiSelect and Datalink.Active then
with SelectedRows do begin
FSelecting := False;
if ssCtrl in Shift then
CurrentRowSelected := not CurrentRowSelected
else begin
Clear;
if FClearSelection then CurrentRowSelected := True;
end;
end;
end;
end;
end;
procedure TRxDBGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if FTracking then TrackButton(X, Y);
inherited MouseMove(Shift, X, Y);
end;
procedure TRxDBGrid.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
Cell: TGridCoord;
ACol: Longint;
DoClick: Boolean;
begin
if FTracking and (FPressedCol <> nil) then
begin
Cell := MouseCoord(X, Y);
DoClick := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y))
and (Cell.Y < TitleOffset) and
(FPressedCol = GetMasterColumn(Cell.X, Cell.Y));
StopTracking;
if DoClick then begin
ACol := Cell.X;
if (dgIndicator in Options) then Dec(ACol);
if (DataLink <> nil) and DataLink.Active and (ACol >= 0) and
(ACol < Columns.Count) then
begin
DoTitleClick(FPressedCol.Index, FPressedCol.Field);
end;
end;
end
else if FSwapButtons then begin
FSwapButtons := False;
MouseCapture := False;
if Button = mbRight then Button := mbLeft;
end;
// Polaris
if (Button = mbLeft) and (FGridState = gsColSizing) and
(FSizingIndex + Byte(not (dgIndicator in Options)) <= FixedCols) then
begin
ColWidths[FSizingIndex] := X - FSizingOfs - CellRect(FSizingIndex, 0).Left;
FGridState := gsNormal;
Exit
end;
// Polaris
inherited MouseUp(Button, Shift, X, Y);
end;
procedure TRxDBGrid.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;
procedure TRxDBGrid.WMCancelMode(var Message: TMessage);
begin
StopTracking;
inherited;
end;
type
THack = class(TWinControl);
procedure TRxDBGrid.WMChar(var Msg: TWMChar);
function DoKeyPress(var Msg: TWMChar): Boolean;
var
Form: TCustomForm;
Ch: Char;
begin
Result := True;
Form := GetParentForm(Self);
if (Form <> nil) and TForm(Form).KeyPreview and
THack(Form).DoKeyPress(Msg) then Exit;
with Msg do begin
if Assigned(FOnKeyPress) then begin
Ch := Char(CharCode);
FOnKeyPress(Self, Ch);
CharCode := Word(Ch);
end;
if Char(CharCode) = #0 then Exit;
end;
Result := False;
end;
begin
if EditorMode or not DoKeyPress(Msg) then inherited;
end;
procedure TRxDBGrid.KeyPress(var Key: Char);
begin
if EditorMode then inherited OnKeyPress := FOnKeyPress;
try
inherited KeyPress(Key);
finally
inherited OnKeyPress := nil;
end;
end;
procedure TRxDBGrid.DefaultDataCellDraw(const Rect: TRect; Field: TField;
State: TGridDrawState);
begin
DefaultDrawDataCell(Rect, Field, State);
end;
function TRxDBGrid.GetMasterColumn(ACol, ARow: Longint): TColumn;
begin
if (dgIndicator in Options) then Dec(ACol, IndicatorOffset);
if (Datalink <> nil) and Datalink.Active and (ACol >= 0) and
(ACol < Columns.Count) then
begin
Result := Columns[ACol];
{$IFDEF RX_D4}
Result := ColumnAtDepth(Result, ARow);
{$ENDIF}
end
else Result := nil;
end;
procedure TRxDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);
{$IFDEF RX_D4}
function CalcTitleRect(Col: TColumn; ARow: Integer; var MasterCol: TColumn): TRect;
{ copied from Inprise's DbGrids.pas }
var
I,J: Integer;
InBiDiMode: Boolean;
DrawInfo: TGridDrawInfo;
begin
MasterCol := ColumnAtDepth(Col, ARow);
if MasterCol = nil then Exit;
I := DataToRawColumn(MasterCol.Index);
if I >= LeftCol then J := MasterCol.Depth
else begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -