Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-01-2017
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
Saber si una Variable tipo Tdatetime o Integer tiene Valor o esta vacia

Buenas noches, tengo una duda y es como verificar si una variable tipo TdateTime o Integer esta vacia o nula para hacer clausualas condicionales

Código Delphi [-]
var
  formAprobar: TformAprobar;
  documento:Integer;
  emision:TDateTime;
Responder Con Cita
  #2  
Antiguo 29-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
De primeras, no se puede, porque los tipos primitivos no son "nullables". Alguna de las formas de solucionarlo es usar "valores bandera", es decir, definir un valor en tus reglas de negocio que se asuma como "invalido".

Por ej:

Código Delphi [-]
  NullValues = record
  public
    const EmptyDateTime = 0; // por poner cualquier cosa
    const EmptyInteger = -1234; // por poner cualquier cosa

    class function IsEmptyDateTime(const Value: TDateTime): Boolean; static; inline;
    class function IsEmptyInteger(const Value: Integer): Boolean; static; inline;
  end;

La implementacion de los metodos es trivial (comparas el valor que recibes contra la constante)

Una solucion mejor es el uso de una biblioteca que soporte los llamados tipos "nullables"

Spring4D ofrece una solucion muy buena, es OpenSource y es compatible con Delphi 2010 o superior. Los nullable se definen en la unidad Spring.pas

Código Delphi [-]
uses
  System.SysUtils,
  System.Variants,
  Spring;

procedure Main;
var
  Int: TNullableInteger;
begin
  Int := TNullableInteger.Create(5); // creacion
  Int := 5;                          // equivalente al anterior, la sobrecarga del operador implicito hace la magia
  Writeln(Int.HasValue);             // --> True

  Int := TNullableInteger.Create(System.Variants.Null); // lo setea a null
  Writeln(Int.HasValue);                                // --> False

  try
    Writeln(Int.Value); // --> exception
  except
    on E: EInvalidOperationException do
    begin
      Writeln('Nullable no tenia valor asignado');
    end
    else
      raise;
  end;
end;

El uso con cualquier tipo (gracias a los genericos y a TNullable<T> es posible) y la sobrecarga de operadores (sobre todo el implicito) lo hace muy limpio

En realidad, TNullable<T> es un record que se aprovecha de como estan implementados en Delphi para setear un Flag de "HasValue = True/False" dependiendo de como fue instanciada la variable

Por ej:

Código Delphi [-]
procedure UsarInt(const Value: Integer);
begin
  WriteLn(Value.ToString);
end;

procedure Main;
var
  Int: TNullableInteger;
begin
  UsarInt(Int); // excepcion porque esto implica llamar al operador implicito y ejecutar un Int.Value
  Int := 5;
  UsarInt(Int); // ahora todo bien
end;

La unica "pega" es que no podes usar (directamente) los ayudantes como TStringHelper sobre una variable de tipo Nullable: por mas que tengas el operador implicito, te obliga a escribir ".Value"

Código Delphi [-]
var
  Int: TNullableInteger;
begin
  Int.ToString; // no compila
  Int.Value.ToString; // todo bien
end;

Si no recuerdo mal en los proximos releases de Delphi estos "nullables" van a estar implementados de manera nativa y no hara falta usar bibliotecas externas
Responder Con Cita
  #3  
Antiguo 29-01-2017
webmasterplc webmasterplc is offline
Miembro
 
Registrado: mar 2008
Posts: 274
Poder: 17
webmasterplc Va por buen camino
uso delphi xe8 acabo de adquirir berlin 10
Responder Con Cita
  #4  
Antiguo 29-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por webmasterplc Ver Mensaje
uso delphi xe8 acabo de adquirir berlin 10
No entendi muy bien

Que yo sepa en Berlin no hay Nullables. Creo que esto es para la version que viene despues de Berlin

Por otra parte, en esas versiones de Delphi podes usar Spring4D como te comentaba

Por si alguno le interesa, esta es una lectura interesante sobre Nullable en Delphi, por Allen Bauer. Spring hace algo similar, solo que mas sencillo, ya que en lugar de una interface como "sentinela", usa un string, que el compilador siempre inicializa a un valor conocido: EmptyStr, es decir, el string vacio

Edito:

Aca se menciona los nullables en Delphi nativo. La mala noticia: hay que esperar hasta Delphi 10.3, en el 2018. Apenas va 1 mes del año y ya hay que pensar en el proximo

Última edición por AgustinOrtu fecha: 29-01-2017 a las 06:54:43.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿BCB6 Como Cambiar valor Variable que esta en otra unit? JXJ C++ Builder 3 03-10-2013 01:17:36
Traer un valor de un campo de la Tabla (Access) incluso si esta vacia nefore Conexión con bases de datos 4 16-06-2013 22:45:58
No se puede convertir variable de tipo null a tipo integer. JairoC Varios 5 30-11-2011 15:43:11
Saber si la Variable tiene letras cmgenny Varios 1 11-05-2004 08:00:59
Saber el valor de una variable (Preport,fastreport) IVAND Impresión 0 06-02-2004 00:55:22


La franja horaria es GMT +2. Ahora son las 08:25:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi