Curso Delphi. Lección 04B  

Send By: Ariel Bustamante
Web : N.A.
Email: N.A.
Date: 30/12/02

Tip accessed 1333 times

 


 


Debajo de las Labels coloca dos Panels:



















TPanel


Nombre


Width


Panel2


PanelTipo


180

Panel3 PanelTamano 60

 


Borra los Captions de los dos Panels. Centra las Labels armónicamente
encima de los Panels.

Vamos a el procedure TFPrincipal.CBNegritaClick(Sender: TObject); de la Unit,
allí te vas al final del mismo y debajo de: CBNormal.Checked := False;
escribes:



   PanelTipo.Caption := 'Negrita';
   PanelTipo.Font.Style := [fsBold]


Aquí estamos construyendo un panel de información, donde el usuario
tendrá presente siempre que tipos de atributos está usando.

Con la primera línea se lo escribimos en el Caption del Panel y la segunda
línea "manda" escribir a la primera en ese tipo de letra.

Ya puedes agregar los eventos a los CheckBox restantes.

Ahorra tiempo, copia estas dos líneas y pégalas en el lugar correspondiente
en los demás CheckBox, luego modificas el texto entre llaves y el texto
del Caption y ya está.

Si tienes algún problema consulta el texto de la Unit del final de la
lección.

Ahora en la Unit busca: procedure TFPrincipal.RB12Click(Sender: TObject); y
debajo de la única sintaxis escrita pones:



   PanelTamano.Caption := '12';
   PanelTamano.Font.Size := 12;


Lo mismo que en el evento anterior informamos y cambiamos el tamaño
del texto. Procede con los demás RadioButtons como lo has hecho anteriormente
con los CheckBox.

Ejecuta el proyecto prueba las innovaciones realizadas y observa que a esto
le falta algo para redondearlo, eso es que los Panels aparecen vacíos
al arrancar la aplicación.

Tendríamos que volver a diseño y agregar unas líneas en
el Evento/OnActivate de la Form. Dado que la aplicación arrancará
con la letra Normal y el tamaño 12 por Defecto, esos

serían los Captions de los dos Panels al ejecutar el programa, para ello
deberíamos poner los eventos que hemos agregado en el CBNormal y en el
RB12,debajo de: Memo1.SetFocus; escribes:




   PanelTamano.Caption := '12';
   PanelTamano.Font.Size := 12;
   CBNormal.Checked := True;


Indicamos que al activarse la Form el Caption del PanelTamano diga 12 y que
el tamaño de la fuente del Caption sea 12 y para que el PanelTipo nos
ponga en su Caption "Normal", no necesitamos mas que activar este
CheckBox poniendo su Propiedad Checked a True y listo, el CheckBox hará
la tarea por nosotros.



BLOQUE DE TEORIA




PROGRAMACION ORIENTADA A OBJETOS




Rollo del Radikal:


Hasta ahora, Ariel se ha empleado a gusto dándote a conocer un poco
el IDE de Delphi y el manejo en general de las propiedades y eventos de algunos
de los componentes más usuales de la paleta de Delphi.

Creo que se tercia una pequeña explicación acerca de este lío
de propiedades, eventos y métodos ¿no crees?, por lo menos para
poder continuar a gusto con el curso.


Una de las grandes ventajas de Delphi radica en que el lenguaje es orientado
a objetos, y otra que es un entorno de desarrollo rápido.

Así, habrás podido comprobar que con sólo depositar un
TMemo en tu form tienes a tu disposición un editor de texto digamos 'basico'
sin haber programado de él ni una sola línea.

Esta abstracción nos permite reutilizar código tratandolo desde
fuera, como si de cajas negras se tratase...

Por ejemplo, imaginate un automovil como si de una caja negra se tratase. Nosotros
no somos ni mecánicos ni ingenieros, así que ni siquiera tenemos
ganas de mirar debajo del capó... simplemente nos limitamos a usarlo
utilizando los mandos que los ingenieros pusieron a tal efecto (volante, acelerador,
etc...).

Por supuesto, según vayamos subiendo nuestro nivel, puede que nos apetezca
ver que hay detrás del pedal del acelerador... pero mucha gente se quedará
ahí simpelmente como conductor.



