📄 rm_propadds.pas
字号:
begin
if not PickListLoaded then
begin
if Assigned(OnGetPickListItems) then
OnGetPickListItems(TGridAccess(Grid).Col, TGridAccess(Grid).Row, PickList.Items);
PickListLoaded := (PickList.Items.Count > 0);
end;
end;
procedure TInplaceEditList.DropDown;
var
P: TPoint;
I, J, Y: Integer;
begin
if not ListVisible then
begin
ActiveList.Width := Width;
if ActiveList = FPickList then
begin
DoGetPickListItems;
TPopupListbox(PickList).Color := Color;
TPopupListbox(PickList).Font := Font;
if (DropDownRows > 0) and (PickList.Items.Count >= DropDownRows) then
PickList.Height := DropDownRows * TPopupListbox(PickList).ItemHeight + 4
else
PickList.Height := PickList.Items.Count * TPopupListbox(PickList).ItemHeight + 4;
if Text = '' then
PickList.ItemIndex := -1
else
PickList.ItemIndex := PickList.Items.IndexOf(Text);
J := PickList.ClientWidth;
for I := 0 to PickList.Items.Count - 1 do
begin
Y := PickList.Canvas.TextWidth(PickList.Items[I]);
if Y > J then J := Y;
end;
PickList.ClientWidth := J;
end;
P := Parent.ClientToScreen(Point(Left, Top));
Y := P.Y + Height;
if Y + ActiveList.Height > Screen.Height then Y := P.Y - ActiveList.Height;
SetWindowPos(ActiveList.Handle, HWND_TOP, P.X, Y, 0, 0,
SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
FListVisible := True;
Invalidate;
Windows.SetFocus(Handle);
end;
end;
function TInplaceEditList.GetPickList: TCustomListbox;
var
PopupListbox: TPopupListbox;
begin
if not Assigned(FPickList) then
begin
PopupListbox := TPopupListbox.Create(Self);
PopupListbox.Visible := False;
PopupListbox.Parent := Self;
PopupListbox.OnMouseUp := ListMouseUp;
PopupListbox.IntegralHeight := True;
PopupListbox.ItemHeight := 11;
FPickList := PopupListBox;
end;
Result := FPickList;
end;
procedure TInplaceEditList.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (EditStyle = esEllipsis) and (Key = VK_RETURN) and (Shift = [ssCtrl]) then
begin
DoEditButtonClick;
KillMessage(Handle, WM_CHAR);
end
else
inherited KeyDown(Key, Shift);
end;
procedure TInplaceEditList.ListMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
CloseUp(PtInRect(ActiveList.ClientRect, Point(X, Y)));
end;
procedure TInplaceEditList.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and (EditStyle <> esSimple) and
OverButton(Point(X, Y)) then
begin
if ListVisible then
CloseUp(False)
else
begin
MouseCapture := True;
FTracking := True;
TrackButton(X, Y);
if Assigned(ActiveList) then
DropDown;
end;
end;
inherited MouseDown(Button, Shift, X, Y);
end;
procedure TInplaceEditList.MouseMove(Shift: TShiftState; X, Y: Integer);
var
ListPos: TPoint;
MousePos: TSmallPoint;
begin
if FTracking then
begin
TrackButton(X, Y);
if ListVisible then
begin
ListPos := ActiveList.ScreenToClient(ClientToScreen(Point(X, Y)));
if PtInRect(ActiveList.ClientRect, ListPos) then
begin
StopTracking;
MousePos := PointToSmallPoint(ListPos);
SendMessage(ActiveList.Handle, WM_LBUTTONDOWN, 0, Integer(MousePos));
Exit;
end;
end;
end;
inherited MouseMove(Shift, X, Y);
end;
procedure TInplaceEditList.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
WasPressed: Boolean;
begin
WasPressed := Pressed;
StopTracking;
if (Button = mbLeft) and (EditStyle = esEllipsis) and WasPressed then
DoEditButtonClick;
inherited MouseUp(Button, Shift, X, Y);
end;
function TInplaceEditList.OverButton(const P: TPoint): Boolean;
begin
Result := PtInRect(ButtonRect, P);
end;
procedure TInplaceEditList.PaintWindow(DC: HDC);
var
R: TRect;
Flags: Integer;
W, X, Y: Integer;
begin
if EditStyle <> esSimple then
begin
R := ButtonRect;
Flags := 0;
case EditStyle of
esPickList:
begin
if ActiveList = nil then
Flags := DFCS_INACTIVE
else if Pressed then
Flags := DFCS_FLAT or DFCS_PUSHED;
DrawFrameControl(DC, R, DFC_SCROLL, Flags or DFCS_SCROLLCOMBOBOX);
end;
esEllipsis:
begin
if Pressed then Flags := BF_FLAT;
DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_MIDDLE or Flags);
X := R.Left + ((R.Right - R.Left) shr 1) - 1 + Ord(Pressed);
Y := R.Top + ((R.Bottom - R.Top) shr 1) - 1 + Ord(Pressed);
W := ButtonWidth shr 3;
if W = 0 then W := 1;
PatBlt(DC, X, Y, W, W, BLACKNESS);
PatBlt(DC, X - (W * 2), Y, W, W, BLACKNESS);
PatBlt(DC, X + (W * 2), Y, W, W, BLACKNESS);
end;
end;
ExcludeClipRect(DC, R.Left, R.Top, R.Right, R.Bottom);
end;
inherited PaintWindow(DC);
end;
procedure TInplaceEditList.RestoreContents;
begin
Reset;
(Grid as TD6CustomGrid).UpdateText;
end;
procedure TInplaceEditList.StopTracking;
begin
if FTracking then
begin
TrackButton(-1, -1);
FTracking := False;
MouseCapture := False;
end;
end;
procedure TInplaceEditList.TrackButton(X, Y: Integer);
var
NewState: Boolean;
R: TRect;
begin
R := ButtonRect;
NewState := PtInRect(R, Point(X, Y));
if Pressed <> NewState then
begin
FPressed := NewState;
InvalidateRect(Handle, @R, False);
end;
end;
procedure TInplaceEditList.UpdateContents;
begin
ActiveList := nil;
PickListLoaded := False;
FEditStyle := (Grid as TD6CustomGrid).GetEditStyle(TGridAccess(Grid).Col, TGridAccess(Grid).Row);
if EditStyle = esPickList then
ActiveList := PickList;
inherited UpdateContents;
end;
procedure TInplaceEditList.WMCancelMode(var Message: TMessage);
begin
StopTracking;
inherited;
end;
procedure TInplaceEditList.WMKillFocus(var Message: TMessage);
begin
if not SysLocale.FarEast then inherited
else
begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if HWND(Message.WParam) <> Grid.Handle then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
CloseUp(False);
end;
procedure TInplaceEditList.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
with Message do
if (EditStyle <> esSimple) and OverButton(Point(XPos, YPos)) then
Exit;
inherited;
end;
procedure TInplaceEditList.WMPaint(var Message: TWMPaint);
begin
PaintHandler(Message);
end;
procedure TInplaceEditList.WMSetCursor(var Message: TWMSetCursor);
var
P: TPoint;
begin
GetCursorPos(P);
P := ScreenToClient(P);
if (EditStyle <> esSimple) and OverButton(P) then
Windows.SetCursor(LoadCursor(0, idc_Arrow))
else
inherited;
end;
procedure TInplaceEditList.WndProc(var Message: TMessage);
begin
case Message.Msg of
wm_KeyDown, wm_SysKeyDown, wm_Char:
if EditStyle = esPickList then
with TWMKey(Message) do
begin
DoDropDownKeys(CharCode, KeyDataToShiftState(KeyData));
if (CharCode <> 0) and ListVisible then
begin
with TMessage(Message) do
SendMessage(ActiveList.Handle, Msg, WParam, LParam);
Exit;
end;
end
end;
inherited;
end;
{ TD6CustomGrid }
function TD6CustomGrid.GetEditStyle(ACol, ARow: Integer): TEditStyle;
begin
Result := esSimple;
end;
procedure TD6CustomGrid.UpdateText;
begin
if (InplaceEditor <> nil) and EditorMode then
SetEditText(Col, Row, InplaceEditor.Text);
end;
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -