J'ai utilisé ce scénario plusieurs fois dans presque tous mes projets, quand je fais une sorte de conversion de données, quand il s'agit de booléens, je me perds un peu quand il s'agit de simplifier les choses. Cette déclaration ci-dessous ressort comme un pouce endolori partout dans mon code:
if BoolVal then
StrVal:= 'True'
else
StrVal:= 'False';
Je me demande s'il existe un moyen plus simple d'effectuer cette évaluation? Peut-être une utilisation de l'instruction Case
que je ne connais pas? Mon implémentation actuelle est plus complexe que juste StrVal
mais elle consiste à renvoyer deux valeurs différentes selon qu'elle est True ou False. Par exemple, voici du vrai code ...
if fsBold in Can.Font.Style then
ConvertTo(AddSomeOtherText + 'True')
else
ConvertTo(AddSomeOtherText + 'False');
C'est juste pour souligner la simplicité que j'espère. Je me demande si je peux faire quelque chose du genre:
ConvertTo(AddSomeOtherText + BoolToStrCase((fsBold in Can.Font.Style), 'True', 'False'));
Je suis sûr que ce n'est pas une vraie commande, mais je recherche ce type de simplicité en une seule ligne.
Dans l'unité StrUtils
, il y a ifthen ()
StrVal := IfThen(BoolVal,'True','False');
Et pour ce cas précis, vous pouvez même utiliser:
StrVal := BoolToStr(BoolVal);
Personne n'a jamais entendu parler d'un tableau indexé par booléen?
const
BOOL_TEXT: array[boolean] of string = ('False', 'True');
YES_NO_TEXT: array[boolean] of string = ('No', 'Yes');
ERROR_OR_WARNING_TEXT: array[boolean] of string = ('Warning', 'Error');
C'est en fait ce que BoolToStr utilise lui-même!
function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
const
cSimpleBoolStrs: array [boolean] of String = ('0', '-1');
Pour convertir un booléen en chaîne, il y a BoolToStr , qui existe depuis au moins Delphi 2007. Vous pouvez l'utiliser dans votre dernier exemple comme ceci:
TextVal := BoolToStr((fsBold in Can.Font.Style), True);
Pour aller dans l'autre sens (chaîne en booléen), vous devez exécuter une fonction réelle. Quelque chose comme ça devrait vous aider à démarrer:
function StringToBoolean(const Value: string): Boolean;
var
TempStr: string;
begin
TempStr := UpperCase(Value);
Result := (TempStr = 'T') or
(TempStr = `TRUE`) or
(TempStr = 'Y');
end;
BoolVal := StringToBoolean('True'); // True
BoolVal := StringToBoolean('False'); // False
BoolVal := StringToBoolean('tRuE'); // True
Bien sûr, cela ne fonctionne pas s'il y a un non-sens dans Value
, mais ...
Essayez l'un ou l'autre. Les deux sont bien plus rapides que les versions par défaut.
type
TBooleanWordType = (bwTrue, bwYes, bwOn, bwEnabled, bwSuccessful, bwOK, bwBinary);
BooleanWord: array [Boolean, TBooleanWordType] of String =
(
('False', 'No', 'Off', 'Disabled', 'Failed', 'Cancel', '0'),
('True', 'Yes', 'On', 'Enabled', 'Successful', 'Ok', '1')
);
function BoolToStr(Value: boolean; const BooleanWordType: TBooleanWordType = bwTrue): String; inline;
begin
Result := BooleanWord[Value, BooleanWordType];
end;
function StrToBool(const S: String): Boolean; inline;
begin
Result := False;
case Length(S) of
4: Result := (LowerCase(S) = 'true');
5: Result := not (LowerCase(S) = 'false');
end;
end;
Si vous aimez le code obtus, voici une façon amusante de le faire (en particulier parce qu'il fait partie d'une instruction Format plus grande), mais soyez prudent si vous avez plus d'arguments à la suite (ou au précédent), vous devrez indexer l'argument à la suite du booléen explicitement (vous a dit que c'était obtus):
Format('The value of value is %*:s', [Integer(value)+1, 'False', 'True']);
Toute personne surprise en train d'utiliser cela dans le code de production doit être traitée sévèrement!