0, SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW); FListVisible := False; if Assigned(FDataList) then FDataList.ListSource := nil; FLookupSource.Dataset := nil; Invalidate; if Accept then if FActiveList = FDataList then with TCustomVDBGrid(Grid), Columns[SelectedIndex].Field do begin MasterField := DataSet.FieldByName(KeyFields); if MasterField.CanModify then begin DataSet.Edit; MasterField.Value := ListValue; end; end else if (not VarIsNull(ListValue)) and EditCanModify then with TCustomVDBGrid(Grid), Columns[SelectedIndex].Field do Text := ListValue; end; end;
procedure TVDBGridInplaceEdit.DoDropDownKeys(var Key: Word; Shift: TShiftState); begin case Key of VK_UP, VK_DOWN: if ssAlt in Shift then begin if FListVisible then CloseUp(True) else DropDown; Key := 0; end; VK_RETURN, VK_ESCAPE: if FListVisible and not (ssAlt in Shift) then begin CloseUp(Key = VK_RETURN); Key := 0; end; end; end;
procedure TVDBGridInplaceEdit.DropDown; var P: TPoint; I,J,Y: Integer; Column: TColumn; begin if not FListVisible and Assigned(FActiveList) then begin FActiveList.Width := Width; with TCustomVDBGrid(Grid) do Column := Columns[SelectedIndex]; if FActiveList = FDataList then with Column.Field do begin FDataList.Color := Color; FDataList.Font := Font; FDataList.RowCount := Column.DropDownRows; FLookupSource.DataSet := LookupDataSet; FDataList.KeyField := LookupKeyFields; FDataList.ListField := LookupResultField; FDataList.ListSource := FLookupSource; FDataList.KeyValue := DataSet.FieldByName(KeyFields).Value; { J := Column.DefaultWidth; if J > FDataList.ClientWidth then FDataList.ClientWidth := J; } end else begin FPickList.Color := Color; FPickList.Font := Font; FPickList.Items := Column.Picklist; if FPickList.Items.Count >= Column.DropDownRows then FPickList.Height := Column.DropDownRows * FPickList.ItemHeight + 4 else FPickList.Height := FPickList.Items.Count * FPickList.ItemHeight + 4; if Column.Field.IsNull then FPickList.ItemIndex := -1 else FPickList.ItemIndex := FPickList.Items.IndexOf(Column.Field.Value); J := FPickList.ClientWidth; for I := 0 to FPickList.Items.Count - 1 do begin Y := FPickList.Canvas.TextWidth(FPickList.Items[I]); if Y > J then J := Y; end; FPickList.ClientWidth := J; end; P := Parent.ClientToScreen(Point(Left, Top)); Y := P.Y + Height; if Y + FActiveList.Height > Screen.Height then Y := P.Y - FActiveList.Height; SetWindowPos(FActiveList.Handle, HWND_TOP, P.X, Y, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW); FListVisible := True; Invalidate; Windows.SetFocus(Handle); end; end;
type TWinControlCracker = class(TWinControl) end;
procedure TVDBGridInplaceEdit.KeyDown(var Key: Word; Shift: TShiftState); begin if (EditStyle = esEllipsis) and (Key = VK_RETURN) and (Shift = [ssCtrl]) then begin TCustomVDBGrid(Grid).EditButtonClick; KillMessage(Handle, WM_CHAR); end else inherited KeyDown(Key, Shift); end;
procedure TVDBGridInplaceEdit.ListMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then CloseUp(PtInRect(FActiveList.ClientRect, Point(X, Y))); end;
procedure TVDBGridInplaceEdit.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) and (FEditStyle <> esSimple) and PtInRect(Rect(Width - FButtonWidth, 0, Width, Height), Point(X,Y)) then begin if FListVisible then CloseUp(False) else begin MouseCapture := True; FTracking := True; TrackButton(X, Y); if Assigned(FActiveList) then DropDown; end; end; inherited MouseDown(Button, Shift, X, Y); end;
procedure TVDBGridInplaceEdit.MouseMove(Shift: TShiftState; X, Y: Integer); var ListPos: TPoint; MousePos: TSmallPoint; begin if FTracking then begin TrackButton(X, Y); if FListVisible then begin ListPos := FActiveList.ScreenToClient(ClientToScreen(Point(X, Y))); if PtInRect(FActiveList.ClientRect, ListPos) then begin StopTracking; MousePos := PointToSmallPoint(ListPos); SendMessage(FActiveList.Handle, WM_LBUTTONDOWN, 0, Integer(MousePos)); Exit; end; end; end; inherited MouseMove(Shift, X, Y); end;
procedure TVDBGridInplaceEdit.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var WasPressed: Boolean; begin WasPressed := FPressed; StopTracking; if (Button = mbLeft) and (FEditStyle = esEllipsis) and WasPressed then TCustomVDBGrid(Grid).EditButtonClick; inherited MouseUp(Button, Shift, X, Y); end;
procedure TVDBGridInplaceEdit.PaintWindow(DC: HDC); var R: TRect; Flags: Integer; W: Integer; begin if FEditStyle <> esSimple then begin SetRect(R, Width - FButtonWidth, 0, Width, Height); Flags := 0; if FEditStyle in [esDataList, esPickList] then begin if FActiveList = nil then Flags := DFCS_INACTIVE else if FPressed then Flags := DFCS_FLAT or DFCS_PUSHED; DrawFrameControl(DC, R, DFC_SCROLL, Flags or DFCS_SCROLLCOMBOBOX); end else { esEllipsis } begin if FPressed then Flags := BF_FLAT; DrawEdge(DC, R, EDGE_RAISED, BF_RECT or BF_MIDDLE or Flags); Flags := ((R.Right - R.Left) shr 1) - 1 + Ord(FPressed); W := Height shr 3; if W = 0 then W := 1; PatBlt(DC, R.Left + Flags, R.Top + Flags, W, W, BLACKNESS); PatBlt(DC, R.Left + Flags - (W * 2), R.Top + Flags, W 上一页 [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自动适应宽度
|