Imaginate: simplemente necesitamos un boton... pues nada lo plantamos en la
form y él se encarga de mostrar el caption, de ser 'pulsable' de admitir
el foco cuando vamos pulsando el Tab, etc, etc...

Muchos de estas 'cajas negras' que trae Delphi no son más que implementaciones
que los señores de Borland han hecho de las utilidades que los señores
de Microsoft incluyeron en Windows.

Aquellos que han programado en C++ y demás entornos no visuales, saben
lo que cuestra el simple hecho de hacer aparecer un boton en una form... dado
que lo tienen que hacer todo 'a pelo'.



A este respecto, de momento nos vendría bien saber una cosillas:


Las propiedades:

Para especificar ciertas caracteristicas de nuestras 'cajas negras' los creadores
de las mismas se encargan de definir estas propiedades, de tal forma que variándolas,
el código interno del objeto hará con ellas lo que tenga que hacer.
Por ejemplo, en una TLabel, si queremos que cambie el texto que muestra no tendremos
más que asignarle el valor mediante la propiedad Caption, es decir, algo
así como:



   Label1.Caption:='Este es el nuevo texto';


Los métodos:

Claro, no sólo tenemos que poder variar el aspecto o las propiedades
de la caja negra, sino que tenemos que tener alguna forma de decirle a la caja
negra que realice una determianda acción.

Por ejemplo, en un TMemo, podemos necesitar borrar el texto, o añadir
una linea, o que se yo...

Bien, para esto se utilizan los métodos que los 'creadores' de la caja
negra nos proporcionaron a la hora de diseñarla.

Por ejemplo, si ejecutamos el método Clear de un TMemo (Por ejemplo,
Memo1.Clear;) el código interno programado en el componente TMemo para
ese método se encargará de borrar el texto que el Memo contuviera.



Los eventos:

¿Que pasa si la caja negra tiene que avisarnos de algo?, por ejemplo,
un boton nos tendrá que avisar de alguna forma que el usuario lo ha pulsado
¿no crees?.

Bien, en estos casos, el instrumento utilizado para ello no es más que
un evento.

El evento, al producirse, hace que la caja negra 'lance' o ejecute el manejador
de ese evento (en el caso de que nosotros lo hayamos definido).

Por ejemplo, tenemos un TButton llamado Button1; el usurio lo pulsa, asi que
el propio boton mira a ver si nosotros hemos asignado algo al evento OnClick.
Si es así, él lo ejecuta, si no es asi pues no hará nada
con ese evento.


Resumiendo:

Las propiedades se equiparan a las 'Variables' de la programación
tradicional, los métodos a las funciones y procedures que nosotros ejecutaremos
y los eventos a los métodos y funciones que el propio objeto ejecutará
ante alguna circunstancia determinada (es decir, ante algun evento). (Eso si,
con reservas, pero como esquema ideológico es válido).




Casi todos los elementos del entorno son objetos, algunos predefinidos y otros
que se van definiendo a medida que avanzamos en el diseño del proyecto.


La Form, el Button etc., son objetos que poseen una serie de características
propias, el programador va alterando las propiedades necesarias para adaptar
el objeto a sus necesidades.

Por ejemplo el Button hereda todas sus cualidades de las predefinidas en el
componente original TButton, a partir de aquí el programador puede modificarlas
según su necesidad.

Un componente es un objeto que puede ser utilizado de diferentes maneras y en
distintos proyectos.


NOTA DEL AUTOR


Hasta aquí hemos trabajado con proyectos que si bien no tienen aplicación
ninguna como programa en sí, nos han servido para conocer casi todos
los componentes de la Paleta Standard, la mayoría de las propiedades
de los mismos, varios eventos y sus códigos.

En dos de las tres lecciones prácticas, hemos usado el componente Memo
para dar salida a los eventos de los diferentes botones, de hecho en nuestra
próxima lección construiremos una

aplicación completa con RichEdit que es muy similar al Memo, no quiere
decir esto que Delphi no sirva para otra cosa que no sea diseñar editores
de texto, simplemente esto es así porque los editores son los proyectos
más fáciles de encarar por un/a recién iniciado/a.

Para "comerte el coco" ya llegarán las prácticas con
Base de Datos.

Aunque no lo sé a ciencia cierta porque los construyo al mismo tiempo
que tú (eso sí, los planeo con tiempo), el nuevo proyecto quizás
nos tome dos lecciones concluirlo pues utilizaremos más de cinco Forms,
constará también de una carátula (primera pantalla) de
un buen valor estético, nos pedirá un password para entrar en
la aplicación, tendrá un archivo de ayuda muy intuitivo, utilizaremos
un componente que aún nos queda pendiente de la Paleta Standard como
es el MainMenú, conoceremos los mensajes de diálogos, el Timer
y toda la tarea realizada en esta lección,

la realizaremos con un solo evento utilizando el componente FontDialog; en fin,
esto y algo más para acabar diseñando un Editor de Textos que
supongo te servirá de mucho.

Dado el nivel adquirido hasta aquí, te aconsejaría que comiences
a diseñar tus propios proyectos con los componentes que ya conoces y
que no tienen por qué realizar las mismas funciones que les hemos encomendado
en nuestras lecciones.

Anímate y si te surgen dudas consúltalas en el Pide tu Truco de
Trucomanía que Radikal y yo estaremos ahí para darte una mano.


Ariel Bustamante para Trucomanía


A continuación el código fuente de lo realizado.



 unit Main;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, ExtCtrls;

 type
   TFPrincipal = class(TForm)
     BCerrar: TButton;
     Memo1: TMemo;
     Panel1: TPanel;
     CBNegrita: TCheckBox;
     CBCursiva: TCheckBox;
     CBsubrayada: TCheckBox;
     CBTachada: TCheckBox;
     CBNormal: TCheckBox;
     Label1: TLabel;
     GroupBox1: TGroupBox;
     RB12: TRadioButton;
     RB16: TRadioButton;
     RB20: TRadioButton;
     RB24: TRadioButton;
     ComboBox1: TComboBox;
     EditNombre: TEdit;
     PanelUsuario: TPanel;
     LNombre: TLabel;
     LabelTipo: TLabel;
     LabelTamano: TLabel;
     PanelTipo: TPanel;
     PanelTamano: TPanel;
     procedure BCerrarClick(Sender: TObject);
     procedure CBNegritaClick(Sender: TObject);
     procedure CBCursivaClick(Sender: TObject);
     procedure CBsubrayadaClick(Sender: TObject);
     procedure CBTachadaClick(Sender: TObject);
     procedure CBNormalClick(Sender: TObject);
     procedure FormActivate(Sender: TObject);
     procedure RB12Click(Sender: TObject);
     procedure RB16Click(Sender: TObject);
     procedure RB20Click(Sender: TObject);
     procedure RB24Click(Sender: TObject);
     procedure ComboBox1Change(Sender: TObject);
     procedure EditNombreChange(Sender: TObject);


   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   FPrincipal: TFPrincipal;
   Estilo: TFontStyles;

 implementation

 {$R *.DFM}

 procedure TFPrincipal.BCerrarClick(Sender: TObject);
 begin
 Close;
 end;


 procedure TFPrincipal.CBNegritaClick(Sender: TObject);
 begin
        if                    // si condicional en inglés
   CBnegrita.Checked          //el CBNegrita está seleccionado
         then                 //entonces
    Include(Estilo, fsBold)   //incluya el estilo negrita
         else                // si no (está)
    Exclude(Estilo, fsBold);   //excluya el estilo negrita
    Memo1.Font.Style := Estilo; // que el estilo de fuente de Memo1 sea igual a
                                // la variable Estilo que en este caso es
                                // fsBold

     //ahora viene otro condicional

     if                      //si
   Memo1.Font.Style = [ ]     // el estilo de fuente de Memo1 es Normal
                             // las llaves vacías así lo indican
     then                    // entonces
  CBNormal.Checked := True   // que el CBNormal esté seleccionado
    else                     // si no
  CBNormal.Checked := False;  // que el CBNormal esté deseleccionado
  PanelTipo.Caption := 'Negrita';
  PanelTipo.Font.Style := [fsBold];
 end;

 procedure TFPrincipal.CBCursivaClick(Sender: TObject);
 begin
  if   CBCursiva.Checked     then
   Include(Estilo, fsItalic)
  else
    Exclude(Estilo, fsItalic);
    Memo1.Font.Style := Estilo;

  if Memo1.Font.Style = [ ]
  then
  CBNormal.Checked := True
  else
  CBNormal.Checked := False;
  PanelTipo.Caption := 'Cursiva';
  PanelTipo.Font.Style := [fsItalic];
 end;



 procedure TFPrincipal.CBsubrayadaClick(Sender: TObject);
 begin
 if   CBSubrayada.Checked     then
   Include(Estilo, fsUnderline)
  else
    Exclude(Estilo, fsUnderline);
    Memo1.Font.Style := Estilo;

    if Memo1.Font.Style = [ ]
  then
  CBNormal.Checked := True
  else
  CBNormal.Checked := False;
  PanelTipo.Caption := 'Subrayada';
  PanelTipo.Font.Style := [fsUnderline];
 end;

 procedure TFPrincipal.CBTachadaClick(Sender: TObject);
 begin
 if   CBTachada.Checked     then
   Include(Estilo, fsStrikeOut)
  else
    Exclude(Estilo, fsStrikeOut);
    Memo1.Font.Style := Estilo;

  if Memo1.Font.Style = [ ]
  then
  CBNormal.Checked := True
  else
  CBNormal.Checked := False;
  PanelTipo.Caption := 'Tachada';
  PanelTipo.Font.Style := [fsStrikeOut];
 end;

 procedure TFPrincipal.CBNormalClick(Sender: TObject);
 begin
   if CBNormal.Checked then       // si CBNormal está seleccionado entonces
     Estilo := [ ];              // el estilo es las llaves vacías -quita todos los atributos-
   Memo1.Font.Style := Estilo;     // el Memo1 recoge ese estilo
      //y a continuación desactivamos todas las casillas que estuvieren activadas
   CBNegrita.Checked := False;
   CBCursiva.Checked := False;
   CBSubrayada.Checked := False;
   CBTachada.Checked := False;
   PanelTipo.Caption := 'Normal';
   PanelTipo.Font.Style := [];
 end;

 procedure TFPrincipal.FormActivate(Sender: TObject);
 begin
   Memo1.SetFocus;
   PanelTamano.Caption := '12';
   PanelTamano.Font.Size := 12;
   CBNormal.Checked := True;
   //PanelTipo.Caption := 'Normal';
   //PanelTipo.Font.Style := [];
 end;

 procedure TFPrincipal.RB12Click(Sender: TObject);
 begin
   Memo1.Font.Size := 12;
   PanelTamano.Caption := '12';
   PanelTamano.Font.Size := 12;
 end;

 procedure TFPrincipal.RB16Click(Sender: TObject);
 begin
   Memo1.Font.Size := 16;
   PanelTamano.Caption := '16';
   PanelTamano.Font.Size := 16;
 end;

 procedure TFPrincipal.RB20Click(Sender: TObject);
 begin
   Memo1.Font.Size := 20;
   PanelTamano.Caption := '20';
   PanelTamano.Font.Size := 20;
 end;

 procedure TFPrincipal.RB24Click(Sender: TObject);
 begin
   Memo1.Font.Size := 24;
   PanelTamano.Caption := '24';
   PanelTamano.Font.Size := 24;
 end;



 procedure TFPrincipal.ComboBox1Change(Sender: TObject);
 begin
   if ComboBox1.Text = 'Negro'  //si el texto de ComboBox1 es igual a negro
   then                          //entonces
   Memo1.Font.Color := clBlack  // el color de fuente de Memo1 es igual a (Black)negro
   else if                                //en cambio si
     ComboBox1.Text = 'Azul' then
     Memo1.Font.Color := clBlue else if
     ComboBox1.Text = 'Amarillo' then
     Memo1.Font.Color := clYellow else if
     ComboBox1.Text = 'Verde' then
     Memo1.Font.Color := clGreen else if
     ComboBox1.Text = 'Rojo' then
     Memo1.Font.Color := clRed ;
 end;

 procedure TFPrincipal.EditNombreChange(Sender: TObject);
   begin
   PanelUsuario.Caption := 'El usuario es'+ '  '+EditNombre.Text +
    '  ' + '¡Bienvenido!';
 end;

 end.