Question

J'utilise un DevExpress TdxMemData en mémoire descendant de TDataSet.Pendant qu'il a filtré :Booléen et filtre :Propriétés de chaîne, il ne semble pas faire quoi que ce soit avec elles automatiquement, mais s'appuie plutôt sur le résultat du paramètre Accept de l'événement OnFilterRecord.

Donc, ce que je recherche, c'est un moyen (peut-être dans TdxMemData ou ailleurs dans la suite de code de DevExpress) d'analyser le texte du filtre et de l'appliquer à l'ensemble de données.

Idéalement, j'aimerais trouver un moyen de tester une ligne individuelle par rapport au filtre pour voir si elle correspond sans la filtrer de l'ensemble de données (je souhaite mettre en évidence les lignes qui correspondent au filtre).

Exemple de chaîne de filtre :

((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000)

Il y a donc des et et ou imbriqués.Il est en fait construit par DevExpress TcxDBFilterControl.

J'espère vraiment qu'il me manque quelque chose de simple.

Mise à jour: j'ai ouvert un billet avec DevExpress pour voir s'ils soutiennent un quelconque type de solution.J'ai trouvé leur réponse standard ils ne prennent pas en charge le filtrage sur TdxMemData.

Était-ce utile?

La solution

Je sais que ce n'est pas la réponse que vous recherchez, mais l'ensemble de données TdxMemData ne prend pas en charge les chaînes de filtre.Pour utiliser des filtres, codez votre propre événement OnFilterRecord ou définissez ProgrammedFilter sur true et remplissez la FilterList avec une liste des enregistrements filtrés (au moment de l'exécution).

Une possibilité serait de coder votre propre analyseur pour comparer la chaîne de filtre à l'enregistrement actuel dans l'événement OnFilterRecord.

Autres conseils

Vous voudrez peut-être envisager de remplacer le TdxMemData par TkbmMemTable.C'est gratuit, fonctionne de la même manière que le composant DX et prend en charge les chaînes de filtrage.Le portage prendrait probablement beaucoup moins de temps que l'implémentation d'un analyseur de chaîne de filtre dans OnFilterRecord !Il fonctionnera sans problème avec les autres composants DX.

Ce que vous recherchez n'est pas de filtrer les données, mais de les afficher différemment si elles remplissent une condition.Si vous utilisez un TDBGrid pour afficher les données, examinez l'événement DrawColumnCell() sur le TDBGrid :

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DBG: TDBGrid;
begin
  DBG := TDBGrid(Sender);
  // Add any other conditions from your 'filter' here in the next line.
  if (YourData.FieldByName('WHATEVER').AsString = 'Jim') and
     (YourData.FieldByName('REP').AsInteger > 1000) then
    Column.Font.Color := clRed;
  DBG.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Puisque vous utilisez TdxMemData, vous utilisez probablement également la grille DevEx.Il doit avoir une manière similaire de faire autre chose que le dessin par défaut ;vous pouvez y utiliser une technique similaire.(Je n'ai pas utilisé les éléments DevEx depuis quelques années ;L'employeur actuel ne les aime pas et ne prendra donc pas en charge cette dépense.:-( )

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