[Lazarus-es] devolver valor de un form

Carlos German Tejero german_tejero en yahoo.com.ar
Dom Jun 14 16:41:15 CEST 2009


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:

MiClase = class(TObject)
private
 FAttr:integer;
published //Published si necesitamos RTTI, sino public
 property Attr:integer read FAttr write FAtrr;
end;

Ahora si los requerimientos cambian y necesitamos tomar una accion al
asignar un valor a la propiedad simplemente hacemos:

MiClase = class(TObject)
private
 FAttr:integer;
 procedure SetAttr(AAtrr:integer);
published //Published si necesitamos RTTI, sino public
 property Attr:integer read FAttr write SetAttr;
end;

procedure MiClase.SetAttr(AAtrr:integer);
begin
  AlgunaAccion();
  FAtrr := AAtrr;
end;

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.
Saludos.

El 13 de junio de 2009 22:24, Eduardo Lopez <dar_alle en yahoo.com.ar>escribió:

> Muchas gracias por los apuntes.
> Me queda una duda. ¿Cuáles serían los riesgos  de declarar atributos
> públicos en una clase?
> Desde ya, muchas gracias.
> Eduardo.
> Carlos German Tejero escribió:
>
>> Buenas a todos, si se me permite quiciera hacer un par de comentarios con
>> respecto a esta solucion, espero sumar y no incomodar:
>>
>> 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:
>> Form := TForm.Create(nil);
>> if(Form.ShowModal = mrYes)then
>>  Algo
>> else
>>  OtraCosa
>>
>> 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:
>> private
>>  ...
>>  FArtId:integer;
>>  ...
>> pubblished
>>  ...
>>  property ArtId:integer read FArtId; //Solo lectura desde afuera
>>  ...
>>  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:
>> ...
>> Obj  := TObj.Create;
>> ...
>> Obj.Free;
>> ...
>> Obj.Algo;
>> ...
>>
>> Si utilizamos FreeAndNil este codigo jamas podria pasar funcionar.
>> Saludos.
>>
>> El 12 de junio de 2009 22:06, Eduardo Lopez <dar_alle en yahoo.com.ar<mailto:
>> dar_alle en yahoo.com.ar>> escribió:
>>
>>
>>    Hola... así lo resolví yo, quizás haya alguna forma mejor, pero
>>    esto es lo que hice:
>>
>>    En el botón que llama al Formulario de búsquedas tengo lo siguiente:
>>
>>    procedure TFormMovStock.BotonBuscaArticuloClick(Sender: TObject);
>>    begin
>>       FormBuscaArticulo := TFormBuscaArticulo.Create(nil);
>>        try
>>          FormBuscaArticulo.ShowModal;
>>        finally
>>          begin
>>            if FormBuscaArticulo.pAceptoForm then
>>               Spin_ART_ID.Value:=FormBuscaArticulo.pART_ID
>>            else Spin_ART_ID.Value:=0;
>>            FormBuscaArticulo.Free;
>>            Spin_ART_ID.SetFocus;
>>           end
>>        end;
>>    end;
>>
>>    En el formulario de búsqueda propiamente habilité dos propiedades
>>    públicas para llenarlas con la respuesta y poder "retornarlas" al
>>    llamador:
>>
>>
>>     procedure FormShow(Sender: TObject);
>>     private
>>      { private declarations }
>>     public
>>      pART_ID : Integer;
>>      pAceptoForm : Boolean;
>>
>>      { public declarations }
>>
>>
>>
>>    Obviamente en botón Seleccionar del Formulario de búsqueda indico
>>    el pART_ID marcado y pongo pAceptoForm en verdadero y cierro el
>>    formulario.
>>    El proceso llamador pregunta por los valores y finalmente destruye
>>    el formulario de búsqueda.
>>
>>    Saludos.
>>    Eduardo
>>
>>
>>    Paola Bruccoleri escribió:
>>
>>        Hola...
>>
>>        tengo un form con la lista de clientes; Quiero que se devuelva
>>        el numero de cliente cuando se salga de ese form
>>        Ese form va a ser usado desde otros forms, donde se pida como
>>        dato el cliente y haya que buscarlo. Uso para eso un
>>        editbutton, de tal forma que al hacer clic en el botoncito
>>        aparezca la ventana de busqueda, y cuando retorne, tenga el
>>        código ya escrito en el campo.
>>        En algunas épocas use una variable global con el codigo
>>        elegido, pero no me gusta nada ese sistema.
>>        He pensado en usar una variable publica de la clase
>>        TListaClientes, pero no tengo todavía muy claro como hacerlo.
>>        Alguna idea??
>>        chauuuuuuuuuuuuuu
>>
>>        =======================
>>        A/P Paola Bruccoleri Arrambide
>>        San José de Mayo - San José - URUGUAY
>>
>>        Blog: http://paolabruccoleri.reducativa.com
>>        Portal Educativo: http://www.reducativa.com.uy
>>        Wiki: http://wiki.reducativa.com
>>        Material sobre las XO:
>>
>> http://www.reducativa.com/wiki/index.php?title=Proyecto_OLPC_-_Plan_Ceibal
>>
>>        Cartillas XO Sugar 8.2:
>>
>> http://www.reducativa.com/wiki/index.php?title=Cartillas_sobre_uso_de_la_XO
>>
>>
>>
>>        _______________________________________________
>>        Lazarus-es mailing list
>>        Lazarus-es en lists.lazarus.freepascal.org
>>        <mailto:Lazarus-es en lists.lazarus.freepascal.org>
>>        http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>>
>>
>>
>>    _______________________________________________
>>    Lazarus-es mailing list
>>    Lazarus-es en lists.lazarus.freepascal.org
>>    <mailto:Lazarus-es en lists.lazarus.freepascal.org>
>>    http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>>
>>
>>
>>
>> --
>> Carlos Germán Tejero
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Lazarus-es mailing list
>> Lazarus-es en lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>>
>>
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>



-- 
Carlos Germán Tejero
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20090614/d96dd483/attachment-0002.html>


More information about the Lazarus-es mailing list