Конвертировать DevExpress TcxFilterOperatorKind в и из строки?

StackOverflow https://stackoverflow.com/questions/1400844

  •  05-07-2019
  •  | 
  •  

Вопрос

Вот кодовый код, который я использую для получения оператора filtertype из фильтра в сетке DevExpress: OperatorKindToStr используется для извлечения операторкинда из фильтра в виде строки и сохранения его в 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 были немного умнее. Я пробовал метод GetEnumProp в VCL TypeInfo, но он не будет работать. Итак, как мне извлечь свойство TcxFilterOperatorKind из переменной aFilterItem в строку и обратно в TcxFilterOperatorKind?

Это было полезно?

Решение

Используйте дуэт GetEnumName и GetEnumValue , как указал Мейсон.

И ваши функции должны стать намного проще:

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;

Другие советы

GetEnumProp не работал, потому что это неправильная функция для того, что вы пытаетесь сделать. Ты близко, хотя. Попробуйте GetEnumName и GetEnumValue, которые также находятся в блоке TypInfo.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top