Club Delphi  
    Paypal   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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-04-2015
doctorhd doctorhd is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 48
Poder: 0
doctorhd Va por buen camino
Gracias nlsgarcia y Al González por sus respuestas, me queda claro el origen del error.
Ahora a raíz del cambio indicado por ustedes, tengo el siguiente problema...(no se si sera necesario abrir un nuevo hilo)
al llamar a la función:
Código Delphi [-]
....
funGlobal.CloseObjet([FDetail]);{Destruimos las clases integrantes}
....

procedure TfunGlobal.CloseObjet(var AObjeto:Array of TObject);
var vIndice:Integer;
begin
  for vIndice:= Low(AObjeto) to High(AObjeto) do begin
    if Assigned(AObjeto[vIndice]) then FreeAndNil(AObjeto[vIndice]){Liberamos la memoria}
  end;{for}
end;{procedure}
tengo el siguiente error:
Código Delphi [-]
[dcc32 Error] ControlErroresUnit.pas(108): E2197 Constant object cannot be passed as var parameter
el cual indica que no puedo pasar una constante como parámetro a una función que requiere una variable, cuestión que no es cierta, ya que FDetail es un campo de una clase que a su vez también es una clase, aquí va la definición de ambas:

Código Delphi [-]
type
   TClassError = class
   private { Private declarations }
     FAccionOrigen:String;
     FTraceError:String;
     FMensajeError:String;
     FViewTraceError:Boolean;
     FTileMsg:string;
   public { Public declarations }
     constructor Create(AAccionOrigen:String;ATraceError:String;ATileMsg:String);
     procedure DisplayError;
     procedure SetMensajeError(AMensajeError:String);
     procedure SetViewTraceError(AViewTraceError:Boolean);
   public
     property AccionOrigen: String read FAccionOrigen;
     property TraceError: String read FTraceError;
     property MensajeError: String read FMensajeError;
     property ViewTraceError: Boolean read FViewTraceError;
   end;

type
   TControlErrores = class
   private { Private declarations }
     FDetail:TClassError;
     FTileMsg:string;
     procedure CreateMsgError(AError: Exception; AAccionOrigen:String; ATraceError:String);
     function ConstruyeMsgErroresDataSnap(AError:Exception; AAccionError:String; var AmsgSalida:String): Boolean;
     function ConstruyeMsgErroresBD(AError:Exception; AAccionError:String; var AmsgSalida:String): Boolean;
     function ConstruyeMsgErroresSistema(AError:Exception; AAccionError:String; var AmsgSalida:String): Boolean;
   public { Public declarations }
     constructor Create(AE:Exception;AAccionOrigen:String;ATileMsg:string);
     destructor Destroy; override;
     procedure DisplayError;
   public
      property Detail:TClassError read FDetail;
   end;

Saludos...
Responder Con Cita
  #2  
Antiguo 28-04-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Podemos convenir que FDetail es una variable, concretamente un campo de una clase debidamente instanciada. Eso está bien, pero el "[FDetail]" que vemos en tu código es lo que formalmente se denomina un constructor de matriz abierta (open array constructor).

Ese término no se refiere a un método constructor, sino a una construcción gramatical que lleva corchetes con el propósito de formar una matriz "al vuelo". Al formarse esa matriz (array), cada uno de los elementos que contiene son considerados por el compilador como valores constantes (los punteros, no las instancias a las que apuntan). Por ello es que aparece el error que te da el compilador.

Si lo que necesitas es crear una rutina que reciba una matriz abierta de "variables" objeto, piensa en esa matriz o vector como una lista de punteros. Cada puntero señalando a una variable objeto. Para intentar ilustrarlo, tomo la función ghFreeNil de GH Freebrary que realiza una tarea similar (por ser el ejemplo más cercano que tengo).
Código Delphi [-]
  Type
    PObject = ^TObject;
  ...
  Procedure ghFreeNil (Const Objs :Array Of PObject);
  Var
    Obj :PObject;
  Begin
    For Obj In Objs Do  // Esta sintaxis de For es relativamente nueva en el compilador
      FreeAndNil (Obj^);
  End;
  ...
  // Llamamos a ghFreeNil dándole una matriz creada al vuelo (array de punteros a variables objeto)
  ghFreeNil ([@MiVariableObjeto1, @MiVariableObjeto2, @MiVariableObjeto3]);
¿Agarras la onda?
Responder Con Cita
  #3  
Antiguo 28-04-2015
doctorhd doctorhd is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 48
Poder: 0
doctorhd Va por buen camino
Gracias Al González. Y por supuesto Agarro la onda...
Saludos...
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
FreeAndNil VS Free GerTorresM OOP 45 30-01-2012 01:54:24
Forms: FreeAndNil ó Release y la validación Assigned? jbautista Varios 13 09-02-2010 17:33:03
Microsoft libera ASP .NET MVC AzidRain Noticias 3 10-04-2009 19:06:52
Problemas FreeAndNil OscarG OOP 4 09-11-2005 12:48:46
No libera la MEMORIA pruz Varios 1 27-04-2004 21:30:33


La franja horaria es GMT +2. Ahora son las 18:31:52.


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