cxfilterdialog.pas

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

PAS
514
字号
  FFilterEditHelper := GetFilterEditHelper(FEditProperties);

  Caption := cxGetResourceString(@cxSFilterDialogCaption);
  InitControls(ACriteriaItemCaption);
  if ALookAndFeel <> nil then
    InitLookAndFeel(ALookAndFeel);
  if AFont <> nil then
    DialogApplyFont(Self, AFont);
  InitControlValues;
end;

procedure TcxFilterDialog.AddFilterItem(AParent: TcxFilterCriteriaItemList;
  AComboBox: TcxComboBox; AValue: Variant; ADisplayValue: string);
const
  AOperatorKinds: array[fcoEqual .. fcoNotLike] of TcxFilterOperatorKind =
    (foEqual, foNotEqual, foLess, foLessEqual, foGreater, foGreaterEqual,
     foLike, foNotLike);
var
  AOperator: TcxFilterControlOperator;
begin
  AOperator := GetOperator(AComboBox);
  if AOperator = fcoNone then Exit;

  if AOperator in [fcoBlanks, fcoNonBlanks] then
  begin
    if AOperator = fcoBlanks then
      AOperator := fcoEqual
    else
      AOperator := fcoNotEqual;
    AValue := Null;
    ADisplayValue := cxGetResourceString(@cxSFilterBlankCaption);
  end;
  if VarIsNull(AValue) or (VarIsStr(AValue) and (AValue = '')) then
    ADisplayValue := cxGetResourceString(@cxSFilterBlankCaption);

  Criteria.AddItem(AParent, ItemLink, AOperatorKinds[AOperator], AValue, ADisplayValue);
end;

procedure TcxFilterDialog.CheckWildcardDescriptionVisibility;

  function CheckCombo(AComboBox: TcxComboBox): Boolean;
  begin
    Result := GetOperator(AComboBox) in [fcoLike, fcoNotLike];
  end;

begin
  lblSingle.Visible := CheckCombo(cbOperator1) or CheckCombo(cbOperator2);
  lblSeries.Visible := lblSingle.Visible;
end;

procedure TcxFilterDialog.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
// rollback  CorrectDlgParams(Params);
end;

procedure TcxFilterDialog.GetFilterValues(AEdit: TcxCustomEdit; var AValue: Variant;
  var ADisplayValue: TCaption);
begin
  AValue := Null;
  ADisplayValue := '';
  if GetOperatorComboBox(AEdit).ItemIndex <> -1 then
    FilterEditHelper.GetFilterValue(AEdit, EditProperties, AValue, ADisplayValue);
  ValidateValue(AEdit, AValue);
end;

function TcxFilterDialog.GetOperatorComboBox(AEdit: TcxCustomEdit): TcxComboBox;
begin
  if AEdit = FEdit1 then
    Result := cbOperator1
  else
    Result := cbOperator2;
end;

function TcxFilterDialog.GetSupportedOperators: TcxFilterControlOperators;
begin
  Result := FilterEditHelper.GetSupportedFilterOperators(EditProperties, ValueTypeClass);
  if not Criteria.SupportedLike then
    Result := Result - [fcoLike, fcoNotLike];
end;

procedure TcxFilterDialog.InitControls(const ACriteriaItemCaption: string);

  function CreateValueEdit(APlaceHolder: TControl; AOperatorComboBox: TcxComboBox): TcxCustomEdit;
  begin
    Result := FilterEditHelper.GetFilterEdit(EditProperties);
    with Result do
    begin
      BoundsRect := APlaceHolder.BoundsRect;
      Parent := Self;
      TabOrder := AOperatorComboBox.TabOrder + 1;
    end;
  end;

begin
  lblTitle.Caption := cxGetResourceString(@cxSFilterDialogRows);
  lblColumnCaption.Caption := ACriteriaItemCaption + ' ';
  bvlLine.SetBounds(lblColumnCaption.Left + lblColumnCaption.Width, bvlLine.Top,
    bvlLine.Width - lblColumnCaption.Width + bvlLine.Left - lblColumnCaption.Left,
    bvlLine.Height);

  rbAnd.Caption := cxGetResourceString(@cxSFilterDialogOperationAnd);
  rbOr.Caption := cxGetResourceString(@cxSFilterDialogOperationOr);
  lblSingle.Caption := cxGetResourceString(@cxSFilterDialogUse) + ' ' +
    Criteria.UnderscoreWildcard + ' ' + cxGetResourceString(@cxSFilterDialogSingleCharacter);
  lblSeries.Caption := cxGetResourceString(@cxSFilterDialogUse) + ' ' +
    Criteria.PercentWildcard + ' ' + cxGetResourceString(@cxSFilterDialogCharactersSeries);
  btnOK.Caption := cxGetResourceString(@cxSFilterControlDialogActionOkCaption);
  btnCancel.Caption := cxGetResourceString(@cxSFilterControlDialogActionCancelCaption);

  // Operator ComboBoxes
  FillOperatorComboBox(cbOperator1, SupportedOperators);
  with cbOperator1.Properties do
    DropDownRows := Items.Count;
  with cbOperator2.Properties do
  begin
    Items.Assign(cbOperator1.Properties.Items);
    Items.Insert(0, '');
    DropDownRows := Items.Count;
  end;

  // Value Edits
  FEdit1 := CreateValueEdit(lblEdit1PlaceHolder, cbOperator1);
  rbAnd.TabOrder := FEdit1.TabOrder + 1;
  FEdit2 := CreateValueEdit(lblEdit2PlaceHolder, cbOperator2);
