1

这是我用来从 DevExpress 网格中的过滤器中获取 filtertype 运算符的代码片段: OperatorKindToStr 用于从过滤器中提取 operatorkind 作为字符串并将其存储在 xml 文件中。StrToOperatorKind 用于从 xml 转换回字符串以在过滤器中设置运算符类型。

const
  CUSTFILTER_FILTERITEM     = 'FilterItem';

function OperatorKindToStr(const aOperatorKind: TcxFilterOperatorKind): string;
begin
  Result := 'foEqual';
  case aOperatorKind of
    foEqual:        Result := 'foEqual';
    foNotEqual:     Result := 'foNotEqual';
    foLess:         Result := 'foLess';
    foLessEqual:    Result := 'foLessEqual';

  // Plus a boring list of other constants
end;

function StrToOperatorKind(const aOpKindStr: string): TcxFilterOperatorKind;
begin
  Result := foEqual;
  if aOpKindStr       = 'foNotEqual' then
    Result := foNotEqual
  else if aOpKindStr  = 'foLess' then
    Result := foLess
  else if aOpKindStr  = 'foLessEqual' then
    Result := foLessEqual
  else if aOpKindStr  = 'foGreater' then
    Result := foGreater
  else if aOpKindStr  = 'foGreaterEqual' then
    Result := foGreaterEqual

  // Plus a boring list of other if-else
end;

procedure UseStrToOperatorKind(const aFilterItem: IXmlDomElement);
begin
  if aFilterItem.nodeName = CUSTFILTER_FILTERITEM then
  begin                              // It is an FilterItem
    vStr := VarToStr(aFilterItem.getAttribute(CUSTFILTER_COLPROP));  // Get the columnname
    vOperatorKind := StrToOperatorKind(aFilterItem.getAttribute(CUSTFILTER_ITEMOPERATOR));
end;

procedure UseOperatorKindToStr(const aFilterItem: TcxCustomFilterCriteriaItem);
var
  vStr: String;
begin
  if Supports(TcxFilterCriteriaItem(aFilterItem).ItemLink, TcxGridColumn, GridCol) then
    vStr := OperatorKindToStr(TcxFilterCriteriaItem(aFilterItem).OperatorKind);
end;

显然我希望 StrToOperatorKind 和 OperatorKindToStr 更聪明一点。我在 VCL TypeInfo 中尝试过 GetEnumProp 方法,但它不起作用。那么如何将 TcxFilterOperatorKind 属性从 aFilterItem 变量提取到字符串并返回到 TcxFilterOperatorKind ?

4

2 回答 2

1

正如 Mason 指出 的那样,使用GetEnumNameGetEnumValue二重奏。

你的功能应该变得更简单:

function OperatorKindToStr(const aOperatorKind: TcxFilterOperatorKind): string;
begin
  Result := GetEnumName(TypeInfo(TcxFilterOperatorKind), Ord(aOperatorKind));
end;

function StrToOperatorKind(const aOpKindStr: string): TcxFilterOperatorKind;
begin
  Result := TcxFilterOperatorKind(GetEnumValue(TypeInfo(TcxFilterOperatorKind), aOpKindStr));
end;
于 2009-09-09T18:30:01.297 回答
1

GetEnumProp 不起作用,因为它是您尝试执行的错误功能。不过,你已经很接近了。尝试 GetEnumName 和 GetEnumValue,它们也在 TypInfo 单元中。

于 2009-09-09T17:51:15.033 回答