Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-02-2017
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Tratamiento de constantes

Buenas.
Como respuesta de un webService obtengo un parámetro Estado que es de tipo EstadoTipo y que se compone de un array de posibles valores.
Código:
EstadoTipo = (NO_LEIDA, ACEPTADA, RECHAZADA, EXPIRADA);
No sé como trabajar con el valor que me devuelve. Si intento cargarla en memo para ver los valores devueltos me dice que no es un string y me ofrece los posibles valores de la constante.
Puedes ver la imagen del IDE

Alguien puede explicarme como trabajar con estos valores.
Gracias.
Responder Con Cita
  #2  
Antiguo 07-02-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola

Esa definicion es de un tipo enumerado no una constante.

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #3  
Antiguo 07-02-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Los valores son los que pone en la imagen: 0, 1, 2, 3
Responder Con Cita
  #4  
Antiguo 07-02-2017
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Gracias por la respuesta.

Y como hago para obtener el valor que me viene?
Por que si hago:
Código:
  memo.Lines.Add('Estado '+result.Metadatos[i].Estado);
Obtengo el error de compilación:
[dcc32 Error] Unit1.pas(115): E2010 Incompatible types: 'string' and 'EstadoTipo'

Saludos.
Responder Con Cita
  #5  
Antiguo 07-02-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola

Pues en delphi 7 lo que haria seria declarar un array.

