<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://documentacion.conarpesa.com.ar/index.php?action=history&amp;feed=atom&amp;title=PRG_DELPHI%2FCLASES</id>
	<title>PRG DELPHI/CLASES - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://documentacion.conarpesa.com.ar/index.php?action=history&amp;feed=atom&amp;title=PRG_DELPHI%2FCLASES"/>
	<link rel="alternate" type="text/html" href="https://documentacion.conarpesa.com.ar/index.php?title=PRG_DELPHI/CLASES&amp;action=history"/>
	<updated>2026-06-20T10:20:28Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://documentacion.conarpesa.com.ar/index.php?title=PRG_DELPHI/CLASES&amp;diff=5564&amp;oldid=prev</id>
		<title>Luciano Carou en 18:00 14 may 2025</title>
		<link rel="alternate" type="text/html" href="https://documentacion.conarpesa.com.ar/index.php?title=PRG_DELPHI/CLASES&amp;diff=5564&amp;oldid=prev"/>
		<updated>2025-05-14T18:00:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 20:00 14 may 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Línea 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Introducción=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Introducción=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:MANUAL/PROGRAMADOR]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:MANUAL/PROGRAMADOR]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:PRG DELPHI/DESARROLLO]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Las clases definen estructuras de datos (o campos), métodos (funciones y procedimientos) y propiedades (que acceden a los campos). Estas clases son solo definiciones y no se ejecutan, pero se pueden &amp;#039;instanciar&amp;#039; (crear) dentro de un software para poder inicializar sus propiedades o ejecutar sus métodos. &amp;#039;&amp;#039;&amp;#039;Al instanciar una clase estamos creando un objeto&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Las clases definen estructuras de datos (o campos), métodos (funciones y procedimientos) y propiedades (que acceden a los campos). Estas clases son solo definiciones y no se ejecutan, pero se pueden &amp;#039;instanciar&amp;#039; (crear) dentro de un software para poder inicializar sus propiedades o ejecutar sus métodos. &amp;#039;&amp;#039;&amp;#039;Al instanciar una clase estamos creando un objeto&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Luciano Carou</name></author>
	</entry>
	<entry>
		<id>https://documentacion.conarpesa.com.ar/index.php?title=PRG_DELPHI/CLASES&amp;diff=4325&amp;oldid=prev</id>
		<title>Luciano Carou: Página creada con «=Introducción= Category:MANUAL/PROGRAMADOR Las clases definen estructuras de datos (o campos), métodos (funciones y procedimientos) y propiedades (que acceden a los campos). Estas clases son solo definiciones y no se ejecutan, pero se pueden &#039;instanciar&#039; (crear) dentro de un software para poder inicializar sus propiedades o ejecutar sus métodos. &#039;&#039;&#039;Al instanciar una clase estamos creando un objeto&#039;&#039;&#039;.  Las clases a su vez pueden ser derivadas para crear nuevas…»</title>
		<link rel="alternate" type="text/html" href="https://documentacion.conarpesa.com.ar/index.php?title=PRG_DELPHI/CLASES&amp;diff=4325&amp;oldid=prev"/>
		<updated>2025-05-08T01:16:16Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «=Introducción= &lt;a href=&quot;/index.php?title=Categor%C3%ADa:MANUAL/PROGRAMADOR&quot; title=&quot;Categoría:MANUAL/PROGRAMADOR&quot;&gt;Category:MANUAL/PROGRAMADOR&lt;/a&gt; Las clases definen estructuras de datos (o campos), métodos (funciones y procedimientos) y propiedades (que acceden a los campos). Estas clases son solo definiciones y no se ejecutan, pero se pueden &amp;#039;instanciar&amp;#039; (crear) dentro de un software para poder inicializar sus propiedades o ejecutar sus métodos. &amp;#039;&amp;#039;&amp;#039;Al instanciar una clase estamos creando un objeto&amp;#039;&amp;#039;&amp;#039;.  Las clases a su vez pueden ser derivadas para crear nuevas…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducción=&lt;br /&gt;
