álgebra variable unidades tipos tabla simplificar simplificacion resueltos reglas realizar quimica programacion peso matematicas longitud hacer fundamentales expresiones ejercicios ejemplos declarar datos conversiones conversion como básicas booleanas booleana boole delphi boolean type-conversion delphi-xe2

delphi - variable - ¿Hay una manera más fácil de hacer conversiones booleanas?



tipos de datos fundamentales (5)

He usado este escenario muchas veces en casi todos mis proyectos, cuando estoy haciendo algún tipo de conversión de datos, cuando se trata de booleanos, un poco me pierdo cuando se trata de hacerlo simple. La siguiente declaración sobresale como un pulgar dolorido en todo mi código:

if BoolVal then StrVal:= ''True'' else StrVal:= ''False'';

Me pregunto si hay una manera más fácil de realizar esta evaluación? Tal vez algún uso de la declaración del Case que no conozco? Mi implementación real es más compleja que solo StrVal pero consiste en devolver dos valores diferentes dependiendo de si es Verdadero o Falso. Por ejemplo, aquí hay un código real ...

if fsBold in Can.Font.Style then ConvertTo(AddSomeOtherText + ''True'') else ConvertTo(AddSomeOtherText + ''False'');

Eso es solo para enfatizar en lo simple que estoy esperando. Me pregunto si puedo hacer algo como esto:

ConvertTo(AddSomeOtherText + BoolToStrCase((fsBold in Can.Font.Style), ''True'', ''False''));

Estoy seguro de que no es un comando real, pero estoy buscando ese tipo de simplicidad en una sola línea.


¿Qué tal nadie ha oído hablar de una matriz indexada por boolean?

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'');

De hecho, ¡es lo que BoolToStr usa!

function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string; const cSimpleBoolStrs: array [boolean] of String = (''0'', ''-1'');


En la unidad StrUtils , hay ifthen ()

StrVal := IfThen(BoolVal,''True'',''False'');

Y para este caso específico incluso podrías usar:

StrVal := BoolToStr(BoolVal);


Para convertir Boolean a string, hay BoolToStr , que ha existido desde al menos Delphi 2007. Puedes usarlo en tu último ejemplo como este:

TextVal := BoolToStr((fsBold in Can.Font.Style), True);

Para ir a la otra dirección (cadena a Boolean), tendrías que hacer una función real. Algo como esto debería ayudarte a comenzar:

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

Por supuesto, esto no funciona si hay Value en el Value , pero ...


Pruebe cualquiera de estos Ambos son mucho más rápidos que las versiones predeterminadas.

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 te gusta el código obtuso, esta es una forma divertida de hacerlo (especialmente si es parte de una declaración de Formato más grande), pero ten cuidado si tienes más argumentos a continuación (o anteriores), tendrás que indexar el argumento siguiendo la boolean explícitamente (te dije que era obtuso):

Format(''The value of value is %*:s'', [Integer(value)+1, ''False'', ''True'']);

¡Cualquier persona atrapada usando este código de producción debe ser tratada severamente!