Código Delphi [-]
Valores:array[No_leida..expirada]of string=('No leida','Aceptada','Rechazada,'Expirada');

Y lo usaria asi:

Código Delphi [-]
memo.Lines.Add('Estado '+ valores[result.Metadatos[i].Estado]);
Bueno no lo he probado asi que tal vez halla que hacerle unos ajustes. Pero creo que se entiende la idea.

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #6  
Antiguo 07-02-2017
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Este valor lo recibo como respuesta a una petición SOAP y se carga en una TRemotable con esta definición:
Código:
  MetadatosTipo = class(TRemotable)
  private
    FticketID: ticketID;
    FMensajeID: IDGlobalTipo;
    FEstado: EstadoTipo;
    FEmisor: TipoNIF;
    FNombreEmisor: NombreEmisorTipo;
    FNombreEmisor_Specified: boolean;
    FTitular: TipoNIF;
    FNotificado: TipoNIF;
    FTipoMensajeria: TipoMensajeTipo;
    FActoNotificado: ActoNotificadoTipo;
    FActoNotificado_Specified: boolean;
    FAsunto: AsuntoTipo;
    FCuerpo: CuerpoTipo;
    FCuerpo_Specified: boolean;
    FDetalles: DetallesMensajeTipo;
    FDetalles_Specified: boolean;
    FNombreFicheroAdjunto: NombreFicheroAdjuntoTipo;
    FNombreFicheroAdjunto_Specified: boolean;
    FFerchaPuestaDisposicion: TXSDateTime;
    FEventoRecogida: InformacionEventoTipo;
    FEventoRecogida_Specified: boolean;
    FDatosRecogida: DatosRecogidaTipo;
    FDatosRecogida_Specified: boolean;
    procedure SetNombreEmisor(Index: Integer; const ANombreEmisorTipo: NombreEmisorTipo);
    function  NombreEmisor_Specified(Index: Integer): boolean;
    procedure SetActoNotificado(Index: Integer; const AActoNotificadoTipo: ActoNotificadoTipo);
    function  ActoNotificado_Specified(Index: Integer): boolean;
    procedure SetCuerpo(Index: Integer; const ACuerpoTipo: CuerpoTipo);
    function  Cuerpo_Specified(Index: Integer): boolean;
    procedure SetDetalles(Index: Integer; const ADetallesMensajeTipo: DetallesMensajeTipo);
    function  Detalles_Specified(Index: Integer): boolean;
    procedure SetNombreFicheroAdjunto(Index: Integer; const ANombreFicheroAdjuntoTipo: NombreFicheroAdjuntoTipo);
    function  NombreFicheroAdjunto_Specified(Index: Integer): boolean;
    procedure SetEventoRecogida(Index: Integer; const AInformacionEventoTipo: InformacionEventoTipo);
    function  EventoRecogida_Specified(Index: Integer): boolean;
    procedure SetDatosRecogida(Index: Integer; const ADatosRecogidaTipo: DatosRecogidaTipo);
    function  DatosRecogida_Specified(Index: Integer): boolean;
  public
    destructor Destroy; override;
  published
    property ticketID:                ticketID                  Index (IS_ATTR) read FticketID write FticketID;
    property MensajeID:               IDGlobalTipo              read FMensajeID write FMensajeID;
    property Estado:                  EstadoTipo                read FEstado write FEstado;
    property Emisor:                  TipoNIF                   read FEmisor write FEmisor;
    property NombreEmisor:            NombreEmisorTipo          Index (IS_OPTN) read FNombreEmisor write SetNombreEmisor stored NombreEmisor_Specified;
    property Titular:                 TipoNIF                   read FTitular write FTitular;
    property Notificado:              TipoNIF                   read FNotificado write FNotificado;
    property TipoMensajeria:          TipoMensajeTipo           read FTipoMensajeria write FTipoMensajeria;
    property ActoNotificado:          ActoNotificadoTipo        Index (IS_OPTN) read FActoNotificado write SetActoNotificado stored ActoNotificado_Specified;
    property Asunto:                  AsuntoTipo                read FAsunto write FAsunto;
    property Cuerpo:                  CuerpoTipo                Index (IS_OPTN) read FCuerpo write SetCuerpo stored Cuerpo_Specified;
    property Detalles:                DetallesMensajeTipo       Index (IS_OPTN) read FDetalles write SetDetalles stored Detalles_Specified;
    property NombreFicheroAdjunto:    NombreFicheroAdjuntoTipo  Index (IS_OPTN) read FNombreFicheroAdjunto write SetNombreFicheroAdjunto stored NombreFicheroAdjunto_Specified;
    property FerchaPuestaDisposicion: TXSDateTime               read FFerchaPuestaDisposicion write FFerchaPuestaDisposicion;
    property EventoRecogida:          InformacionEventoTipo     Index (IS_OPTN) read FEventoRecogida write SetEventoRecogida stored EventoRecogida_Specified;
    property DatosRecogida:           DatosRecogidaTipo         Index (IS_OPTN) read FDatosRecogida write SetDatosRecogida stored DatosRecogida_Specified;
  end;
y EstadoTipo se define como:
Código:
  EstadoTipo = (NO_LEIDA, ACEPTADA, RECHAZADA, EXPIRADA);
Al intentar leer los datos de la respuesta en cuando no sé como acceder al valor que trae.

Como ves en la imagen del otro post me ofrece los posibles valores de EstadoTipo.

Y si intento
Código:
memo.Lines.Add('Estado '+result.Metadatos[i].Estado);
me da el error de compilación que puse en el otro post.

De hecho, si lo vuelco en un xml obtengo su valor:
Código:
<tns:RespuestaConsulta xmlns:ape="urn:correos.es:ape.sne.datos.1.0" 
                       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
					   xmlns:tns="urn:correos.es:ape.sne.ws.accesobuzon.1.0">
	<tns:Paginacion>
		<tns:pagina>1</tns:pagina>
		<tns:totalPaginas>2</tns:totalPaginas>
		<tns:numeroElementos>30</tns:numeroElementos>
	</tns:Paginacion>
	<tns:Metadatos tns:ticketID="148620">
		<tns:MensajeID>1485796663920-1-0</tns:MensajeID>
		<tns:Estado>NO_LEIDA</tns:Estado>
		<tns:Emisor>28972577Y</tns:Emisor>
		<tns:NombreEmisor>Servicio de Notificaciones Electrónicas SNE</tns:NombreEmisor>
		<tns:Titular>P3208600A</tns:Titular>
		<tns:Notificado>P3208600A</tns:Notificado>
		<tns:TipoMensajeria>NOTIFICACION</tns:TipoMensajeria>
		<tns:ActoNotificado>PRUEBAS</tns:ActoNotificado>
		<tns:Asunto>Prueba Notificacion</tns:Asunto>
		<tns:Cuerpo>esto es una prueba de Notificacion WS</tns:Cuerpo>
		<tns:Detalles />
		<tns:FerchaPuestaDisposicion>2017-01-30T18:18:04+01:00</tns:FerchaPuestaDisposicion>
	</tns:Metadatos>
</tns:RespuestaConsulta>

Última edición por apicito fecha: 07-02-2017 a las 20:27:38.
Responder Con Cita
  #7  
Antiguo 07-02-2017
bitbow bitbow is offline
Miembro
 
Registrado: jul 2006
Posts: 366
Poder: 18
bitbow Va camino a la fama
Si tienes
EstadoTipo = (NO_LEIDA, ACEPTADA, RECHAZADA, EXPIRADA);
Al final solo tienes de que tipo es el estado actuamente, solo necesitas compar el Estadotipo.

con algun case o varios if y devolver la cadena que desees.

Estadotipo no va a contener un valor si no el tipo.

Saludos.
__________________
¡Ni como ayudarte Niño!!
bitbow
Responder Con Cita
  #8  
Antiguo 07-02-2017
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
[SOLUCIONADO] Tratamiento de tipos enumerados

Gracias bitbow.
No había trabajado nunca con este tipo de datos y me estaba volviendo loco.
Ahora lo entiendo:
Código:
         case result.Metadatos[i].Estado of
             EstadoTipo.NO_LEIDA: Estado := 'NO_LEIDA';
             EstadoTipo.ACEPTADA: Estado := 'ACEPTADA';
             EstadoTipo.RECHAZADA: Estado := 'RECHAZADA';
             EstadoTipo.EXPIRADA: Estado := 'EXPIRADA';
         end;
Un saludo.
Responder Con Cita
  #9  
Antiguo 07-02-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
Podes usar este truco: Ayudante para tipos enumerados

Código PHP:
var
  
sstring;
begin
  s 
:= Enum<EstadoTipo>.ValueName(result.Metadatos[i].Estado);
end

Última edición por AgustinOrtu fecha: 07-02-2017 a las 23:46:31.
Responder Con Cita
  #10  
Antiguo 07-02-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Para versiones mas antiguas de Delphi, otra opcion es:
Código Delphi [-]
uses TypInfo;
...
function StateName( const Estado: EstadoTipo ): string;
begin
  Result := GetEnumName( TypeInfo( EstadoTipo ), Ord( Estado ) );
end;

Uso:
Código Delphi [-]
...
  Estado := StateName( result.Metadatos[i].Estado );

  // o de forma directa: 
  Estado := GetEnumName( TypeInfo( EstadoTipo ), Ord( result.Metadatos[i].Estado ) );

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-02-2017 a las 00:18:54. Razón: agregar opción
Responder Con Cita
  #11  
Antiguo 08-02-2017
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Gracias [AgustinOrtu] y ecfisa.
Al final é optado por la solución de ecfisa:
Código:
uses TypInfo;
...
memo.Lines.Add('Estado '+GetEnumName( TypeInfo( EstadoTipo ), Ord( result.Metadatos[i].Estado )));
Responder Con Cita
  #12  
Antiguo 08-02-2017
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Abusando de vuestra paciencia, aprovecho que ya está en el post #6 de este hilo la definición del TRemotable y el xml que se me devuelve para hacer otra pregunta.
Si el xml me devuelve el valor del TicketID en esta etiqueta:
Código:
	<tns:Metadatos tns:ticketID="148620">
		<tns:MensajeID>1485796663920-1-0</tns:MensajeID>
y está definido en el TRemotable como:
Código:
  MetadatosTipo = class(TRemotable)
  private
    FticketID: ticketID;
  ....
  published
    property ticketID:                ticketID                  Index (IS_ATTR) read FticketID write FticketID;
Como puedio obtener el valor del TicketID?.
Por que a pesar de que el IDE me lo sugiere como uno de los miembros de result.Metadatos[i], si hago:
Código:
memo.Lines.Add('ticketID '+result.Metadatos[i].ticketID);
me apareceen blanco.
Tengo que hacer algo distinto al estar declarado com IS_ATTR?.
Un saludo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
constantes temporales Crandel Varios 11 17-01-2007 00:53:02
Constantes o uso de Dominios Abel Garcia Firebird e Interbase 1 10-10-2006 16:15:29
variables y constantes SaGuMa Varios 13 03-10-2006 16:18:03
Def. de constantes - Casting Mariana OOP 3 21-10-2005 19:24:23
constantes globales acrophet Varios 3 18-09-2003 13:51:45


La franja horaria es GMT +2. Ahora son las 01:41:38.


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