[Lazarus-es] devolver valor de un form

JoshyFun joshyfun en gmail.com
Lun Jun 15 23:42:29 CEST 2009


Hello Paola,

Monday, June 15, 2009, 11:17:51 PM, you wrote:

>>      BuscaCliente:=TfrmBuscaCliente.Create(Self);
PB> He querido colocar esto en un procedimiento
PB> genérico en una unit llamada por ej: 
PB> funciones.pas, porque es desde muchos lados que 
PB> puedo invocar la busqueda de clientes.
PB> Al hacerlo, me sale el error que el método Self 
PB> no existe (ahora no lo tengo a mano para copiarlo

Vale, simplemente es que yo siempre uso ese tipo de cosas desde forms,
nunca desde funciones "genéricas" por lo tanto "Self" es siempre el
form actual, mientras que una función que no es de ninguna clase
"Self" no existe. La misión de poner un "Owner", "Self" en este caso
es que cuando "self" (quién sea) sea liberado, este liberará todos los
forms u objetos de los que el sea "Owner". Como en este caso
controlamos la creación y destrucción del form de una manera clara (su
vida es muy corta) podemos poner simplemente "nil" en vez de "Self" y
asunto solucionado.

El método de usar "Self" es muy habitual cuando creamos muchos forms
en pantalla que están todos vivos a la vez, y los dejamos así, si
cerramos el form principal este cerrará todos los hijos
automáticamente (owned).

PB> He estado revisando ejemplos viejos, donde
PB> definía por ej una unidad con funciones, y luego, cada función la llamaba asi:
PB> unit.funcion()
PB> o
PB> unit.procedimiento()
PB> es así que debería usarse siempre??

No, forzar el "namespacing", que es lo que haces al poner lo de "unit."
donde unit es el nombre de una de las units, sólo es necesario y/o
interesante para resolver ambigüedades. Un ejemplo en Windows es
"Beep", si pones "Beep" a secas normalmente el procedimiento a
compilar presenta este prototipo:

Procedure Beep();

Pero si en el "uses" añadimos al final "windows" veremos que el "Beep"
nos da error de compilación ya que el prototipo que se relaciona es:

Procedure Beep(Frequence: integer; Duration: Integer);

Por lo tanto si queremos usar el "Beep" anterior (sin parámetros)
tendremos que forzar el namespace poniendo.

system.beep();

Resumiendo, para resolver ambigüedades o asegurarnos ante una posible
ambigüedad que ya estamos acostumbrados a tener de vez en cuando (a mi
me pasa mucho con Beep, pero como ya casi nunca incluyo windows en el
uses, pues mucho menos) :)

-- 
Best regards,
 JoshyFun





More information about the Lazarus-es mailing list