[[Category:MANUAL/PROGRAMADOR]]&lt;br /&gt;
Las clases definen estructuras de datos (o campos), métodos (funciones y procedimientos) y propiedades (que acceden a los campos). Estas clases son solo definiciones y no se ejecutan, pero se pueden &amp;#039;instanciar&amp;#039; (crear) dentro de un software para poder inicializar sus propiedades o ejecutar sus métodos. &amp;#039;&amp;#039;&amp;#039;Al instanciar una clase estamos creando un objeto&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Las clases a su vez pueden ser derivadas para crear nuevas clases que heredan todas las propiedades y métodos definidos (similar a lo presentado en *[https://www.youtube.com/watch?v=IDIRiuOSwzs Crear una clase para derivar]).&lt;br /&gt;
&lt;br /&gt;
Delphi usa Object Pascal, que es un Pascal orientado a objetos, como lenguaje de programación.&lt;br /&gt;
&lt;br /&gt;
La aplicación de Pragma está construida con distintas clases, muchas de Delphi, y muchas desarrolladas específicamente.&lt;br /&gt;
&lt;br /&gt;
(Ver [https://docwiki.embarcadero.com/RADStudio/Sydney/en/Classes_and_Objects_(Delphi)#:~:text=A%20class%2C%20or%20class%20type,is%20part%20of%20an%20object. Clases y objetos en Delphi]).&lt;br /&gt;
&lt;br /&gt;
Los métodos y propiedades tienen distintos grados de visibilidad desde otros objetos:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;private&amp;#039;&amp;#039;&amp;#039; (o privado) solo pueden consultarse o ejecutarse dentro de la misma clase.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;protected&amp;#039;&amp;#039;&amp;#039; (o protegido) solo pueden consultarse o ejecutarse dentro de la misma clase o sus derivadas.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;public&amp;#039;&amp;#039;&amp;#039; (o pública) pueden consultarse o ejecutarse desde cualquier objeto.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;published&amp;#039;&amp;#039;&amp;#039; (o publicadas) se usan en los inspectores de objetos de Delphi (aplica a los componentes visuales (o controles), más sobre esto más adelante).&lt;br /&gt;
&lt;br /&gt;
=Clase de ejemplo=&lt;br /&gt;
Como ayuda para comprender la estructura y funcionamiento de las clases he creado una llamada TPersona, que representaría (de una manera muy básica) a una persona. El código completo es:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unit Persona;&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
  SysUtils, Classes;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
  TPersona = class(TComponent)&lt;br /&gt;
  private&lt;br /&gt;
    { Declaraciones privadas }&lt;br /&gt;
&lt;br /&gt;
    FDocumento: String;&lt;br /&gt;
    FApellido: String;&lt;br /&gt;
    FNombre: String;&lt;br /&gt;
  protected&lt;br /&gt;
    { Declaraciones protegidas }&lt;br /&gt;
  public&lt;br /&gt;
    { Declaraciones públicas }&lt;br /&gt;
&lt;br /&gt;
    constructor Create(AOwner: TComponent); override;&lt;br /&gt;
    destructor  Destroy; override;&lt;br /&gt;
    procedure   Loaded; override;&lt;br /&gt;
&lt;br /&gt;
    property    Documento: String read FDocumento write FDocumento;&lt;br /&gt;
    property    Apellido: String read FApellido write FApellido;&lt;br /&gt;
    property    Nombre: String read FNombre write FNombre;&lt;br /&gt;
&lt;br /&gt;
    function    Cargar(aDocumento: String): Boolean;&lt;br /&gt;
    function    Grabar: Boolean;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
procedure Register;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
constructor TPersona.Create(AOwner: TComponent);&lt;br /&gt;
begin&lt;br /&gt;
  inherited Create(AOwner);&lt;br /&gt;
&lt;br /&gt;
  if csDesigning in ComponentState = False then&lt;br /&gt;
     begin&lt;br /&gt;
     { Programación ejecutada al crear el objeto... }&lt;br /&gt;
     end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
destructor TPersona.Destroy;&lt;br /&gt;
begin&lt;br /&gt;
  if csDesigning in ComponentState = False then&lt;br /&gt;
     begin&lt;br /&gt;
     { Programación ejecutada al destruir el objeto... }&lt;br /&gt;
     end;&lt;br /&gt;
&lt;br /&gt;
  inherited Destroy;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TPersona.Loaded;&lt;br /&gt;
begin&lt;br /&gt;
  inherited Loaded;&lt;br /&gt;
&lt;br /&gt;
  if csDesigning in ComponentState = False then&lt;br /&gt;
     begin&lt;br /&gt;
     { Programación ejecutada al instanciarse la pantalla en la que reside el componente... }&lt;br /&gt;
     end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TPersona.Cargar(aDocumento: String): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := True;&lt;br /&gt;
&lt;br /&gt;
  { Cargamos los datos del documento indicado de la base de datos e inicializamos &lt;br /&gt;
    las propiedades Apellido y Nombre...&lt;br /&gt;
&lt;br /&gt;
    Si encontramos el registro retornamos true, sino retornamos False...&lt;br /&gt;
  }  &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TPersona.Grabar: Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := True;&lt;br /&gt;
&lt;br /&gt;
  { Grabamos los datos Documento, Apellido y Nombre en la base de datos, si &lt;br /&gt;
    tuvimos éxito retornamos True, sino retornamos False...&lt;br /&gt;
  }    &lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure Register;&lt;br /&gt;
begin&lt;br /&gt;
  RegisterComponents(&amp;#039;prxStandard&amp;#039;, [TPersona]);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Partes básicas==&lt;br /&gt;
===unit===&lt;br /&gt;
Indica el nombre del archivo en el que se encuentra definida la clase, en este caso el archivo se llama Persona. La extensión de los archivos pascal es &amp;quot;.pas&amp;quot;, es decir que el archivo completo sería Persona.pas.&lt;br /&gt;
&lt;br /&gt;
===interface===&lt;br /&gt;
Indica que lo que sigue es la denominada interfaz de la clase, que es su definición, pero no su implementación. Definimos las propiedades y funciones que tiene la clase, pero la programación de éstas la dejamos para más adelante, para la sección de implementación.&lt;br /&gt;
&lt;br /&gt;
===uses===&lt;br /&gt;
La clase puede usar la definición de otras clases o archivos. Esos archivos se listan en esta sección, aunque también se pueden listar después de la palabra clave &amp;#039;&amp;#039;&amp;#039;implementation&amp;#039;&amp;#039;&amp;#039;, también usando &amp;#039;&amp;#039;&amp;#039;uses&amp;#039;&amp;#039;&amp;#039;. En este caso la clase usa dos archivos con funcionalidad de Delphi llamados SysUtils y Classes.&lt;br /&gt;
&lt;br /&gt;
===Register===&lt;br /&gt;
La función Register sirve para registrar el componente en la paleta de Delphi, por ahora no es importante.&lt;br /&gt;
&lt;br /&gt;
===implementation===&lt;br /&gt;
Indica que lo que sigue es la implementación de la clase, es decir toda la programación de las propiedades y métodos.&lt;br /&gt;
&lt;br /&gt;
=Interfaz de la clase=&lt;br /&gt;
En esta sección analizamos la interfaz de la clase que es la siguiente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TPersona = class(TComponent)&lt;br /&gt;
  private&lt;br /&gt;
    { Declaraciones privadas }&lt;br /&gt;
&lt;br /&gt;
    FDocumento: String;&lt;br /&gt;
    FApellido: String;&lt;br /&gt;
    FNombre: String;&lt;br /&gt;
  protected&lt;br /&gt;
    { Declaraciones protegidas }&lt;br /&gt;
  public&lt;br /&gt;
    { Declaraciones públicas }&lt;br /&gt;
&lt;br /&gt;
    constructor Create(AOwner: TComponent); override;&lt;br /&gt;
    destructor  Destroy; override;&lt;br /&gt;
    procedure   Loaded; override;&lt;br /&gt;
&lt;br /&gt;
    property    Documento: String read FDocumento write FDocumento;&lt;br /&gt;
    property    Apellido: String read FApellido write FApellido;&lt;br /&gt;
    property    Nombre: String read FNombre write FNombre;&lt;br /&gt;
&lt;br /&gt;
    function    Cargar(aDocumento: String): Boolean;&lt;br /&gt;
    function    Grabar: Boolean;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===type===&lt;br /&gt;
Es una palabra clave que indica que lo que sigue es el nombre de la clase, en este caso la clase se llama &amp;#039;&amp;#039;&amp;#039;TPersona&amp;#039;&amp;#039;&amp;#039; y el texto &amp;#039;&amp;#039;&amp;#039;class(TComponent)&amp;#039;&amp;#039;&amp;#039; indica que deriva de la clase TComponent de Delphi. Las clases pueden derivar de otras heredando todas sus propiedades y funcionalidad.&lt;br /&gt;
&lt;br /&gt;
TComponent es una clase de Delphi que tiene todo lo necesario para definir un componente, su jerarquía (el gráfico es informativo) es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:20250506 1503 JERARQUIA CLASES DELPHI.png|miniaturadeimagen|no|Jerarquía de clases de Delphi]]&lt;br /&gt;
&lt;br /&gt;
===private===&lt;br /&gt;
Define las propiedades o métodos privados, aquellos que solo son visibles desde la misma clase. En este caso definimos tres variables para guardar el documento, el apellido y el nombre. Estas se corresponden con posiciones de memoria donde se guardarán strings. En un momento definiremos métodos de acceso a estas variables en la sección &amp;#039;&amp;#039;&amp;#039;public&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
===protected===&lt;br /&gt;
Define propiedades y métodos que son visibles dentro de la clase y de sus derivadas, en este caso no hemos definido nada.&lt;br /&gt;
&lt;br /&gt;
===public===&lt;br /&gt;
Define propiedades y métodos visibles a todas las clases que interactúan con esta.&lt;br /&gt;
&lt;br /&gt;
En esta sección definimos primero tres funciones:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
constructor Create(AOwner: TComponent); override;&lt;br /&gt;
destructor  Destroy; override;&lt;br /&gt;
procedure   Loaded; override;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El &amp;#039;&amp;#039;&amp;#039;constructor Create&amp;#039;&amp;#039;&amp;#039; es una función especial que se ejecuta cuando creamos el objeto, el &amp;#039;&amp;#039;&amp;#039;destructor Destroy&amp;#039;&amp;#039;&amp;#039; se ejecuta cuando el objeto es destruido (cuando se libera la memoria que lo guardaba) y el &amp;#039;&amp;#039;&amp;#039;procedimiento Loaded&amp;#039;&amp;#039;&amp;#039; se ejecuta en aquellos objetos que &amp;#039;viven&amp;#039; dentro de una pantalla (por ejemplo, un botón) cuando esa pantalla es instanciada.&lt;br /&gt;
&lt;br /&gt;
Notar que estas funciones tienen la, palabra clave &amp;#039;&amp;#039;&amp;#039;override&amp;#039;&amp;#039;&amp;#039; a derecha indicando que extienden la función de los ancestros. Si no agregáramos &amp;#039;&amp;#039;&amp;#039;override&amp;#039;&amp;#039;&amp;#039; estas funciones solo ejecutarán el código existente en esta clase.&lt;br /&gt;
&lt;br /&gt;
Estas funciones provienen de la clase ancestro que es TComponent.&lt;br /&gt;
&lt;br /&gt;
También definimos 3 propiedades que acceden a las variables de la sección &amp;#039;&amp;#039;&amp;#039;private&amp;#039;&amp;#039;&amp;#039;, por ejemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
property    Documento: String read FDocumento write FDocumento;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí definimos una propiedad llamada &amp;#039;&amp;#039;&amp;#039;Documento&amp;#039;&amp;#039;&amp;#039; que es visible a otros objetos, indicamos que es de tipo String y que accede a la variable FDocumento que hemos definido en &amp;#039;&amp;#039;&amp;#039;private&amp;#039;&amp;#039;&amp;#039;. de este modo publicamos la propiedad &amp;#039;&amp;#039;&amp;#039;Documento&amp;#039;&amp;#039;&amp;#039; para que todos accedan a la variable FDocumento (que es privada a la clase e inaccesible a otras clases).&lt;br /&gt;
&lt;br /&gt;
Podríamos haber definido directamente el código de abajo en la sección púlica pero más adelante veremos que estos métodos (getters y setters según su nombre en inglés) pueden ser muy convenientes además de crear una programación prolija.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FDocumento: String;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente declaramos dos funciones más:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function    Cargar(aDocumento: String): Boolean;&lt;br /&gt;
function    Grabar: Boolean;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que usaremos para recuperar los datos de la persona de la base de datos, y para grabarlos posteriormente.&lt;br /&gt;
&lt;br /&gt;
=Implementación de la clase=&lt;br /&gt;
A partir de la palabra clave &amp;#039;&amp;#039;&amp;#039;implementation&amp;#039;&amp;#039;&amp;#039; podemos escribir el código de la clase.&lt;br /&gt;
&lt;br /&gt;
Los objetos deben crearse para ser usados, y es buena práctica destruirlos cuando ya no los necesitamos más.&lt;br /&gt;
&lt;br /&gt;
===constructor Create===&lt;br /&gt;
El constructor Create se ejecuta cuando se instancia esta clase creando un objeto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
constructor TPersona.Create(AOwner: TComponent);&lt;br /&gt;
begin&lt;br /&gt;
  inherited Create(AOwner);&lt;br /&gt;
&lt;br /&gt;
  if csDesigning in ComponentState = False then&lt;br /&gt;
     begin&lt;br /&gt;
     { Programación ejecutada al crear el objeto... }&lt;br /&gt;
     end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recibe como argumento la referencia al objeto que lo está creando (AOwner: TComponent), el objeto creado le pertenece a quién lo creó. Si eliminamos el objeto que lo creó éste también será eliminado.&lt;br /&gt;
&lt;br /&gt;
Lo primero que se ejecuta en esta función es el Create del ancestro, es habitual que en clases derivadas cada una de ellas haga algo específico en cada función.&lt;br /&gt;
&lt;br /&gt;
Luego podemos agregar el código que necesitemos, por ejemplo, inicializar algunas variables.&lt;br /&gt;
&lt;br /&gt;
El texto &amp;#039;&amp;#039;&amp;#039;if csDesigning in ComponentState = False then&amp;#039;&amp;#039;&amp;#039; indica a Delphi que no ejecute ese código cuando estamos en diseño que es la etapa en la que en Delphi armamos las pantallas.&lt;br /&gt;
&lt;br /&gt;
===Cómo crear un objeto desde una clase===&lt;br /&gt;
Para crear un objeto usaremos un código muy similar al de abajo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var&lt;br /&gt;
  Persona: TPersona;&lt;br /&gt;
begin&lt;br /&gt;
  Persona := TPersona.Create(Self);&lt;br /&gt;
&lt;br /&gt;
  { Ahora podemos usar persona, por ejemplo llamar a la función Cargar }&lt;br /&gt;
&lt;br /&gt;
  Persona.Cargar(&amp;#039;1234&amp;#039;);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definimos una variable &amp;#039;&amp;#039;&amp;#039;Persona&amp;#039;&amp;#039;&amp;#039; de tipo &amp;#039;&amp;#039;&amp;#039;TPersona&amp;#039;&amp;#039;&amp;#039;&amp;#039;, similar a cuando definimos una variable de tipo entero, fecha, caracteres, etc.&lt;br /&gt;
&lt;br /&gt;
Luego asignamos a esa variable (en Pascal el &amp;#039;&amp;#039;&amp;#039;:=&amp;#039;&amp;#039;&amp;#039; es asignación) el texto &amp;#039;&amp;#039;&amp;#039;TPersona.Create(Self)&amp;#039;&amp;#039;&amp;#039; que indica que estamos creando una instancia de la clase TPersona e indicamos que el dueño es el mismo objeto (Self) que lo está creando.&lt;br /&gt;
&lt;br /&gt;
Finalmente podemos acceder a las propiedades y métodos de la clase, por ejemplo, para cargar el documento &amp;#039;1234&amp;#039;. En Pascal las llaves {} contienen comentarios.&lt;br /&gt;
&lt;br /&gt;
===destructor Destroy===&lt;br /&gt;
El destructor Destroy se ejecuta cuando liberamos la memoria asignada a un objeto:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
destructor TPersona.Destroy;&lt;br /&gt;
begin&lt;br /&gt;
  if csDesigning in ComponentState = False then&lt;br /&gt;
     begin&lt;br /&gt;
     { Programación ejecutada al destruir el objeto... }&lt;br /&gt;
     end;&lt;br /&gt;
&lt;br /&gt;
  inherited Destroy;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En los destructores la llamada al &amp;#039;&amp;#039;&amp;#039;inherited&amp;#039;&amp;#039;&amp;#039; se hace al final de modo que podamos hacer cualquier limpieza que necesitemos antes de ir a los ancestros.&lt;br /&gt;
&lt;br /&gt;
El resto es bastante directo, no requiere argumentos ya que estamos haciendo referencia al objeto que creamos originalmente.&lt;br /&gt;
&lt;br /&gt;
===Cómo destruir un objeto===&lt;br /&gt;
Para destruir un objeto usaremos un código muy similar al de abajo usando la propiedad que usamos en el Create:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
begin&lt;br /&gt;
  Persona.Free;&lt;br /&gt;
  Persona := nil;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con el procedimiento &amp;#039;&amp;#039;&amp;#039;Free&amp;#039;&amp;#039;&amp;#039; (que todo objeto define) eliminamos ese objeto.&lt;br /&gt;
&lt;br /&gt;
Finalmente puede ser buena práctica asignar &amp;#039;&amp;#039;&amp;#039;nil&amp;#039;&amp;#039;&amp;#039; (valor nulo) a la variable.&lt;br /&gt;
&lt;br /&gt;
Con esto habremos eliminado el objeto.&lt;br /&gt;
&lt;br /&gt;
===procedimiento Loaded===&lt;br /&gt;
Se ejecuta en aquellos componentes (en realidad serían controles) que están pegados a una pantalla justo en el momento en que se instancia esa pantalla, veremos más sobre esto cuando veamos las pantallas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
procedure TPersona.Loaded;&lt;br /&gt;
begin&lt;br /&gt;
  inherited Loaded;&lt;br /&gt;
&lt;br /&gt;
  if csDesigning in ComponentState = False then&lt;br /&gt;
     begin&lt;br /&gt;
     { Programación ejecutada al instanciarse la pantalla en la que reside el componente... }&lt;br /&gt;
     end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El procedimiento es similar a los anteriores, el inherited se ejecuta al inicio.&lt;br /&gt;
&lt;br /&gt;
===función Cargar===&lt;br /&gt;
La función &amp;#039;&amp;#039;&amp;#039;Cargar&amp;#039;&amp;#039;&amp;#039; es propia de esta clase (no proviene del ancestro) y serviría para cargar los datos de la persona según el documento recibido como argumento.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function TPersona.Cargar(aDocumento: String): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := True;&lt;br /&gt;
&lt;br /&gt;
  { Cargamos los datos del documento indicado de la base de datos e inicializamos&lt;br /&gt;
    las propiedades Apellido y Nombre...&lt;br /&gt;
&lt;br /&gt;
    Si encontramos el registro retornamos true, sino retornamos False...&lt;br /&gt;
  }&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definimos que la función retorna un &amp;#039;&amp;#039;&amp;#039;Boolean&amp;#039;&amp;#039;&amp;#039; por lo que deberíamos usar un valor de retorno que sea:&lt;br /&gt;
*Result := True;&lt;br /&gt;
*o Result := False;&lt;br /&gt;
&lt;br /&gt;
En este caso seguramente retornaríamos True si encontramos ese documento en la base de datos, o False si no lo encontramos.&lt;br /&gt;
&lt;br /&gt;
Como comentarios la función indica que podríamos asignar los valores de la base de datos a las propiedades de la clase (Apellido y Nombre).&lt;br /&gt;
&lt;br /&gt;
===función Grabar===&lt;br /&gt;
La función &amp;#039;&amp;#039;&amp;#039;Grabar&amp;#039;&amp;#039;&amp;#039; también es propia de esta clase y serviría para guardar los datos de la persona en la base de datos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function TPersona.Grabar: Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := True;&lt;br /&gt;
&lt;br /&gt;
  { Grabamos los datos Documento, Apellido y Nombre en la base de datos, si&lt;br /&gt;
    tuvimos éxito retornamos True, sino retornamos False...&lt;br /&gt;
  }&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definimos que la función retorna un &amp;#039;&amp;#039;&amp;#039;Boolean&amp;#039;&amp;#039;&amp;#039; por lo que deberíamos usar un valor de retorno que sea:&lt;br /&gt;
*Result := True;&lt;br /&gt;
*o Result := False;&lt;br /&gt;
&lt;br /&gt;
En este caso seguramente retornaríamos True si pudimos grabar el registro exitosamente, o False si no pudimos.&lt;br /&gt;
&lt;br /&gt;
=Modificar los métodos de acceso a la variable FDocumento=&lt;br /&gt;
En la interfaz original definimos Documento de la siguiente manera, accediendo directamente a la variable FDocumento:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
type&lt;br /&gt;
  TPersona = class(TComponent)&lt;br /&gt;
  private&lt;br /&gt;
    { Declaraciones privadas }&lt;br /&gt;
&lt;br /&gt;
    FDocumento: String;&lt;br /&gt;
  public&lt;br /&gt;
    { Declaraciones públicas }&lt;br /&gt;
&lt;br /&gt;
    property    Documento: String read FDocumento write FDocumento;&lt;br /&gt;
  end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pero podríamos mejorar esto de la siguiente manera, primero tenemos que definir un procedimiento similar a:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
procedure TPersona.DocumentoSet(aDocumento: String);&lt;br /&gt;
begin&lt;br /&gt;
  { Primero seteamos la variable privada al valor informado... }&lt;br /&gt;
&lt;br /&gt;
  FDocumento := aDocumento;&lt;br /&gt;
&lt;br /&gt;
  { Intentamos cargar el registro que tenga ese documento, si tenemos éxito&lt;br /&gt;
    inicializamos las otras variables... }&lt;br /&gt;
&lt;br /&gt;
  if Cargar(FDocumento) then&lt;br /&gt;
     begin&lt;br /&gt;
       ;&lt;br /&gt;
     end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde recibimos un argumento exactamente del mismo tipo que la variable FDocumento. Dentro del procedimiento tenemos que asignar el valor del argumento a la variable privada FDocumento. Luego podemos hacer cualquier otra cosa, por ejemplo, llamar al procedimiento Cargar.&lt;br /&gt;
&lt;br /&gt;
El interfaz lo definimos como &amp;#039;&amp;#039;&amp;#039;protected&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  protected&lt;br /&gt;
    { Declaraciones protegidas }&lt;br /&gt;
&lt;br /&gt;
    procedure DocumentoSet(aDocumento: String);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego tenemos que modificar la declaración de la propiedad Documento de la siguiente manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
property    Documento: String read FDocumento write DocumentoSet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esto estamos asociando la operación de escritura de la propiedad Documento directamente al procedimiento DocumentoSet por lo que cuando asignen un valor a la propiedad Documento, por ejemplo, usando &amp;#039;&amp;#039;&amp;#039;Persona.Documento := &amp;#039;1234&amp;#039;&amp;#039;&amp;#039;&amp;#039; la propiedad va a llamar directamente al procedimiento DocumentoSet completando el argumento con ese valor y procederá según la definición del procedimiento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 1px solid red; background-color: #ffcccc; padding: 1px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;  Sugerencia:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  - Por ejemplo, en una clase de &amp;#039;&amp;#039;&amp;#039;automovil&amp;#039;&amp;#039;&amp;#039; podriamos tener una propiedad llamada &amp;#039;&amp;#039;&amp;#039;encendido&amp;#039;&amp;#039;&amp;#039; que se setee en un procedimiento que haga todo lo necesario para que el automóvil se encienda, y además setee el valor de esa propiedad según el estado del auto.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Luciano Carou</name></author>
	</entry>
</feed>