Convertir un DevExpress TcxFilterOperatorKind vers et depuis une chaîne?
-
05-07-2019 - |
Question
Voici un code de code que j'utilise pour obtenir un opérateur de type de filtre à partir d'un filtre dans une grille DevExpress: OperatorKindToStr est utilisé pour extraire operatorkind à partir d'un filtre sous forme de chaîne et pour le stocker dans un fichier xml. StrToOperatorKind est utilisé pour reconvertir une chaîne de xml afin de définir un operatorkind dans un filtre.
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;
Apparemment, je veux que StrToOperatorKind et OperatorKindToStr soient un peu plus intelligents. J'ai essayé la méthode GetEnumProp dans VCL TypeInfo mais cela ne fonctionnera pas. Alors, comment puis-je extraire la propriété TcxFilterOperatorKind d’une variable aFilterItem vers une chaîne et revenir à un TcxFilterOperatorKind?
La solution
Utilisez les duos GetEnumName et GetEnumValue , comme l'a souligné Mason.
Et vos fonctions devraient devenir beaucoup plus 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;
Autres conseils
GetEnumProp n'a pas fonctionné car c'est la mauvaise fonction de ce que vous essayez de faire. Vous êtes proches, cependant. Essayez GetEnumName et GetEnumValue, qui font également partie de l’unité TypInfo.