📄 jvdbgrid.pas
字号:
if GetCapture <> 0 then
SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
if ActiveList = DataList then
ListValue := DataList.KeyValue
else
if PickList.ItemIndex <> -1 then
ListValue := PickList.Items[PickList.ItemIndex];
SetWindowPos(ActiveList.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
ListVisible := False;
if Assigned(FDataList) then
FDataList.LookupSource := nil; // ListSource
FLookupSource.DataSet := nil;
Invalidate;
if Accept then
if ActiveList = DataList then
with TCustomDBGrid(Grid), TDBGrid(Grid).Columns[SelectedIndex].Field do
begin
MasterField := DataSet.FieldByName(KeyFields);
if MasterField.CanModify and TJvDBGrid(Grid).DataLink.Edit then
MasterField.Value := ListValue;
end
else
if (not VarIsNull(ListValue)) and EditCanModify then
with TCustomDBGrid(Grid), TDBGrid(Grid).Columns[SelectedIndex].Field do
Text := ListValue;
end;
end;
procedure TInternalInplaceEdit.DoEditButtonClick;
begin
TJvDBGrid(Grid).EditButtonClick; // TCustomDBGrid
end;
procedure TInternalInplaceEdit.DropDown;
var
Column: TColumn;
begin
if not ListVisible then
begin
with TDBGrid(Grid) do
Column := Columns[SelectedIndex];
if ActiveList = FDataList then
with Column.Field do
begin
FDataList.Color := Color;
FDataList.Font := Font;
FDataList.RowCount := Column.DropDownRows;
FLookupSource.DataSet := LookupDataSet;
FDataList.LookupField := LookupKeyFields; // KeyField
FDataList.LookupDisplay := LookupResultField; // ListField
FDataList.LookupSource := FLookupSource; // ListSource
FDataList.KeyValue := DataSet.FieldByName(KeyFields).Value;
end
else
if ActiveList = PickList then
begin
PickList.Items.Assign(Column.PickList);
DropDownRows := Column.DropDownRows;
end;
end;
inherited DropDown;
end;
procedure TInternalInplaceEdit.UpdateContents;
var
Column: TColumn;
begin
inherited UpdateContents;
if FUseDataList then
begin
if FDataList = nil then
begin
FDataList := TJvPopupDataList.Create(Self);
FDataList.Visible := False;
FDataList.Parent := Self;
FDataList.OnMouseUp := ListMouseUp;
end;
ActiveList := FDataList;
end;
with TDBGrid(Grid) do
Column := Columns[SelectedIndex];
Self.ReadOnly := Column.ReadOnly;
Font.Assign(Column.Font);
ImeMode := Column.ImeMode;
ImeName := Column.ImeName;
end;
type
TSelection = record
StartPos: Integer;
EndPos: Integer;
end;
procedure TInternalInplaceEdit.KeyDown(var Key: Word; Shift: TShiftState);
procedure SendToParent;
begin
TJvDBGrid(Grid).KeyDown(Key, Shift);
Key := 0;
end;
procedure ParentEvent;
var
GridKeyDown: TKeyEvent;
begin
GridKeyDown := TJvDBGrid(Grid).OnKeyDown;
if Assigned(GridKeyDown) then
GridKeyDown(Grid, Key, Shift);
end;
function ForwardMovement: Boolean;
begin
Result := dgAlwaysShowEditor in TDBGrid(Grid).Options;
end;
function Ctrl: Boolean;
begin
Result := (Shift * KeyboardShiftStates = [ssCtrl]);
end;
function Selection: TSelection;
begin
SendMessage(Handle, EM_GETSEL, WPARAM(@Result.StartPos), LPARAM(@Result.EndPos));
end;
function CaretPos: Integer;
var
P: TPoint;
begin
Windows.GetCaretPos(P);
Result := SendMessage(Handle, EM_CHARFROMPOS, 0, MakeLong(P.X, P.Y));
end;
function RightSide: Boolean;
begin
with Selection do
Result := {(CaretPos = GetTextLen) and }
((StartPos = 0) or (EndPos = StartPos)) and (EndPos = GetTextLen);
end;
function LeftSide: Boolean;
begin
with Selection do
Result := (CaretPos = 0) and (StartPos = 0) and
((EndPos = 0) or (EndPos = GetTextLen));
end;
begin
case Key of
VK_LEFT:
if ForwardMovement and (Ctrl or LeftSide) then
SendToParent;
VK_RIGHT:
if ForwardMovement and (Ctrl or RightSide) then
SendToParent;
end;
inherited KeyDown(Key, Shift);
end;
function TInternalInplaceEdit.DoMouseWheel(Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint): Boolean;
begin
// Do not validate a record by error
with TJvDBGrid(Grid) do
if DataLink.Active and (DataLink.DataSet.State <> dsBrowse) then
DataLink.DataSet.Cancel;
// Ideally we would transmit the action to the DatalList but
// DoMouseWheel is protected
// Result := FDataList.DoMouseWheel(Shift, WheelDelta, MousePos);
Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos);
end;
{$ENDIF COMPILER6_UP}
//=== { TJvDBGridLayoutChangeLink } ==========================================
procedure TJvDBGridLayoutChangeLink.DoChange(Grid: TJvDBGrid;
Kind: TJvDBGridLayoutChangeKind);
begin
if Assigned(OnChange) then
OnChange(Grid, Kind);
end;
//=== { TJvDBGridControls } ==================================================
constructor TJvDBGridControls.Create(ParentDBGrid: TJvDBGrid);
begin
inherited Create(TJvDBGridControl);
FParentDBGrid := ParentDBGrid;
end;
procedure TJvDBGridControl.Assign(Source: TPersistent);
begin
if Source is TJvDBGridControl then
begin
ControlName := TJvDBGridControl(Source).ControlName;
FieldName := TJvDBGridControl(Source).FieldName;
FitCell := TJvDBGridControl(Source).FitCell;
FDesignWidth := 0;
FDesignHeight := 0;
end
else
inherited Assign(Source);
end;
function TJvDBGridControls.GetOwner: TPersistent;
begin
Result := FParentDBGrid;
end;
function TJvDBGridControls.Add: TJvDBGridControl;
begin
Result := TJvDBGridControl(inherited Add);
end;
function TJvDBGridControls.GetItem(Index: Integer): TJvDBGridControl;
begin
Result := TJvDBGridControl(inherited GetItem(Index));
end;
procedure TJvDBGridControls.SetItem(Index: Integer; Value: TJvDBGridControl);
begin
inherited SetItem(Index, Value);
end;
function TJvDBGridControls.ControlByField(const FieldName: string): TJvDBGridControl;
var
Ctrl_Idx: Integer;
begin
Result := nil;
for Ctrl_Idx := 0 to Count - 1 do
if AnsiSameText(Items[Ctrl_Idx].FieldName, FieldName) then
begin
Result := Items[Ctrl_Idx];
Break;
end;
end;
function TJvDBGridControls.ControlByName(const CtrlName: string): TJvDBGridControl;
var
Ctrl_Idx: Integer;
begin
Result := nil;
for Ctrl_Idx := 0 to Count - 1 do
if AnsiSameText(Items[Ctrl_Idx].ControlName, CtrlName) then
begin
Result := Items[Ctrl_Idx];
Break;
end;
end;
//=== { TJvDBGrid } ==========================================================
constructor TJvDBGrid.Create(AOwner: TComponent);
var
Bmp: TBitmap;
begin
inherited Create(AOwner);
inherited DefaultDrawing := False;
FAutoSort := True;
FBeepOnError := True;
Options := DefJvGridOptions;
Bmp := TBitmap.Create;
try
Bmp.Handle := LoadBitmap(HInstance, bmMultiDot);
FMsIndicators := TImageList.CreateSize(Bmp.Width, Bmp.Height);
FMsIndicators.AddMasked(Bmp, clWhite);
Bmp.Handle := LoadBitmap(HInstance, bmMultiArrow);
FMsIndicators.AddMasked(Bmp, clWhite);
finally
Bmp.Free;
end;
FIniLink := TJvIniLink.Create;
FIniLink.OnSave := IniSave;
FIniLink.OnLoad := IniLoad;
FShowGlyphs := True;
FDefaultDrawing := True;
FClearSelection := True;
FAutoAppend := True; // Polaris
FShowTitleHint := False;
FShowCellHint := False;
FAlternateRowColor := clNone;
FAlternateRowFontColor := clNone;
FSelectColumn := scDataBase;
FTitleArrow := False;
FPostOnEnter := False;
FAutoSizeColumnIndex := JvGridResizeProportionally;
FSelectColumnsDialogStrings := TJvSelectDialogColumnStrings.Create;
FCharList :=
['A'..'Z', 'a'..'z', ' ', '-', '+', '0'..'9', '.', ',',
'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -