📄 rm_propadds.pas
字号:
{*******************************************************}
{ }
{ Extension Library }
{ }
{*******************************************************}
unit RM_PropAdds;
{$I RM.INC}
interface
{$IFNDEF COMPILER6_UP}
uses
Forms, Classes, Controls, Windows, Messages, SysUtils, StdCtrls, Grids,
Extctrls
{$IFDEF COMPILER6_UP}, Variants{$ENDIF};
type
TEditStyle = (esSimple, esEllipsis, esPickList);
TGridAccess = class(TCustomGrid);
TD6CustomGrid = class(TCustomGrid)
private
procedure UpdateText;
protected
function GetEditStyle(ACol, ARow: Longint): TEditStyle; dynamic;
end;
{ TInplaceEditList }
TOnGetPickListItems = procedure(ACol, ARow: Integer; Items: TStrings) of object;
TInplaceEditList = class(TInPlaceEdit)
private
FButtonWidth: Integer;
FPickList: TCustomListbox;
FActiveList: TWinControl;
FEditStyle: TEditStyle;
FDropDownRows: Integer;
FListVisible: Boolean;
FTracking: Boolean;
FPressed: Boolean;
FPickListLoaded: Boolean;
FOnGetPickListitems: TOnGetPickListItems;
FOnEditButtonClick: TNotifyEvent;
function GetPickList: TCustomListbox;
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;
protected
procedure BoundsChanged; override;
function ButtonRect: TRect;
procedure CloseUp(Accept: Boolean); dynamic;
procedure DblClick; override;
procedure DoDropDownKeys(var Key: Word; Shift: TShiftState); virtual;
procedure DoEditButtonClick; virtual;
procedure DoGetPickListItems; dynamic;
procedure DropDown; dynamic;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure ListMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
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;
function OverButton(const P: TPoint): Boolean;
procedure StopTracking;
procedure TrackButton(X, Y: Integer);
procedure WndProc(var Message: TMessage); override;
procedure PaintWindow(DC: HDC); override;
procedure UpdateContents; override;
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(Owner: TComponent); override;
procedure RestoreContents;
property ActiveList: TWinControl read FActiveList write FActiveList;
property ButtonWidth: Integer read FButtonWidth write FButtonWidth;
property DropDownRows: Integer read FDropDownRows write FDropDownRows;
property EditStyle: TEditStyle read FEditStyle;
property ListVisible: Boolean read FListVisible write FListVisible;
property PickList: TCustomListbox read GetPickList;
property PickListLoaded: Boolean read FPickListLoaded write FPickListLoaded;
property Pressed: Boolean read FPressed;
property OnEditButtonClick: TNotifyEvent read FOnEditButtonClick
write FOnEditButtonClick;
property OnGetPickListitems: TOnGetPickListItems read FOnGetPickListitems
write FOnGetPickListitems;
end;
{$ENDIF}
implementation
{$IFNDEF COMPILER6_UP}
type
{ 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;
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;
procedure TPopupListBox.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := Style or WS_BORDER;
ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
AddBiDiModeExStyle(ExStyle);
WindowClass.Style := CS_SAVEBITS;
end;
end;
procedure TPopupListbox.CreateWnd;
begin
inherited CreateWnd;
Windows.SetParent(Handle, 0);
CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0);
end;
procedure TPopupListbox.Keypress(var Key: Char);
var
TickCount: Integer;
begin
case Key of
#8, #27: FSearchText := '';
#32..#255:
begin
TickCount := GetTickCount;
if TickCount - FSearchTickCount > 2000 then FSearchText := '';
FSearchTickCount := TickCount;
if Length(FSearchText) < 32 then FSearchText := FSearchText + Key;
SendMessage(Handle, LB_SelectString, WORD(-1), Longint(PChar(FSearchText)));
Key := #0;
end;
end;
inherited Keypress(Key);
end;
procedure TPopupListbox.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
inherited MouseUp(Button, Shift, X, Y);
TInplaceEditList(Owner).CloseUp((X >= 0) and (Y >= 0) and
(X < Width) and (Y < Height));
end;
{ TInplaceEditList }
procedure TInplaceEditList.BoundsChanged;
var
R: TRect;
begin
SetRect(R, 2, 2, Width - 2, Height);
if EditStyle <> esSimple then
begin
if not Grid.UseRightToLeftAlignment then
Dec(R.Right, ButtonWidth)
else
Inc(R.Left, ButtonWidth - 2);
end;
SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@R));
SendMessage(Handle, EM_SCROLLCARET, 0, 0);
if SysLocale.FarEast then
SetImeCompositionWindow(Font, R.Left, R.Top);
end;
function TInplaceEditList.ButtonRect: TRect;
begin
if not Grid.UseRightToLeftAlignment then
Result := Rect(Width - ButtonWidth, 0, Width, Height)
else
Result := Rect(0, 0, ButtonWidth, Height);
end;
procedure TInplaceEditList.CloseUp(Accept: Boolean);
var
ListValue: Variant;
begin
if ListVisible and (ActiveList = FPickList) then
begin
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
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);
FListVisible := False;
Invalidate;
if Accept then
if (not VarIsEmpty(ListValue) or VarIsNull(ListValue))
and (ListValue <> Text) then
begin
{ Here we store the new value directly in the edit control so that
we bypass the CMTextChanged method on TCustomMaskedEdit. This
preserves the old value so that we can restore it later by calling
the Reset method. }
Perform(WM_SETTEXT, 0, Longint(string(ListValue)));
Modified := True;
with TGridAccess(Grid) do
SetEditText(Col, Row, ListValue);
end;
end;
end;
procedure TInplaceEditList.CMCancelMode(var Message: TCMCancelMode);
begin
if (Message.Sender <> Self) and (Message.Sender <> ActiveList) then
CloseUp(False);
end;
constructor TInplaceEditList.Create(Owner: TComponent);
begin
inherited Create(Owner);
FButtonWidth := GetSystemMetrics(SM_CXVSCROLL);
FEditStyle := esSimple;
end;
procedure TInplaceEditList.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
// Params.Style := Params.Style or ES_MULTILINE;
Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN or ES_LEFT;
end;
procedure TInplaceEditList.DblClick;
var
Index: Integer;
ListValue: string;
begin
if (EditStyle = esSimple) or Assigned(TGridAccess(Grid).OnDblClick) then
inherited
else if (EditStyle = esPickList) and (ActiveList = PickList) then
begin
DoGetPickListItems;
if PickList.Items.Count > 0 then
begin
Index := PickList.ItemIndex + 1;
if Index >= PickList.Items.Count then
Index := 0;
PickList.ItemIndex := Index;
ListValue := PickList.Items[PickList.ItemIndex];
Perform(WM_SETTEXT, 0, Longint(ListValue));
Modified := True;
with TGridAccess(Grid) do
SetEditText(Col, Row, ListValue);
SelectAll;
end;
end
else if EditStyle = esEllipsis then
DoEditButtonClick;
end;
procedure TInplaceEditList.DoDropDownKeys(var Key: Word; Shift: TShiftState);
begin
case Key of
VK_UP, VK_DOWN:
if ssAlt in Shift then
begin
if ListVisible then CloseUp(True) else DropDown;
Key := 0;
end;
VK_RETURN, VK_ESCAPE:
if ListVisible and not (ssAlt in Shift) then
begin
CloseUp(Key = VK_RETURN);
Key := 0;
end;
end;
end;
procedure TInplaceEditList.DoEditButtonClick;
begin
if Assigned(FOnEditButtonClick) then
FOnEditButtonClick(Grid);
end;
procedure TInplaceEditList.DoGetPickListItems;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -