sp; property DragCursor; property DragMode; property Enabled; property FixedColor; property Font; property ImeMode; property ImeName; property Options; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ReadOnly; property ShowHint; property TabOrder; property TabStop; property TitleFont; property Visible; property Vertical; property OnlyOne; property DefaultColWidth; property TitlesWidth; property OnCellClick; property OnColEnter; property OnColExit; property OnColumnMoved; property OnDrawDataCell; { obsolete } property OnDrawColumnCell; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEditButtonClick; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnStartDrag; property OnTitleClick; end;
const IndicatorWidth = 11;
procedure Register;
implementation
uses DBConsts, Dialogs;
{$R dbvgrids.res}
procedure Register; begin RegisterComponents(''''Data Controls'''', [ TVDBGrid ]); // RegisterPropertyEditor(TypeInfo(TDBGridColumns), TCustomVDBGrid, // ''''Columns'''', TDBGridColumnsEditor); end;
const bmArrow = ''''DBVGARROW''''; bmEdit = ''''DBVEDIT''''; bmInsert = ''''DBVINSERT''''; bmMultiDot = ''''DBVMULTIDOT''''; bmMultiArrow = ''''DBVMULTIARROW'''';
MaxMapSize = (MaxInt div 2) div SizeOf(Integer); { 250 million }
{ Error reporting }
procedure RaiseGridError(const S: string); begin raise EInvalidGridOperation.Create(S); 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;
{ TVDBGridInplaceEdit }
{ TVDBGridInplaceEdit adds support for a button on the in-place editor, which can be used to drop down a table-based lookup list, a stringlist-based pick list, or (if button style is esEllipsis) fire the grid event OnEditButtonClick. }
type TEditStyle = (esSimple, esEllipsis, esPickList, esDataList); TPopupListbox = class;
TVDBGridInplaceEdit = class(TInplaceEdit) private FButtonWidth: Integer; FDataList: TDBLookupListBox; FPickList: TPopupListbox; FActiveList: TWinControl; FLookupSource: TDatasource; FEditStyle: TEditStyle; FListVisible: Boolean; FTracking: Boolean; FPressed: Boolean; procedure ListMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SetEditStyle(Value: TEditStyle); procedure StopTracking; procedure TrackButton(X,Y: Integer); 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; procedure CloseUp(Accept: Boolean); procedure DoDropDownKeys(var Key: Word; Shift: TShiftState); procedure DropDown; procedure KeyDown(var Key: Word; Shift: TShiftState); override; 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; procedure PaintWindow(DC: HDC); override; procedure UpdateContents; override; procedure WndProc(var Message: TMessage); override; property EditStyle: TEditStyle read FEditStyle write SetEditStyle; property ActiveList: TWinControl read FActiveList write FActiveList; property DataList: TDBLookupListBox read FDataList; property PickList: TPopupListbox read FPickList; public constructor Create(Owner: TComponent); override; end;
{ 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 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; 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); TVDBGridInPlaceEdit(Owner).CloseUp((X >= 0) and (Y >= 0) and (X < Width) and (Y < Height)); end;
constructor TVDBGridInplaceEdit.Create(Owner: TComponent); begin inherited Create(Owner); FLookupSource := TDataSource.Create(Self); FButtonWidth := GetSystemMetrics(SM_CXVSCROLL); FEditStyle := esSimple; end;
procedure TVDBGridInplaceEdit.BoundsChanged; var R: TRect; begin SetRect(R, 2, 2, Width - 2, Height); if FEditStyle <> esSimple then Dec(R.Right, FButtonWidth); SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@R)); SendMessage(Handle, EM_SCROLLCARET, 0, 0); if SysLocale.Fareast then SetImeCompositionWindow(Font, R.Left, R.Top); end;
procedure TVDBGridInplaceEdit.CloseUp(Accept: Boolean); var MasterField: TField; ListValue: Variant; begin if FListVisible then begin if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0); if FActiveList = FDataList then ListValue := FDataList.KeyValue else if FPickList.ItemIndex <> -1 then ListValue := FPickList.Items[FPicklist.ItemIndex]; SetWindowPos(FActiveList.Handle, 0, 0, 0, 0, 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >> [聊天工具]让你的MSN Messenger好友看到你在干嘛__天极Yesky [聊天工具]让你的Foxmail不再撒谎 [聊天工具]IncrediMail让你的E-mail也作秀 [常用软件]让你的Blog拥有Google日历 [常用软件][网络]Stuff Plug 让你的MSN聊天与众不同 [Delphi程序]让你的DBGridEh的Column自动适应宽度
|