CompareText compare S1 et S2 et renvoie 0 si les deux chaînes sont égales. Si S1 est supérieure à S2, CompareText renvoie un entier supérieur à 0. Si S1 est inférieure à S2, CompareText renvoie un entier inférieur à 0. CompareText n'est pas sensible à la casse et n'est pas affectée par les paramètres régionaux en cours, lors de l'utilisation de la première méthode surchargée CompareText.
result := CompareText(Left.Chaine1, Right.Chaine1) or CompareText(Left.Chaine2, Right.Chaine2);
ça compile ???
AH oui ! le or passe en mode binaire et non mode booléen !
le problème c'est que cela pourrait renvoyer -1 or 1, je crois que cela donne -1 (FFFFFFFF or 1 = FFFFFFFF)
Tente plutôt (tout dépend si c'est Chaine1 ou Chaine2 qui est la plus importante
1 2 3
| Result := CompareText(Left.Chaine1, Right.Chaine1);
if Result = 0 then
Result := CompareText(Left.Chaine2, Right.Chaine2); |
Je suis assez déclaratif dans mon code,
Dans mon cas c'est un TObjectDictionary
Je me suis emmerdé avec un TArray pour trouver le Sort car TObjectDictionary ne fourni pas de Sort (en XE2, je ne l'ai pas trouvé)
Il est vrai qu'avec le TList c'est plus simple et le Comparer est vraiment pertinent dans le Constructor
Avec les génériques à fond, cela devient dur à lire !
voici un extrait (très partiel) où je prototype tout
Habitué au C++, je fais des sous-types et sous-classes d'une classe principale (c'est ce que l'on appelle une classe interne en Java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
TAutomateLogistiqueBusinessEngine = class(TObject)
strict private
type
TDestinationList = System.Generics.Collections.TObjectDictionary<string, TDestinationInfo>;
TDestinationListIterator = System.Generics.Collections.TPair<string, TDestinationInfo>;
TDestinationListOrderer = class(TComparer<TDestinationListIterator>)
public
function Compare(const Left, Right: TDestinationListIterator): Integer; override;
end;
...
//------------------------------------------------------------------------------
function TAutomateLogistiqueBusinessEngine.BuildMapTriFromSession(... bla bla ...): Boolean;
var
SessionDestinationList: TDestinationList;
OrderedDestinations: TArray<TDestinationListIterator>;
// * Phase 1 - Récupération des destinations FINALES !
SessionDestinationList := TDestinationList.Create([doOwnsValues]);
try
... remplissage de SessionDestinationList ...
// Calcul du plan selon la quantité
OrderedDestinations := SessionDestinationList.ToArray();
DestinationListOrderer := TDestinationListOrderer.Create();
try
TArray.Sort<TDestinationListIterator>(OrderedDestinations, DestinationListOrderer);
finally
DestinationListOrderer.Free();
end;
...
{ TAutomateLogistiqueBusinessEngine.TDestinationListOrderer }
//------------------------------------------------------------------------------
function TAutomateLogistiqueBusinessEngine.TDestinationListOrderer.Compare(const Left, Right: TDestinationListIterator): Integer;
begin
// Le résultat est inférieur à zéro (<0) : Left est inférieur à Right : Left est plus contient PLUS que Right
// Le résultat est égal à zéro (=0) : Left est égal à Right.
// Le résultat est supérieur à zéro (>0) : Left est supérieur à Right : Left est plus contient MOINS que Right
// Je veux les plus GROS en premier
Result := Right.Value.Quantity - Left.Value.Quantity;
end;
... |
Partager