end;

procedure TcxFilterDialog.InitControlValues;
var
  AItem: TcxFilterCriteriaItem;
begin
  // default values
  if (fcoLike in SupportedOperators) and (ValueTypeClass <> nil) and ValueTypeClass.IsString then
    cbOperator1.ItemIndex := GetOperatorIndex(cbOperator1, fcoLike)
  else
    if fcoEqual in SupportedOperators then
      cbOperator1.ItemIndex := GetOperatorIndex(cbOperator1, fcoEqual)
    else
      cbOperator1.ItemIndex := 0;
  cbOperator2.ItemIndex := 0;

  // current values
  AItem := Criteria.FindItemByItemLink(ItemLink);
  if AItem <> nil then
  begin
    InitEdits(cbOperator1, FEdit1, AItem);
    if (AItem.Parent <> Criteria.Root) and (AItem.Parent.Items[1] <> nil) then
    begin
      rbAnd.Checked := AItem.Parent.BoolOperatorKind = fboAnd;
      rbOr.Checked := not rbAnd.Checked;
      AItem := TcxFilterCriteriaItem(AItem.Parent.Items[1]);
      InitEdits(cbOperator2, FEdit2, AItem);
    end;
  end;

  SetEditValidChars(FEdit1);
  SetEditValidChars(FEdit2);
  CheckWildcardDescriptionVisibility;
end;

procedure TcxFilterDialog.InitEdits(AComboBox: TcxComboBox; AEdit: TcxCustomEdit;
  AItem: TcxFilterCriteriaItem);
var
  AOperator: TcxFilterControlOperator;
begin
  AOperator := GetFilterControlOperator(AItem.OperatorKind, AItem.ValueIsNull(AItem.Value));
  AComboBox.ItemIndex := GetOperatorIndex(AComboBox, AOperator);
  FilterEditHelper.SetFilterValue(AEdit, EditProperties, AItem.Value);
end;

procedure TcxFilterDialog.InitLookAndFeel(ALookAndFeel: TcxLookAndFeel);
begin
  cbOperator1.Style.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  FEdit1.Style.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  rbAnd.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  rbOr.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  cbOperator2.Style.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  FEdit2.Style.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  btnOK.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
  btnCancel.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
end;

procedure TcxFilterDialog.SetEditValidChars(AEdit: TcxCustomEdit);
var
  AWildcardChars: set of AnsiChar;
begin
  AWildcardChars := [AnsiChar(Criteria.UnderscoreWildcard), AnsiChar(Criteria.PercentWildcard)];
  if AEdit is TcxCustomTextEdit then
    with TcxCustomTextEdit(AEdit) do
      if GetOperator(GetOperatorComboBox(AEdit)) in [fcoLike, fcoNotLike] then
        ActiveProperties.ValidChars := ActiveProperties.ValidChars + AWildcardChars
      else
        ActiveProperties.ValidChars := ActiveProperties.ValidChars - AWildcardChars;
end;

procedure TcxFilterDialog.ValidateValue(AEdit: TcxCustomEdit; var AValue: Variant);
begin
  FilterControlValidateValue(AEdit, AValue, GetOperator(GetOperatorComboBox(AEdit)),
    ValueTypeClass, FilterEditHelper);
end;

procedure TcxFilterDialog.ApplyChanges;
var
  AItemList: TcxFilterCriteriaItemList;
begin
  Criteria.BeginUpdate;
  try
    Criteria.Root.BoolOperatorKind := fboAnd;
    Criteria.RemoveItemByItemLink(ItemLink);
    if cbOperator2.ItemIndex <> 0 then
    begin
      AItemList := Criteria.Root.AddItemList(TcxFilterBoolOperatorKind(rbOr.Checked));
      AddFilterItem(AItemList, cbOperator1, FValue1, FDisplayValue1);
      AddFilterItem(AItemList, cbOperator2, FValue2, FDisplayValue2);
    end
    else
      AddFilterItem(nil, cbOperator1, FValue1, FDisplayValue1);
  finally
    Criteria.EndUpdate;
  end;
end;

class function TcxFilterDialog.GetFilterEditHelper(AEditProperties: TcxCustomEditProperties): TcxCustomFilterEditHelperClass;
begin
  Result := FilterEditsController.FindHelper(AEditProperties.ClassType);
end;

procedure TcxFilterDialog.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if ModalResult <> mrOK then Exit;

  CanClose := False;

  FEdit1.ValidateEdit(True);
  FEdit2.ValidateEdit(True);
  btnOK.SetFocus;

  GetFilterValues(FEdit1, FValue1, FDisplayValue1);
  GetFilterValues(FEdit2, FValue2, FDisplayValue2);

  CanClose := True;
end;

procedure TcxFilterDialog.cbOperator1Click(Sender: TObject);
begin
  SetEditValidChars(FEdit1);
  CheckWildcardDescriptionVisibility;
end;

procedure TcxFilterDialog.cbOperator2PropertiesChange(Sender: TObject);  //!!!
begin
  SetEditValidChars(FEdit2);
  CheckWildcardDescriptionVisibility;
end;

end.

⌨️ 快捷键说明

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