Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2011
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 485
Poder: 17
Neeruu Va por buen camino
Cool OverLoad con parametro Nil

Hola a todos!!!

Tengo la siguiente duda:

Tengo una Procedure :

Código Delphi [-]
Procedure AsignaExecute(MyBtnAction:TButtonAction; MyExecute:TNotifyEvent);

y lo invocaba de esta manera sin ningún problema (o sea compilaba y ejecutaba)

Código Delphi [-]
AsignaExecute(baSearch, Nil);

Ahora resulta que extendí ese procedimiento, y me quedo así:

Código Delphi [-]
  
Procedure AsignaExecute(MyBtnAction:TButtonAction; MyExecute:TNotifyEvent); overload;
Procedure AsignaExecute(MyBtnAction:TButtonAction; MyExecute:TNotifyEvent;
    bMostrar:Boolean); overload;

Hasta aca todo bien pero al momento de compilar me sale el error de:

Cita:
E2250: There is no overloaded version of '%s' that can be called with these arguments
Lo solucione, pero no se porque:
Código Delphi [-]
    
MyExecute := Nil;
AsignaExecute(baSearch, MyExecute, True);

Si alguien me podría explicar porque pasando 'Nil' no anda... y pasando el parámetro en una variable si!!!!


Saluda Atte Neeruu!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #2  
Antiguo 02-11-2011
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 19
javier7ar Va por buen camino
no es porque pasas nil en una variable, sino porque estas pasando 3 parametros en vez de 2
Igualmente, con 2 parametros deberia andar, a menos que tengas un valor por defecto en el tercer parametro...
Copiaste bien el codigo que puones aca ??
Responder Con Cita
  #3  
Antiguo 02-11-2011
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 485
Poder: 17
Neeruu Va por buen camino
Cool OverLoad con parametro Nil

Hola Javier:

Si esta bien copiado....
Fíjate que en la primera función son 2 parámetros, en la segunda son 3 parámetros, por eso esta el "overload", para sobrecargar la función....


Mira las declaraciones de las funciones:
Código Delphi [-]
Procedure AsignaExecute(MyBtnAction:TButtonAction; MyExecute:TNotifyEvent); overload;
Procedure AsignaExecute(MyBtnAction:TButtonAction; MyExecute:TNotifyEvent; bMostrar:Boolean); overload;

Saluda Atte Neeruu!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #4  
Antiguo 03-11-2011
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 19
javier7ar Va por buen camino
Si, eso si. Yo me referia a cuando lo llamas:
en el primer caso lo estas llamando con 2 parametros:
Código Delphi [-]
AsignaExecute(baSearch, Nil);
y en el segundo con 3 parametros:
Código Delphi [-]
MyExecute := Nil;
AsignaExecute(baSearch, MyExecute, True);

A lo que me refiero es que no funciona porque asignas nil a una variable, sino porque lo estas llamando con mas parametros. Estoy seguro que si probas:
Código Delphi [-]
AsignaExecute(baSearch, nil, True);
tambien debe funcionar.
Lo que no entiendo todavia es por que no funciona con 2 parametros...
Responder Con Cita
  #5  
Antiguo 03-11-2011
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 19
javier7ar Va por buen camino
me retracto de lo que dije...

haciendo pruebas, vi que
Código Delphi [-]
AsignaExecute(baSearch, nil, True);
tampoco funciona, y creo saber por que es...

Cuando usas overloading de funciones o procedimientos, para saber cual de todos los AsignaExecute tiene que usar, Delphi busca por cantidad y tipo de los parametros que le pasas y los compara con la cantidad y tipo de los parametros de las distintas declaraciones de AsignaExecute... y cual es el tipo de nil ?? bueno, creo que por ahi viene la mano

No estoy seguro de cual es el tipo de nil, porque no lo dice especificamente en la ayuda, solo dice que es una contante que se puede asignar a cualquier puntero, asi que podria ser Pointer, y en ese caso cuando busca que AsignaExecute debe ejecutar, estaria buscando una declaracion mas o menos asi:
Código Delphi [-]
Procedure AsignaExecute(Param1:TButtonAction; Param2:Pointer); overload;
y no la encuentra, por eso el error.

Esto es una consecuencia de usar overloading de funciones o procedimientos, que no pasaria si el procedimiento no estuviese sobrecargado (overload).
Asi que vas a tener que asignar nil a una variable como le venis haciendo, si queres usarlo de esta forma.

Tambien existe otra alternativa, y es usar valores por defecto en los parametros:
en ves de hacer overloading declaras un solo procedimiento con un valor por defecto para el ultimo parametro:
Código Delphi [-]
Procedure AsignaExecute(MyBtnAction:TButtonAction; MyExecute:TNotifyEvent; bMostrar:Boolean = FALSE);  // o = TRUE
y lo usas asi:
Código Delphi [-]
AsignaExecute(baSearch, nil);  //Toma el valor FALSE por defecto para el ultimo parametro
AsignaExecute(baSearch, nil, True);
//Tambien podes usar una variable
MyExecute := Nil;
AsignaExecute(baSearch, MyExecute);  //Toma el valor FALSE por defecto para el ultimo parametro
AsignaExecute(baSearch, MyExecute, True);
es otra opcion que te puede servir o no, pero te la dejo para que la mires
Saludos
Responder Con Cita
  #6  
Antiguo 03-11-2011
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 485
Poder: 17
Neeruu Va por buen camino
Cool OverLoad con parametro Nil

