Convertir un DevExpress TcxFilterOperatorKind ay desde una cadena?
-
05-07-2019 - |
Pregunta
Aquí hay un código de código que uso para obtener el operador tipo filtro de un filtro en una cuadrícula DevExpress: OperatorKindToStr se utiliza para extraer operatorkind de un filtro como cadena y almacenarlo en un archivo xml. StrToOperatorKind se utiliza para convertir de nuevo una cadena de xml para establecer un operaorkind en un filtro.
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;
Aparentemente quiero que StrToOperatorKind y OperatorKindToStr sean un poco más inteligentes. He probado el método GetEnumProp en VCL TypeInfo pero no funciona. Entonces, ¿cómo puedo extraer la propiedad TcxFilterOperatorKind de una variable aFilterItem a una cadena y volver a TcxFilterOperatorKind?
Solución
Use el dueto GetEnumName y GetEnumValue como señaló Mason.
Y sus funciones deberían ser mucho más simples:
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;
Otros consejos
GetEnumProp no funcionó porque es la función incorrecta para lo que está intentando hacer. Sin embargo, estás cerca. Pruebe GetEnumName y GetEnumValue, que también están en la unidad TypInfo.