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 + -
显示快捷键?