Otra cosa importante es que no estas inicializando los objetos que estas usando
sugarsoapPortType es una interface, es decir, para poder usarla, debes primero asignar una referencia a un objeto que imlpemente esa interface a la variable. De no hacerlo, la referencia contiene el valor
nil. Cualquier metodo que quieras ejecutar sobre una interface que vale nil, produce un error en tiempo de ejecucion
EAccessViolation
El wizard te genera automaticamente una funcion para crear esta interface,
GetsugarsoapPortType
Para usar la interface deberias hacer algo como esto:
Código Delphi
[-]
procedure blabla;
var
ws: sugarsoapPortType;
begin
ws := GetsugarsoapPortType;
end:
Esta misma "regla", se cumple para todos los tipos involucrados. Debes inicializarlos (crearlos, ya sea con un constructor, o con una funcion) y luego utilizarlos. Es cierto que existen los llamados "tipos primitivos" (Integer, string, record, etc) que si bien no es necesario resulta importante inicializarlos para darles un valor que tenga sentido:
Este codigo no da error, pero que valor tiene la variable I? No hay forma de saberlo ya que I va a tener el valor que estaba almacenado en la direccion de memoria que le fue asignado. Se dice en la jerga que el valor de I es "residuo"
Código Delphi
[-]
procedure blabla;
var
I: Integer;
begin
ShowMessage(IntToStr(I));
end;
Hago enfasis en esto porque del mismo modo que invocas metodos sobre una interface sin antes inicializarla, y tambien le pasas parametros que no son inicializados
Por ejemplo,
user_auth es una clase:
Código Delphi
[-]
user_auth = class(TRemotable)
private
Fuser_name: string;
Fpassword: string;
published
property user_name: string read Fuser_name write Fuser_name;
property password: string read Fpassword write Fpassword;
end;
Osea que debes inicializar una variable y luego tambien darle valores a sus propiedades internas (user_name y password, sino quedan como string vacios y quiza no tenga sentido, lo ideal seria darle valores concretos)