cxdbfiltercontrol.pas

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

PAS
954
字号
  end;
end;

{ TcxFilterItemCollection }

procedure TcxFilterItemCollection.Update(Item: TCollectionItem);
begin
  if (UpdateCount = 0) and (Control.ComponentState * [csDestroying, csLoading] = []) then
    Control.LayoutChanged;
end;

function TcxFilterItemCollection.GetControl: TcxDBFilterControl;
begin
  if GetOwner is TcxDBFilterControl then
    Result := TcxDBFilterControl(GetOwner)
  else
    Result := nil;
end;

function TcxFilterItemCollection.GetItems(Index: Integer): TcxFilterItem;
begin
  Result := TcxFilterItem(inherited Items[Index])
end;

procedure TcxFilterItemCollection.SetItems(Index: Integer;
  const Value: TcxFilterItem);
begin
  inherited Items[Index] := Value;
end;

{ TcxFilterPropertiesList }

procedure TcxFilterPropertiesList.Clear;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do
    TcxCustomEditProperties(Items[I]).Free;
  inherited Clear;
end;

function TcxFilterPropertiesList.GetProperties(
  AClass: TcxCustomEditPropertiesClass): TcxCustomEditProperties;
var
  I: Integer;
begin
  Result := nil;
  if AClass = nil then Exit;
  for I := 0 to Count - 1 do
    if TcxCustomEditProperties(Items[I]).ClassType = AClass then
    begin
      Result := TcxCustomEditProperties(Items[I]);
      break
    end;
  if Result = nil then
  begin
    Result := AClass.Create(nil);
    Add(Result);
  end;
end;

{ TcxDBFilterOptions }

constructor TcxDBFilterOptions.Create(AFilterControl: TcxDBFilterControl);
begin
  FFilterControl := AFilterControl;
  FSupportedBetween := True;
  FSupportedIn := True;
  FSupportedLike := True;
end;

procedure TcxDBFilterOptions.Assign(Source: TPersistent);
begin
  if Source is TcxDBFilterOptions then
    with TcxDBFilterOptions(Source) do
    begin
      Self.DateTimeFormat := DateTimeFormat;
      Self.PercentWildcard := PercentWildcard;
      Self.SoftNull := SoftNull;
      Self.SupportedBetween := SupportedBetween;
      Self.SupportedIn := SupportedIn;
      Self.SupportedLike := SupportedLike;
      Self.TranslateBetween := TranslateBetween;
      Self.TranslateIn := TranslateIn;
      Self.TranslateLike := TranslateLike;
      Self.UnderscoreWildcard := UnderscoreWildcard;
    end;
end;

procedure TcxDBFilterOptions.ProcessFilterOperators(
  var SupportedOperations: TcxFilterControlOperators);
begin
  if not SupportedBetween then
    SupportedOperations := SupportedOperations - [fcoBetween, fcoNotBetween];
  if not SupportedIn then
    SupportedOperations := SupportedOperations - [fcoInList, fcoNotInList];
  if not SupportedLike then
    SupportedOperations := SupportedOperations - [fcoLike, fcoNotLike];
end;

function TcxDBFilterOptions.GetOwner: TPersistent;
begin
  Result := FFilterControl;
end;

function TcxDBFilterOptions.GetDateTimeFormat: string;
begin
  Result := FFilterControl.Criteria.DateTimeFormat;
end;

function TcxDBFilterOptions.GetPercentWildcard: Char;
begin
  Result := FFilterControl.Criteria.PercentWildcard;
end;

function TcxDBFilterOptions.GetSoftNull: Boolean;
begin
  Result := fcoSoftNull in FFilterControl.Criteria.Options;
end;

function TcxDBFilterOptions.GetTranslateBetween: Boolean;
begin
  Result := FFilterControl.Criteria.TranslateBetween;
end;

function TcxDBFilterOptions.GetTranslateIn: Boolean;
begin
  Result := FFilterControl.Criteria.TranslateIn;
end;

function TcxDBFilterOptions.GetTranslateLike: Boolean;
begin
  Result := FFilterControl.Criteria.TranslateLike;
end;

function TcxDBFilterOptions.GetUnderscoreWildcard: Char;
begin
  Result := FFilterControl.Criteria.UnderscoreWildcard;
end;

procedure TcxDBFilterOptions.SetDateTimeFormat(const Value: string);
begin
  FFilterControl.Criteria.DateTimeFormat := Value;
end;

procedure TcxDBFilterOptions.SetPercentWildcard(Value: Char);
begin
  FFilterControl.Criteria.PercentWildcard := Value;
end;

procedure TcxDBFilterOptions.SetSoftNull(Value: Boolean);
begin
  with FFilterControl.Criteria do
    if Value then
      Options := Options + [fcoSoftNull]
    else
      Options := Options - [fcoSoftNull];