Hola Javier gracias por tu respuesta...

Voy a ver lo que me decís de poner un parámetro con valor por defecto...


Desde ya muchas gracias por tu explicación....


Saluda Atte Neeruu!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #7  
Antiguo 03-11-2011
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 485
Poder: 17
Neeruu Va por buen camino
Cool OverLoad con parametro Nil

De 10!!!! Modifique la función y anda todo....

Ahora otra pregunta.... ya que me mencionaste los parámetros con valores por defecto.

Supongamos que tengo una función:

Código Delphi [-]
Function MyFunction(pPar:String = ''; pPar2:String = ''; pPar3:Boolean = False)

Y quiero solamente pasar el parámetro Booleano, se puede hacer asi?:

Código Delphi [-]
MyFunction(True);

Y en el caso de querer pasar valores al 2do Parámetro? (Tener en cuenta que el 1er y 2do parámetro son del mismo tipo)


Saluda Atte Neeruu!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
  #8  
Antiguo 03-11-2011
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 19
javier7ar Va por buen camino
nop, no se puede.

En Delphi, la forma de asociar los parametros reales (los que estas pasando) a los parametros formales (los que estan declarados) es pocicional, es decir, el primer parametro que pasas lo asocia con el primer parametro declarado, el segundo con el segundo, y asi. Por eso no podes pasar un valor para el 3er parametro sin haber pasado un valor para los 2 primeros.

Otra cosa: los parametros que tienen un valor por defecto se declaran a la derecha, y si un parametro tiene un valor por defecto los siguientes (a la derecha) deben tener tambien un valor por defecto (esto es por la misma razon que te mencione arriba)

Te dejo lo que dice la ayuda de Dephi sobre Parametros con Valores por Defecto
Saludos

Cita:
Default parameters
You can specify default parameter values in a procedure or function heading. Default values are allowed only for typed const and value parameters. To provide a default value, end the parameter declaration with the = symbol followed by a constant expression that is assignment-compatible with the parameter’s type.
For example, given the declaration

Código Delphi [-]
procedure FillArray(A: array of Integer; Value: Integer = 0);

the following procedure calls are equivalent.

Código Delphi [-]
FillArray(MyArray);
FillArray(MyArray, 0);

A multiple-parameter declaration cannot specify a default value. Thus, while

Código Delphi [-]
function MyFunction(X: Real = 3.5; Y: Real = 3.5): Real;

is legal,

Código Delphi [-]
function MyFunction(X, Y: Real = 3.5): Real;   // syntax error

is not.
Parameters with default values must occur at the end of the parameter list. That is, all parameters following the first declared default value must also have default values. So the following declaration is illegal.

Código Delphi [-]
procedure MyProcedure(I: Integer = 1; S: string);   // syntax error

Default values specified in a procedural type override those specified in an actual routine. Thus, given the declarations

Código Delphi [-]
type TResizer = function(X: Real; Y: Real = 1.0): Real;

function Resizer(X: Real; Y: Real = 2.0): Real;
var
  F: TResizer;
  N: Real;

the statements

F := Resizer;

F(N);

result in the values (N, 1.0) being passed to Resizer.
Default parameters are limited to values that can be specified by a constant expression. Hence parameters of a dynamic-array, procedural, class, class-reference, or interface type can have no value other than nil as their default. Parameters of a record, variant, file, static-array, or object type cannot have default values at all.
For information about calling routines with default parameter values, see Calling procedures and functions.
Responder Con Cita
  #9  
Antiguo 03-11-2011
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 19
javier7ar Va por buen camino
la idea de parametros con valores por defecto es para cuando tenes parametros que no es necesario que se pasen, o para parametros que siempre se pasan con un mismo valor y solo en casos excepcionales se pasan con un valor distinto.

Por ejemplo, yo tengo una funcion que me convierte un tipo float a string, dandole formato con separador de miles y dos decimales por defecto, que es lo que se usa en todo el sistema, pero en algunas ocaciones muy particulares se necesito 3 o 4 decimales. Entonces la funcion esta declarada asi:

Código Delphi [-]
function FormatoDecimal(Valor:Currency; Decimales:Word = 2):String;

y la uso asi:

Código Delphi [-]
ImporteString:=FormatoDecimal(Importe); // el uso general
ImporteString:=FormatoDecimal(Importe,4); // solo cuando fue necesario

Como siempre pasa, cuando uno descubre algo nuevo y que parece que esta bueno lo quiere usar para todo , pero a veces no es aplicable.
Espero te sirva

Saludos
Responder Con Cita
  #10  
Antiguo 03-11-2011
Neeruu Neeruu is offline
Miembro
 
Registrado: oct 2007
Posts: 485
Poder: 17
Neeruu Va por buen camino
Cool

Muchas gracias Javier.....

Ya estoy procesando varias mejoras para mi código.... para simplificarme la vida..... jejeje


Saluda Atte Neeruu!!!
__________________
Saluda Atte Neeruu!!! :)
Responder Con Cita
Respuesta



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
WMI- Error en parametro MAXIUM Varios 0 31-10-2010 02:26:46
stdcall? overload? hmv OOP 4 30-10-2006 21:14:28
problema con overload santiago14 Varios 1 03-03-2005 14:35:00
Error "there is no overload version" torito Varios 4 21-11-2003 20:54:00
Aclaracion de overload tica Varios 3 06-11-2003 16:09:59


La franja horaria es GMT +2. Ahora son las 11:48:52.


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