En progrmación orientada a objetos uno de los puntos fuertes es la encapsulación. Al declarar un atributo publico, perdemos el control sobre lo que se hace sobre el. Que pasaria si el dia de mañana necesitamos tomar una acción cuando se lee el valor del atributo? Con un atributo publico no podemos. Para eso en ObjectPascal existen la propiedades, que nos permiten mantener la interface de un objeto a pesar de haber cambiado internamente. Por ejemplo si necensitamos un atributo que se pueda leer y escribir y no tomar ninguna accion cuando eso sucede:<br>
<br>MiClase = class(TObject)<br>private<br> FAttr:integer;<br>published //Published si necesitamos RTTI, sino public<br> property Attr:integer read FAttr write FAtrr;<br>end;<br><br>Ahora si los requerimientos cambian y necesitamos tomar una accion al asignar un valor a la propiedad simplemente hacemos:<br>
<br>MiClase = class(TObject)<br>
private<br>
FAttr:integer;<br> procedure SetAttr(AAtrr:integer);<br>
published //Published si necesitamos RTTI, sino public<br>
property Attr:integer read FAttr write SetAttr;<br>
end;<br><br>procedure MiClase.SetAttr(AAtrr:integer);<br>begin<br> AlgunaAccion();<br> FAtrr := AAtrr;<br>end;<br><br>Con lo que hemos modificado el comportamiento sin modificar la interface. Otra cosa es que las propiedades nos permiten tener atributos de solo lectura o solo escritura, que de otra forma no lo podemos controlar.<br>
Saludos.<br><br><div class="gmail_quote">El 13 de junio de 2009 22:24, Eduardo Lopez <span dir="ltr"><<a href="mailto:dar_alle@yahoo.com.ar">dar_alle@yahoo.com.ar</a>></span> escribió:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Muchas gracias por los apuntes.<br>
Me queda una duda. ¿Cuáles serían los riesgos de declarar atributos públicos en una clase?<br>
Desde ya, muchas gracias.<br>
Eduardo.<br>
Carlos German Tejero escribió:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">
Buenas a todos, si se me permite quiciera hacer un par de comentarios con respecto a esta solucion, espero sumar y no incomodar:<br>
<br>
1.- Cuando usamos formularios modales y necesitamos retornar un valor sobre la eleccion del usuario, tenemos a nuestra disposicion la propiedad ModalResult. Por ejemplo, le ponemos al form dos TBitBtn uno con ModalResult = mrYes y el otro con ModalResult = mrCancel, entoces hacemos:<br>
Form := TForm.Create(nil);<br>
if(Form.ShowModal = mrYes)then<br>
Algo<br>
else<br>
OtraCosa<br>
<br>
2.- Nunca olvidemos que estamos usando ObjectPascal que es progrmacion orientada a objetos hibrida, no es una buena practica declarar un atributo publico en una clase, para tener el control total deberiamos hacer lo siguiente:<br>
private<br>
...<br>
FArtId:integer;<br>
...<br>
pubblished<br>
...<br>
property ArtId:integer read FArtId; //Solo lectura desde afuera<br>
...<br>
3.- Y por ultimo esta es mas personal que otra cosa mucho, personamente nunca uso Objecto.Free para liberar un objeto, siempre uso FreeAndNil(Objeto). La razon de eso es que en realidad, y dependiendo del memory manager que estemos usando, cuando liberamos la memoria esta solo es marcada como libre, pero nuestro puntero o referencia sigue apuntando alli, lo que puede producir que en ocasiones el siguiente codigo erroneo funcione y pase desapercibido:<br>
...<br>
Obj := TObj.Create;<br>
...<br>
Obj.Free;<br>
...<br>
Obj.Algo;<br>
...<br>
<br>
Si utilizamos FreeAndNil este codigo jamas podria pasar funcionar.<br>
Saludos.<br>
<br></div>
El 12 de junio de 2009 22:06, Eduardo Lopez <<a href="mailto:dar_alle@yahoo.com.ar" target="_blank">dar_alle@yahoo.com.ar</a> <mailto:<a href="mailto:dar_alle@yahoo.com.ar" target="_blank">dar_alle@yahoo.com.ar</a>>> escribió:<div>
<div></div><div class="h5"><br>
<br>
Hola... así lo resolví yo, quizás haya alguna forma mejor, pero<br>
esto es lo que hice:<br>
<br>
En el botón que llama al Formulario de búsquedas tengo lo siguiente:<br>
<br>
procedure TFormMovStock.BotonBuscaArticuloClick(Sender: TObject);<br>
begin<br>
FormBuscaArticulo := TFormBuscaArticulo.Create(nil);<br>
try<br>
FormBuscaArticulo.ShowModal;<br>
finally<br>
begin<br>
if FormBuscaArticulo.pAceptoForm then<br>
Spin_ART_ID.Value:=FormBuscaArticulo.pART_ID<br>
else Spin_ART_ID.Value:=0;<br>
FormBuscaArticulo.Free;<br>
Spin_ART_ID.SetFocus;<br>
end<br>
end;<br>
end;<br>
<br>
En el formulario de búsqueda propiamente habilité dos propiedades<br>
públicas para llenarlas con la respuesta y poder "retornarlas" al<br>
llamador:<br>
<br>
<br>
procedure FormShow(Sender: TObject);<br>
private<br>
{ private declarations }<br>
public<br>
pART_ID : Integer;<br>
pAceptoForm : Boolean;<br>
<br>
{ public declarations }<br>
<br>
<br>
<br>
Obviamente en botón Seleccionar del Formulario de búsqueda indico<br>
el pART_ID marcado y pongo pAceptoForm en verdadero y cierro el<br>
formulario.<br>
El proceso llamador pregunta por los valores y finalmente destruye<br>
el formulario de búsqueda.<br>
<br>
Saludos.<br>
Eduardo<br>
<br>
<br>
Paola Bruccoleri escribió:<br>
<br>
Hola...<br>
<br>
tengo un form con la lista de clientes; Quiero que se devuelva<br>
el numero de cliente cuando se salga de ese form<br>
Ese form va a ser usado desde otros forms, donde se pida como<br>
dato el cliente y haya que buscarlo. Uso para eso un<br>
editbutton, de tal forma que al hacer clic en el botoncito<br>
aparezca la ventana de busqueda, y cuando retorne, tenga el<br>
código ya escrito en el campo.<br>
En algunas épocas use una variable global con el codigo<br>
elegido, pero no me gusta nada ese sistema.<br>
He pensado en usar una variable publica de la clase<br>
TListaClientes, pero no tengo todavía muy claro como hacerlo.<br>
Alguna idea??<br>
chauuuuuuuuuuuuuu<br>
<br>
=======================<br>
A/P Paola Bruccoleri Arrambide<br>
San José de Mayo - San José - URUGUAY<br>
<br>
Blog: <a href="http://paolabruccoleri.reducativa.com" target="_blank">http://paolabruccoleri.reducativa.com</a><br>
Portal Educativo: <a href="http://www.reducativa.com.uy" target="_blank">http://www.reducativa.com.uy</a><br>
Wiki: <a href="http://wiki.reducativa.com" target="_blank">http://wiki.reducativa.com</a><br>
Material sobre las XO:<br>
<a href="http://www.reducativa.com/wiki/index.php?title=Proyecto_OLPC_-_Plan_Ceibal" target="_blank">http://www.reducativa.com/wiki/index.php?title=Proyecto_OLPC_-_Plan_Ceibal</a><br>
<br>
Cartillas XO Sugar 8.2:<br>
<a href="http://www.reducativa.com/wiki/index.php?title=Cartillas_sobre_uso_de_la_XO" target="_blank">http://www.reducativa.com/wiki/index.php?title=Cartillas_sobre_uso_de_la_XO</a><br>
<br>
<br>
<br>
_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a><br></div></div>
<mailto:<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a>><div class="im"><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
<br>
<br>
<br>
_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a><br></div>
<mailto:<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a>><div class="im"><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
<br>
<br>
<br>
<br>
-- <br>
Carlos Germán Tejero<br></div>
------------------------------------------------------------------------<div class="im"><br>
<br>
_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
<br>
</div></blockquote><div><div></div><div class="h5">
<br>
<br>
_______________________________________________<br>
Lazarus-es mailing list<br>
<a href="mailto:Lazarus-es@lists.lazarus.freepascal.org" target="_blank">Lazarus-es@lists.lazarus.freepascal.org</a><br>
<a href="http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es" target="_blank">http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Carlos Germán Tejero<br>