end;

procedure TcxDBFilterOptions.SetTranslateBetween(Value: Boolean);
begin
  FFilterControl.Criteria.TranslateBetween := Value;
end;

procedure TcxDBFilterOptions.SetTranslateIn(Value: Boolean);
begin
  FFilterControl.Criteria.TranslateIn := Value;
end;

procedure TcxDBFilterOptions.SetTranslateLike(Value: Boolean);
begin
  FFilterControl.Criteria.TranslateLike := Value;
end;

procedure TcxDBFilterOptions.SetUnderscoreWildcard(Value: Char);
begin
  FFilterControl.Criteria.UnderscoreWildcard := Value;
end;

{ TcxDBFilterControl }

constructor TcxDBFilterControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FFilterOptions := TcxDBFilterOptions.Create(Self);
  FItems := TcxFilterItemCollection.Create(Self, TcxFilterItem);
  FDataSource := TDataSource.Create(Self);
  FDataSource.OnStateChange := DataSetStateChange;
  FFieldsProperties := TcxFilterPropertiesList.Create;
end;

destructor TcxDBFilterControl.Destroy;
begin
  FreeAndNil(FDataSource);
  FreeAndNil(FItems);
  FreeAndNil(FFieldsProperties);
  FreeAndNil(FFilterOptions);
  inherited Destroy;
end;

procedure TcxDBFilterControl.BuildFromCriteria;
begin
  inherited;
end;

procedure TcxDBFilterControl.Clear;
begin
  inherited Clear;
  FFieldsProperties.Clear;
end;

function TcxDBFilterControl.GetFilterTextEx(
  const AFieldNamePrefix, AFieldNamePostfix: string): string;
begin
  FFieldNamePrefix := AFieldNamePrefix;
  FFieldNamePostfix := AFieldNamePostfix;
  try
    Result := GetFilterText;
  finally
    FFieldNamePrefix := '';
    FFieldNamePostfix := '';
  end;
end;

function TcxDBFilterControl.GetPropertiesClassFromFieldType(
  AFieldType: TFieldType): TcxCustomEditPropertiesClass;
begin
  case AFieldType of
    ftString, ftWideString:
      Result := TcxTextEditProperties;
    ftSmallint, ftInteger, ftWord, ftAutoInc {$IFDEF DELPHI6}, ftLargeint {$ENDIF}:
      Result := TcxSpinEditProperties;
    ftBoolean:
      Result := TcxCheckBoxProperties;
    ftFloat:
      Result := TcxCalcEditProperties;
    ftCurrency, ftBCD:
      Result := TcxCurrencyEditProperties;
    ftDate, ftDateTime {$IFDEF DELPHI6}, ftTimeStamp {$ENDIF}:
      Result := TcxDateEditProperties;
    ftTime:
      Result := TcxTimeEditProperties;
  else
    Result := nil;
  end;
end;

function TcxDBFilterControl.GetCaption(Index: Integer): string;
begin
  if (Index > -1) and (Index < GetCount) then
    if FItems.Count > 0 then
      Result := FItems[Index].Caption
    else
      Result := GetField(Index).DisplayName
  else
    Result := '';
end;

function TcxDBFilterControl.GetCount: Integer;
var
  I: Integer;
begin
  if (FItems <> nil) and (FItems.Count > 0) then
    Result := FItems.Count
  else
    if (FDataSet <> nil) and not (FDataSet.DefaultFields and (FDataSource.State = dsInactive)) then
    begin
      Result := 0;
      with FDataSet do
        for I := 0 to Fields.Count - 1 do
          if Fields[I].Visible then Inc(Result);
    end
    else
      Result := 0;
end;

function TcxDBFilterControl.GetCriteria: TcxFilterCriteria;
begin
  Result := inherited Criteria;
end;

function TcxDBFilterControl.GetItemLink(Index: Integer): TObject;
begin
  if (Index > -1) and (Index < GetCount) then
    if FItems.Count > 0 then
      Result := FItems[Index]
    else
      Result := GetField(Index)
  else
    Result := nil;
end;

function TcxDBFilterControl.GetItemLinkID(Index: Integer): Integer;
begin
  Result := Index;
end;

function TcxDBFilterControl.GetItemLinkName(Index: Integer): string;
begin
  Result := GetFieldName(Index);
end;

function TcxDBFilterControl.GetFieldName(Index: Integer): string;
var
  AField: TField;
