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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top