Ir al contenido


Foto

[RESUELTO] Enumeración a null


  • Por favor identifícate para responder
11 respuestas en este tema

#1 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 01 marzo 2010 - 02:47

Hola a todos,

una pregunta que creo que será un poco rara.  A ver que pensais vosotros.

Tengo una enumeración:


delphi
  1. type
  2.   TSiNo = (esNo=0, esSi=1);



Pero me gustaría poder pasarle null a esta enumeración:


delphi
  1. procedure Tform1.Button1Click(Sender: TObject);
  2. var
  3. p : TSiNo;
  4.   function QueEs(Value: TSiNo):string;
  5.   begin
  6.     if '......Value es NULO.....' then exit('NULO');  // COMO PREGUNTAR ESTO ?? 
  7.     // Assigned(Value) tampoco funciona....
  8.     if Value = esSi then exit('ES SI');
  9.     if Value = esNo then exit('ES NO');
  10.   end;
  11. begin
  12.   ShowMessage(QueEs(p));
  13.   p := esSi;
  14.   ShowMessage(QueEs(p));
  15.   p := esNo;
  16.   ShowMessage(QueEs(p));
  17.   p := null;  // Esto NO FUNCIONA.
  18.   ShowMessage(QueEs(p));
  19. end;



El problema está en como poner a nulo una enumeración... (si es que esto se puede)...  O que alternativa tengo dentro de una enumeración ??

Saludos y gracias por vuestras aportaciones.
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 marzo 2010 - 02:53

En principio no se pueden tener mas valores que los enumerados. Puedes añadirle el valor nulo... Pero usando un truco puede que puedas acercarte a lo que quieres.

Define un puntero al tipo enumerado. Dale el valor nil si no está especificado un valor... Dale el valor del puntero de la variable enumerada cuando esté especificado, en ese momento el puntero no es nil y el valor de la enumeración tiene sentido.

Saludos.
  • 0

#3 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 01 marzo 2010 - 03:00

Gracias Escafandra.... creo que se acerca bastante, bastante a lo que quiero.

Voy a ello..

SaludOS.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 marzo 2010 - 03:00

¿Que tal algo así...?


delphi
  1. type
  2.   TSiNo = (esNo=0, esSi=1);
  3.   PSiNo = ^TSiNo;





delphi
  1. var
  2.   p : TSiNo;
  3.   pp: PSiNo;
  4. begin
  5.   pp:= nil;
  6. //  ......
  7.   pp:= @p;
  8.   if pp <> nil then
  9.   begin
  10.   end;
  11. end;



Saludos.
  • 0

#5 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 01 marzo 2010 - 03:26

Efectivamente, así es.

Muchas gracias Escafandra...

Saludos.
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 marzo 2010 - 03:28

Efectivamente, así es.

Muchas gracias Escafandra...

Saludos.


Vale qué bien, si está resuelto debes poner el tema como [RESUELTO], si no sabes me dices.

Saludos.
  • 0

#7 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 01 marzo 2010 - 04:02

Está puesto como RESUELTO.  No sé porque a tí no te sale....

Al menos lo he puesto en mi respuesta...
  • 0

#8 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 01 marzo 2010 - 04:03

Ahora creo que ya.... :-)

Saludos...
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 marzo 2010 - 04:04

Ahora sí, el caso es que debe ser en el primer post ;). (y)
  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 02 marzo 2010 - 04:19

Está claro que lo que habéis propuesto funciona, ¿ pero no os parece que es complicáis un poco ?, nunca me ha gustado trabajar con punteros (demasiados malos recuerdos de las prácticas con C en la Universidad).

A mi me parece mucho más sencillo :

type
  TSiNo = (esNo=0, esSi=1, esNulo=-1);

Aunque para mi gusto personal, quizás preferiría :

type
  TSiNo = (esNulo=0, esSi=1, esNo=2);

¿ Porqué ?, por que si lo guardo en un campo, entonces al leer un valor nulo con AsInteger voy a recibir siempre un 0 (tanto si tiene almacenado un 0 como un nulo).

Saludos.
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 marzo 2010 - 05:50

Está claro que lo que habéis propuesto funciona, ¿ pero no os parece que es complicáis un poco ?...
....
A mi me parece mucho más sencillo :

type
  TSiNo = (esNo=0, esSi=1, esNulo=-1);

Si, tienes razón y lo normal es hacerlo como propones:

En principio no se pueden tener mas valores que los enumerados. Puedes añadirle el valor nulo...


Pero a veces las circunstancias mandan...

...nunca me ha gustado trabajar con punteros (demasiados malos recuerdos de las prácticas con C en la Universidad)...


Pues a mi me parece que con muy potentes (bien es verdad que mi lengua nativa es el C/C++ :p). La misma librería VCL está focalizada en punteros, aunque en delphi quedan camuflados o mas bien abstraídos. En definitiva, los punteros nos permiten solucionar problemas aparentemente difíciles o no posibles.

Saludos.


  • 0

#12 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 02 marzo 2010 - 02:40

Bueno, el asunto es que es un protocolo (Serie RS232) y tengo que adaptarme al formato que le dió quien lo diseñó.

Según este formato, debo enviar:

#KEY/value#KEY/value#KEY/value#


KEY = string
value = 0, 1 (representando 0 como NO y 1 como SI).
Si el valor es NULO, NO debo enviar (ni KEY, ni value).

Es decir:
Si queremos enviar:
ROJO = SI
VERDE = NO
AMARILLO = NULO

Enviaremos:

#ROJO/1#VERDE/0#

  (AMARILLO simplemente NO existirá).

El asunto está en que el valor está en un TField de Tabla de base de datos.  Con lo que vendrá como NULO (en el caso de null), pero debo cargarlo a una clase donde están las propiedades concretas.  Y me gustaría no dar el paso intermedio de comprobar si viene a null para asignar -1 a la propiedad de la clase y, de vuelta, comprobar si el valor de la propidad de la clase es -1 (esNull) para asignar un null real al campo.

Y he aquí el problema:  Las enumeraciones no admiten NULOS.    :  Sé que tiene una pinta de boolean (que lo está pidiendo a gritos), pero hay otros valores con más de 3 estados.  :(

Espero que ahora se entienda mejor cual es el asunto (y el problema).

Finalmente estoy implementando una clase TSiNo, con una propiedad FValor: Variant (así puedo asignar nulos directos) y el método SetFValor y GetFValor (write y read) son los que se encargan de devolver los valores correctos.
  • 0




IP.Board spam blocked by CleanTalk.