begin
  if (Index > -1) and (Index < GetCount) then
    if FItems.Count > 0 then
      Result := FItems[Index].FieldName
    else
    begin
      AField := GetField(Index);
      if AField.Origin <> '' then
        Result := FFieldNamePrefix + AField.Origin + FFieldNamePostfix
      else
        Result := FFieldNamePrefix + AField.FieldName + FFieldNamePostfix;
    end
  else
    Result := '';
end;

function TcxDBFilterControl.GetProperties(Index: Integer): TcxCustomEditProperties;
begin
  if (Index > -1) and (Index < GetCount) then
    if FItems.Count > 0 then
      Result := FItems[Index].GetProperties
    else
      Result := FFieldsProperties.GetProperties(
        GetPropertiesClassFromFieldType(GetField(Index).DataType))
  else
    Result := nil;
  if Result = nil then Result := GetDefaultProperties;
end;

function TcxDBFilterControl.GetValueType(Index: Integer): TcxValueTypeClass;

  function TrimFieldName(const AFieldName: string): string;
  begin
    Result := AFieldName;
    while (Length(Result) > 0) and 
      (AnsiChar(Result[1]) in [#0..' ', '"', '''', '[']) do
        Delete(Result, 1, 1);
    while (Length(Result) > 0) and 
      (AnsiChar(Result[Length(Result)]) in [#0..' ', '"', '''', ']']) do
        Delete(Result, Length(Result), 1);
  end;

var
  AField: TField;
begin
  if (Index > -1) and (Index < GetCount) then
    if FItems.Count > 0 then
    begin
      if (FDataSet <> nil) then
        AField := FDataSet.FindField(TrimFieldName(FItems[Index].FieldName))
      else
        AField := nil;
      Result := GetValueTypeClassByField(AField);
    end
    else
      Result := GetValueTypeClassByField(GetField(Index))
  else
  Result := nil;
end;

procedure TcxDBFilterControl.SetFilterOptions(Value: TcxDBFilterOptions);
begin
  FFilterOptions.Assign(Value);
end;

procedure TcxDBFilterControl.SetItems(Value: TcxFilterItemCollection);
begin
  FItems.Assign(Value);
end;

procedure TcxDBFilterControl.SetDialogLinkComponent(ALink: TComponent);
begin
  if ALink = nil then
    DataSet := nil
  else
    if ALink is TDataSet then DataSet := TDataSet(ALink);
end;

procedure TcxDBFilterControl.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (AComponent = FDataSet) then
    DataSet := nil;
end;

procedure TcxDBFilterControl.CorrectOperatorClass(
  var AOperatorClass: TcxFilterOperatorClass);
var
  AOperatorAdapter: TcxDBFilterOperatorAdapter;
begin
  AOperatorAdapter := cxGetFilterOperatorAdapter(FDataSet);
  if Assigned(AOperatorAdapter) then
    AOperatorAdapter.PrepareOperatorClass(nil, FDataSet, AOperatorClass);
end;

procedure TcxDBFilterControl.DoApplyFilter;
begin
  FApplyingFilter := True;
  try
    inherited DoApplyFilter;
  finally
    FApplyingFilter := False;
  end;
end;

procedure TcxDBFilterControl.ValidateConditions(
  var SupportedOperations: TcxFilterControlOperators);
begin
  FilterOptions.ProcessFilterOperators(SupportedOperations);
end;

function TcxDBFilterControl.GetFilterLink: IcxFilterControl;
begin
  QueryInterface(IcxFilterControl, Result);
end;

{$IFDEF CBUILDER6}
function TcxDBFilterControl.GetDataSet: TDataSet;
begin
  Result := FDataSet;
end;

function TcxDBFilterControl.GetItems: TcxFilterItemCollection;
begin
  Result := FItems;
end;
{$ENDIF}

function TcxDBFilterControl.GetField(AIndex: Integer): TField;
var
  I, ATest: Integer;
begin
  ATest := 0;
  Result := nil;
  with FDataSet do
    for I := 0 to Fields.Count - 1 do
      if Fields[I].Visible then
      begin
        if ATest = AIndex then
        begin
          Result := Fields[I];
          Exit;
        end;
        Inc(ATest);
      end;
end;

function TcxDBFilterControl.GetFilterOptions: TcxDBFilterOptions;
begin
  Result := FFilterOptions; 
end;

procedure TcxDBFilterControl.DataSetStateChange(Sender: TObject);
begin
  if not FApplyingFilter and (FDataSource.State in [dsInactive, dsBrowse]) then
    LayoutChanged;
end;

procedure TcxDBFilterControl.SetDataSet(const Value: TDataSet);
begin
  if FDataSet <> Value then
  begin
    FDataSet := Value;
    FDataSource.DataSet := Value;
    Clear;
    if Value <> nil then Value.FreeNotification(Self);
  end;
end;

end.

⌨️ 快捷键说明

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