cxdbextlookupcombobox.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 969 行 · 第 1/3 页

PAS
969
字号
type
  TcxCustomGridTableOptionsBehaviorAccess = class(TcxCustomGridTableOptionsBehavior);
  TcxCustomGridTableOptionsViewAccess = class(TcxCustomGridTableOptionsView);

{ TcxExtLookupGrid }

procedure TcxExtLookupGrid.DoCancelMode;
begin
  FRowPressed := False;
  inherited;
end;

procedure TcxExtLookupGrid.DoCloseUp(AAccept: Boolean);
begin
  if AAccept then
    View.DataController.SyncSelected(True);
  if Assigned(FOnCloseUp) then FOnCloseUp(Self, AAccept);
end;

function TcxExtLookupGrid.IsDataRow(AHitTest: TcxCustomGridHitTest): Boolean;
begin
  Result := (AHitTest is TcxGridRecordHitTest) and
    TcxGridRecordHitTest(AHitTest).GridRecord.IsData; 
end;

function TcxExtLookupGrid.GetView: TcxCustomGridTableView;
begin
  Result := Levels[0].GridView as TcxCustomGridTableView;
end;

procedure TcxExtLookupGrid.ViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Assigned(FPrevOnKeyDown) then
    FPrevOnKeyDown(Self, Key, Shift);
  if (View = nil) then Exit;
  case Key of
    VK_RETURN:
      if not Editable or not View.OptionsData.Editing or (ssCtrl in Shift) then
      begin
        if View.DataController.IsEditing then
          View.DataController.Post;
        DoCloseUp(View.DataController.FocusedRowIndex <> -1);
      end;
    VK_ESCAPE:
      if Editable and not View.DataController.IsEditing then
        DoCloseUp(False);
  end;
end;

procedure TcxExtLookupGrid.ViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  AHitTest: TcxCustomGridHitTest;
begin
  if Assigned(FPrevOnMouseDown) then
    FPrevOnMouseDown(Sender, Button, Shift, X, Y);
  AHitTest := View.ViewInfo.GetHitTest(X, Y);
  if (Button = mbLeft) and IsDataRow(AHitTest) then
  begin
    if Editable then
    begin
      if ssDouble in Shift then
        DoCloseUp(True);
    end
    else
      FRowPressed := True;
  end;
end;

procedure TcxExtLookupGrid.ViewMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  AHitTest: TcxCustomGridHitTest;
begin
  if Assigned(FPrevOnMouseMove) then
    FPrevOnMouseMove(Sender, Shift, X, Y);
  if not MouseCapture and PopupMouseMoveLocked then
  begin
    PopupMouseMoveLocked := False;
    Exit;
  end;
  // Hot Track
  if (View = nil) or Editable then Exit;
  AHitTest := View.ViewInfo.GetHitTest(X, Y);
  if IsDataRow(AHitTest) and ((FMousePos.X <> X) or (FMousePos.Y <> Y)) then
  begin
    FMousePos.X := X;
    FMousePos.Y := Y;
    TcxGridRecordHitTest(AHitTest).GridRecord.Focused := True;
  end;
end;

procedure TcxExtLookupGrid.ViewMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  AHitTest: TcxCustomGridHitTest;
begin
  if Assigned(FPrevOnMouseUp) then
    FPrevOnMouseUp(Sender, Button, Shift, X, Y);
  AHitTest := View.ViewInfo.GetHitTest(X, Y);
  if (Button = mbLeft) and FRowPressed then
    DoCloseUp(IsDataRow(AHitTest));
  FRowPressed := False;
end;

{ TcxExtLookupComboBoxProperties }

constructor TcxExtLookupComboBoxProperties.Create(AOwner: TPersistent);
begin
  inherited Create(AOwner);
  FAutoSearchOnPopup := True;
end;

destructor TcxExtLookupComboBoxProperties.Destroy;
begin
  FDestroying := True;
  ListFieldItem := nil;
  View := nil;
  FreeAndNil(FGrid);
  inherited Destroy;
end;

procedure TcxExtLookupComboBoxProperties.Assign(Source: TPersistent);
begin
  if Source is TcxExtLookupComboBoxProperties then
  begin
    BeginUpdate;
    try
      AutoSearchOnPopup := TcxExtLookupComboBoxProperties(Source).AutoSearchOnPopup;
      FocusPopup := TcxExtLookupComboBoxProperties(Source).FocusPopup;
      View := nil; //?
      GridMode := TcxExtLookupComboBoxProperties(Source).GridMode;
      View := TcxExtLookupComboBoxProperties(Source).View;
      inherited Assign(Source);
      ListFieldItem := TcxExtLookupComboBoxProperties(Source).ListFieldItem;
    finally
      EndUpdate;
    end
  end
  else
    inherited Assign(Source);
end;

class function TcxExtLookupComboBoxProperties.GetContainerClass: TcxContainerClass;
begin
  Result := TcxExtLookupComboBox;
end;

class function TcxExtLookupComboBoxProperties.IsViewSupported(Value: TcxCustomGridTableView): Boolean;
begin
  Result := Value.CanBeLookupList and
    (TcxCustomGridView(Value).DataController is TcxDBDataController);
end;

procedure TcxExtLookupComboBoxProperties.CheckListFieldItem;
begin
  FInCheckListFieldItem := True;
  try
    if (View <> nil) and (ListFieldItem <> nil) and
      (View.IndexOfItem(ListFieldItem) = -1) then
      ListFieldItem := nil;
  finally
    FInCheckListFieldItem := False;
  end;
end;

procedure TcxExtLookupComboBoxProperties.DeinitializeDataController;
begin
  inherited DeinitializeDataController;
  if DataController <> nil then
    DataController.RemoveDataChangeRefCount;
end;

procedure TcxExtLookupComboBoxProperties.FreeNotification(Sender: TComponent);
begin
  inherited FreeNotification(Sender);
  if Sender = ListFieldItem then
    ListFieldItem := nil;
  if Sender = View then
    View := nil;
end;

function TcxExtLookupComboBoxProperties.GetIncrementalFiltering: Boolean;
begin
  if FocusPopup then
    Result := False
  else
    Result := inherited GetIncrementalFiltering;
end;

function TcxExtLookupComboBoxProperties.GetListIndex: Integer;
begin
  Result := Self.ListFieldIndex;
end;

procedure TcxExtLookupComboBoxProperties.InitializeDataController;
begin
  inherited InitializeDataController;
  if DataController <> nil then
    DataController.AddDataChangeRefCount;
end;

procedure TcxExtLookupComboBoxProperties.LinkView(AView: TcxCustomGridTableView);
begin
  CheckListFieldItem;
  FreeNotificator.AddSender(AView);
  InitializeDataController;
end;

function TcxExtLookupComboBoxProperties.PopupWindowCapturesFocus: Boolean;
begin
  Result := FocusPopup;
end;

procedure TcxExtLookupComboBoxProperties.UnlinkView(AView: TcxCustomGridTableView);
begin
  DeinitializeDataController;
  FreeNotificator.RemoveSender(AView);
end;

// LookupGrid methods

function TcxExtLookupComboBoxProperties.GetLookupGridActiveControl: TWinControl;
begin
  if View <> nil then
    Result := View.Site
  else
    Result := inherited GetLookupGridActiveControl;
end;

function TcxExtLookupComboBoxProperties.GetLookupGridCanResize: Boolean;
begin
  if View <> nil then
    Result := not TcxCustomGridTableOptionsViewAccess(View.OptionsView).CellAutoHeight
  else
    Result := False;
end;

function TcxExtLookupComboBoxProperties.GetLookupGridColumnCount: Integer;
begin
  if View <> nil then
    Result := View.ItemCount
  else
    Result := 0;
end;

function TcxExtLookupComboBoxProperties.GetLookupGridControl: TWinControl;
begin
  Result := Grid;
end;

function TcxExtLookupComboBoxProperties.GetLookupGridDataController: TcxCustomDataController;
begin
  if View <> nil then
    Result := View.DataController
  else
    Result := nil;
end;

function TcxExtLookupComboBoxProperties.GetLookupGridVisualAreaPreferredWidth: Integer;
begin
  Result := 0;
  if View <> nil then
    View.ViewInfo.GetWidth(Point(MaxInt, MaxInt), Result);
end;

function TcxExtLookupComboBoxProperties.GetLookupGridNearestPopupHeight(AHeight: Integer): Integer;
begin
  if View <> nil then
    Result := View.ViewInfo.GetNearestPopupHeight(AHeight, FocusPopup)
  else
    Result := AHeight;
end;

function TcxExtLookupComboBoxProperties.GetLookupGridPopupHeight(ADropDownRowCount: Integer): Integer;
begin
  if View <> nil then
  begin
    if FocusPopup and (ADropDownRowCount < 2) then // TODO: Check New Item Row 
      ADropDownRowCount := 2;
    Result := View.ViewInfo.GetPopupHeight(ADropDownRowCount);
  end
  else
    Result := 0;
end;

function TcxExtLookupComboBoxProperties.IsLookupGridMouseOverList(const P: TPoint): Boolean;
var
  AHitTest: TcxCustomGridHitTest;
begin
  Result := False;
  if View <> nil then
  begin
    AHitTest := View.ViewInfo.GetHitTest(P);
    Result := AHitTest is TcxGridRecordHitTest;
  end;
end;

procedure TcxExtLookupComboBoxProperties.LookupGridDeinitialize;
begin
  Grid.Levels[0].GridView := nil;
  // restore options
  if (View <> nil) and not (csDestroying in View.ComponentState) then
  begin
    TcxCustomGridTableOptionsBehaviorAccess(View.OptionsBehavior).PullFocusing := FPrevPullFocusing;
    View.OptionsSelection.MultiSelect := FPrevMultiSelect;
    View.OptionsBehavior.ImmediateEditor := FPrevImmediateEditor;
    if View is TcxGridTableView then
      TcxGridTableView(View).OptionsCustomize.ColumnFiltering := FPrevColumnFiltering;
    View.OptionsBehavior.IncSearch := FPrevIncSearch;
    View.OnKeyDown := Grid.FPrevOnKeyDown;
    View.OnMouseDown := Grid.FPrevOnMouseDown;
    View.OnMouseMove := Grid.FPrevOnMouseMove;
    View.OnMouseUp := Grid.FPrevOnMouseUp;
  end;
end;

procedure TcxExtLookupComboBoxProperties.LookupGridDroppedDown(const AFindStr: string);
begin
  // Init Inc Search
  // TODO: !!!
  if FocusPopup and AutoSearchOnPopup and (ListFieldItem <> nil) then
  begin

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?