Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Font.Assign(Owner.Font); vs Font:=owner.Font; (https://www.clubdelphi.com/foros/showthread.php?t=28538)

eliash 22-12-2005 15:57:02

Font.Assign(Owner.Font); vs Font:=owner.Font;
 
¿Que diferencia hay entre escribir...
Código:

Font.Assign(Owner.Font);
y...
Código:

Font:=owner.Font;
Se lo pregunte al buen Kambiz pero no resolvió mi duda...
Por alguna razón, cuando introduzco la segunda linea en mi código, el programa funciona perfectamente, pero me da un fallo al cerrar...?

delphi.com.ar 22-12-2005 16:16:49

Font es una variable que contiene un objeto, si utilizas un assign, copias las porpiedades de otro objeto sobre el tuyo, pero si lo asignas Font := Owner.Font, estas asignando a esa variable el objeto contenido en Owner.Font y posiblemente hayas perdido referencia al otro objeto.
Seguramente te da un error al cerrar, porque cuando uno de los objetos libera el font, y ambos objetos apuntan al mismo objeto, el otro si lo quier utilizar para algo va a producir un access violation.

Saludos!

jachguate 22-12-2005 16:49:16

Lo explicado por Fede es cierto si, por ejemplo, el control del Font que recibe la asignación lo tenes vos y no hay nada tras bambalinas.

Ocurre que con la VCL, vos regularmente podes hacer algo como:

Código Delphi [-]
Canvas2.Font := Canvas1.Font

Y siendo que el Font en el canvas es una propiedad, regularmente su método de asignación evitará que Font de Canvas2 apunte a Font de Canvas1, y llamará a assign para copiar sus valores.

Por ello es que pueden hacerse muchas "asignaciones" de modo seguro en la VCL.

Hasta luego.

;)

eliash 26-12-2005 13:27:19

:)
Gracias a los dos; otro día miraré exhaustivamente vuestros posts (porque ahora no tengo ganas de pensar) y ya os contaré si caigo.

eliash 28-12-2005 22:10:15

Ya lo entiendo!!....
O sea, con assign copio las propiedades de A y las pongo en B
con:= Hago que B sea A, pero en realidad no es más que el mismo objeto con dos nombres
Es así?
Gracias por las molestias.

delphi.com.ar 28-12-2005 22:30:12

Cita:

Empezado por eliash
con:= Hago que B sea A, pero en realidad no es más que el mismo objeto con dos nombres

No con dos nombres, con dos apuntadores. Digamos dos variables apuntan al mismo objeto.

Es buena la observación de jachguate que se me pasó, muchas propiedades de objetos de la VCL internamente hacen un Assign, así que previenen que sobreescribamos el objeto.

Saludos!

jachguate 29-12-2005 04:58:59

Cita:

Empezado por eliash
en realidad no es más que el mismo objeto con dos nombres

No olvides que en delphi, cualquier variable de tipo "objeto" no es mas que un apuntador. Lo que en el viejo pascal era:

Código Delphi [-]
  objeto^.miembro := valor;
en delphi se reduce a:
Código Delphi [-]
  objeto.miembro := valor;

pero la asignación directa, sigue asignando el puntero y no otra cosa.

Ya lo ha dicho fede:
Código Delphi [-]
  b := a;
hace que b apunte a donde apunta a, y no que el objeto a se copie al objeto b (que de hecho, podría sin problemas no existir en el momento de la asignación).

Hasta luego.

;)

Lepe 29-12-2005 11:32:04

Como corolario a las excelentes explicaciones de nuestro moderadores, podríamos decir:

La VCL hace un Assign en muchos casos (copiando el objeto entero), pero el objeto Font es una excepción, por tanto, siempre que queramos copiar el objeto, es mejor usar Assign, nos libera de dudas y aclara el código.

Saludos

eliash 03-01-2006 22:14:33

:)
Gracias
Entonces...

:= No debería Delphi entonces utilizar dos simbolos?

^ O la antigua sintaxis?

eliash 03-01-2006 22:16:08

Ah! Feliz año... y feliz navidad... fuera de fecha...

jachguate 10-01-2006 02:14:49

Esto podes tomarlo como una simplificación al lenguaje, que hace que los neofitos se asusten menos, y quienes estan un poco mas experimentados, tendrán con la aclaración para no olvidarlo. A mi, en lo personal, me es, hasta cierto punto, indiferente.

Saludos.

;)


La franja horaria es GMT +2. Ahora son las 10:40:44.

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