Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problemas con array o array (https://www.clubdelphi.com/foros/showthread.php?t=57543)

noodle_ 19-06-2008 15:42:00

problemas con array o array
 
estoy trabajando con webservices axis y necesito acceder a la respuesta de metodos que devuelven un tipo de dato Map (en java), ya los importe ahora no se como acceder a la informacion, la unidad que se genera es esta
Código Delphi [-]
type
  mapItem              = class;            
  mapItem = class(TRemotable)
  private
    Fkey: Variant;
    Fvalue: Variant;
  published
    property key: Variant read Fkey write Fkey;
    property value: Variant read Fvalue write Fvalue;
  end;

  Map        = array of mapItem;                
  ArrayOf_apachesoap_Map = array of Map;  
  Libretas = interface(IInvokable)
  ['{BC06A486-31BC-4F8E-303C-8640EC78FA68}']
  function  listarPlanes: ArrayOf_apachesoap_Map; stdcall;
ahora intente hacer lo sigt para ver la informacion
Código Delphi [-]
var RIO:THTTPRIO;
puerto:Libretas;
lista:ArrayOf_apachesoap_Map;
m:Map;
mi:mapItem;
begin
  RIO:=THTTPRIO.Create(nil);
  RIO.URL:= 'http://127.0.0.1:8080/axis/Libretas.jws';
  RIO.WSDLLocation:= 'http://127.0.0.1:8080/axis/Libretas.jws?WSDL';
  RIO.Service:= 'LibretasService';
  RIO.Port:='Libretas';
  puerto:=RIO as Libretas;
  lista:=puerto.listarPlanes;
  m:=lista[0];
  mi:=m[0] as TRemotable;
  ShowMessage(mi.value);
deja compilar pero al ejecutarlo en esta parte sale mensaje de excepcion "acces violation", no se si el problema esta con los arrays creo q estoy accediendo mal, el ejemplo del metodo listarPlanes devuelve mas de un registro.
Gracias de antemano.

coso 19-06-2008 16:44:56

debes dar memoria a los dos arrays, ya que no indicas en tiempo de diseño su tamaño. De la manera que lo tienes ahora mismo, son 'punteros nulos'. Prueba con hacer algo antes de usar las variables como

Código Delphi [-]
   getmem(m,numero_de_maps_que_necesitas*sizeof(mapItem);
   ...
   freemem(m);

lo mismo con el otro array dinamico.

PD: por cierto , estas haciendo dobles arrays dinamicos. Ya es eso lo que necesitas?

noodle_ 19-06-2008 20:17:53

Gracias por el interes, intente lo que me sujeriste pero sigue saliendo el mismo error, tambien intente con setLength.
Código Delphi [-]
  puerto:=RIO as Libretas;
  GetMem(lista,50*SizeOf(Map));
  lista:=puerto.listarPlanes;
  GetMem(m,50*SizeOf(mapItem));
  m:=lista[0];
  mi:=m[0] as TRemotable;
  ShowMessage(mi.value);
el error se da en el momento en que invoco al metodo listarPlanes, espero mas respuestas gracias.

coso 19-06-2008 21:17:03

que tipo de dato te devuelve prueba.ListarPlanes?

no asignes memoria a 'lista' a ver ...

noodle_ 19-06-2008 21:49:58

dicho anteriormente la descripcion de los tipos de datos la genera delphi cuando importo el xml o el wsdl del webservice y es la sgt
Código Delphi [-]
type
  mapItem              = class;
  mapItem = class(TRemotable)
  private
    Fkey: Variant;
    Fvalue: Variant;
  published
    property key: Variant read Fkey write Fkey;
    property value: Variant read Fvalue write Fvalue;
  end;
  Map        = array of mapItem;                
  ArrayOf_apachesoap_Map = array of Map;

function  listarPlanes: ArrayOf_apachesoap_Map; stdcall;
listarPlanes devuelve ArrayOf_apachesoap_Map que es un array de Map y Map es un array de objetos del tipo mapItem, espero haber resuelto la duda, probe al no reservar memoria a lista pero no solucione el problema.

coso 19-06-2008 21:55:07

y sabes seguro si son 50 el numero que vas a necesitar?

noodle_ 19-06-2008 22:21:10

el numero de respuestas que devuelve es 16, tambien intente con ese valor pero no me soluciono nada.

coso 19-06-2008 22:30:57

vale...

Código Delphi [-]
 
   puerto:=RIO as Libretas;
 
   try 
     GetMem(lista,num_elems*sizeof(map));
     for i := 0 to num_elementos_lista do
// asignamos memoria a cada uno de los elementos (que son tambien arrays dinamicos) de lista
     GetMem(lista[i],num_maps*sizeof(mapItem)); 
   except
   ...
   end;

  lista:=puerto.listarPlanes;
  GetMem(m,50*SizeOf(mapItem));
  m:=lista[0];
  mi:=m[0] as TRemotable;
  ShowMessage(mi.value);

prueba con esto.

PD: prueba tambien con el setlenght
PDD : tendras que liberar tambien, antes que al objeto lista, todos y cada uno de sus elementos


La franja horaria es GMT +2. Ahora son las 18:40:32.

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