13 de Diciembre de 1999
Un programa de Dibujo III
Vamos a construir un pequeqo programa de dibujo con todo lo aprendido, y alguna cosa mas. Lo primero es saber como hacer formas basicas, hasta ahora solo pintabamos, pero vamos a hacer lineas cuadrados y circulos (o elipsis, que viene a ser lo mismo a la hora de dibujarlas). Para ello contamos con tres mitodos que se pueden aplicar sobre el Canvas:
Mitodos aplicables al Canvas
| Mitodo | Descripcisn |
| LineTo (X,Y) | Traza una lmnea desde el punto actual donde se haya el lapiz al punto indicado por las coordenas X,Y |
| Rectangle(Origen.X,Origen.Y,Punto.X,Punto.Y); | Dibuja un cuadrado usando las primeras coordenadas como esquina izquierda superior, y la zltimas como esquina derecha inferior |
| Ellipse (Origen.X,Origen.Y,Punto.X,Punto.Y); | Dibuja una elipse (o circulo) usando la lmnea formado por el par de coordenadas, como diametro. |
Lo siguiente a tener en cuenta es que el usuario debe poder elegir que quiere hacer, un cuadrado, una lmnea, etc. Para ello he dispuesto un menz, en el cual elige la forma. Tambien he dispuesto otro menz con el cual se puede cambiar las propiedades del lapiz (ver capmtulo anterior).
Menz Formas
| Nombre | Descripcisn |
| Pincel | Pinta continuo |
| Lmneas | Pinta una lmnea |
| Cuadrados | Pinta un cuadrado |
| Circulos | Pinta un circulo |
Cada vez que el usuario selecciona un forma a dibujar debemos registrarlo en algun sitio. Para ello estan las variables, se puede asignar un valor a una variable segzn la seleccion del usuario, que la podemos llamar herramienta. Podriamos asignar el valor uno, al pincel, el dos Lineas, etc. Por ejemplo si selecciona el pincel:
Herramienta := 1;
Todo esto esta bien teoricamente, pero a la hora de seguir y entender un programa se puede complicar, y de hecho es sera dificil de entender. Se puede mejor el sistema si en lugar de colocar un valor numirico colocamos una constante (declarada anteriormente), algo asi:
Herramienta := Pincel;
Este sistema tiene buena pinta, pero nos obliga a tener que declarar las constantes, y ademas tiene la pega que cualquier constante o valor nzmerico puede ser asignado, lo cual puede generar un error lsgico (el programa no hace lo que esperamos), y sera dificil de rastrear. Por ellos el lenguaje Pascal, y por extensisn el Delphi, pone a nuestra disposicisn un tipo de variables, que son tipos definidos. Estas aburrido de usarlos, por ejemplo, muchas propiedades de los componentes de Delphi, solo admiten una serie de valores, y no otros. Podemos usar este tipo de variables, y definir que valores seran permitidos a nuestro antojo.
Lo primero es definir la variable, para ello esta la palabra reservada Type. Antes de la declaracisn del formulario coloca esto:
Type
THerramientas = (hrPincel,hrLinea,hrCirculo,hrCuadrado);
Con esto hemos creado un nuevo tipo de variable que solo podra contener los valores que hemos indicado. Pero solo hemos creado el tipo de variable, ahora en la seccisn private (tambiin se puede poner en la seccisn public, ver capmtulos anteriores) colocamos la declaracisn de la variable:
private
{ Private declarations }
Herramienta : THerramientas; //Almacena la herramienta en uso
Ahora en cada vez que el usuario seleccione un herramienta cargamos el valor que nos interese. Esto son los eventos de dos d menus.
procedure TForm1.Pincel1Click(Sender: TObject); begin Pincel1.Checked := True; Herramienta := hrPincel; end; procedure TForm1.Circulos1Click(Sender: TObject); begin Circulos1.Checked := True; Herramienta := hrCirculo; end;.
Pues este es el secreto de este programa. El otro menz seleccion el tipo de lapiz
(Pen) y le asigna el color, aqui os pongo el csdigo fuente, aunque tambien lo podeis
descargar en la seccisn de ficheros.
unit uMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls;
type
THerramientas = (hrPincel,hrLinea,hrCirculo,hrCuadrado);
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Image1: TImage;
Archivo1: TMenuItem;
Salir1: TMenuItem;
Formas1: TMenuItem;
Lineas1: TMenuItem;
Cuadrados1: TMenuItem;
Circulos1: TMenuItem;
Lapiz1: TMenuItem;
Color1: TMenuItem;
Estilo1: TMenuItem;
Ancho1: TMenuItem;
Fino1: TMenuItem;
Mediano1: TMenuItem;
Grueso1: TMenuItem;
Lineacontinua1: TMenuItem;
Lineadiscontinua1: TMenuItem;
Lineadepuintos1: TMenuItem;
Pincel1: TMenuItem;
ColorDialog1: TColorDialog;
procedure Lineas1Click(Sender: TObject);
procedure Cuadrados1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Pincel1Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Circulos1Click(Sender: TObject);
procedure Color1Click(Sender: TObject);
procedure Lineacontinua1Click(Sender: TObject);
procedure Lineadiscontinua1Click(Sender: TObject);
procedure Lineadepuintos1Click(Sender: TObject);
procedure Fino1Click(Sender: TObject);
procedure Mediano1Click(Sender: TObject);
procedure Grueso1Click(Sender: TObject);
procedure Salir1Click(Sender: TObject);
private
{ Private declarations }
Herramienta : THerramientas; //Almacena la herramienta en uso
Pintando : Boolean; //Indica si estamos pintado o no
Origen, //Punto donde se estabamos;
Punto: TPoint; //Puntos donde estamos
Procedure Linea (Const X,Y : Integer); //Dibuja una linea
Procedure Cuadrado (Const X,Y : Integer);//Dibuja un el cuadrado;
Procedure Circulo (Const X,Y : Integer); //Dibuja un circulo
Procedure Pincel (Const X,Y : Integer); //Dibuja seguido
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Lineas1Click(Sender: TObject);
begin
Lineas1.Checked := True;
Herramienta := hrLinea
end;
procedure TForm1.Cuadrados1Click(Sender: TObject);
begin
Cuadrados1.checked := True;
Herramienta := hrCuadrado;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Herramienta := hrPincel;
Pintando := False;
Image1.Canvas.Refresh;
end;
procedure TForm1.Pincel1Click(Sender: TObject);
begin
Pincel1.Checked := True;
Herramienta := hrPincel;
end;
procedure TForm1.Circulos1Click(Sender: TObject);
begin
Circulos1.Checked := True;
Herramienta := hrCirculo;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft Then
Begin
Pintando := True;
Image1.Canvas.MoveTo (X,Y);
Origen.X := X;
Origen.Y := Y;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If Button = mbLeft Then
Begin
Pintando := False;
Image1.Canvas.MoveTo (X,Y);
end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If Pintando Then
Begin
Case Herramienta Of
hrLinea:
Linea (X,Y);
hrCuadrado:
Cuadrado (X,Y);
hrCirculo:
Circulo (X,Y);
hrPincel:
Pincel (X,Y);
end; //Final del Case
end; //Final del If
Punto := Point (X,Y);
Image1.Canvas.Pen.Mode := pmCopy;
end;
Procedure TForm1.Cuadrado (Const X,Y :integer);
Begin
With Image1.Canvas Do Begin
Pen.Mode := pmNotXor;
MoveTo (Origen.X,Origen.Y);
Rectangle (Origen.X,Origen.Y,Punto.X,Punto.Y);
MoveTo (Origen.X,Origen.Y);
Rectangle (Origen.X,Origen.Y,X,Y);
end; //Final del With Image1.Canvas
end;
Procedure TForm1.Linea (Const X,Y : Integer);
Begin
With Image1 Do Begin
Canvas.Pen.Mode := pmNotXor;
Canvas.MoveTo (Origen.X,Origen.Y);
Canvas.LineTo (Punto.X,Punto.Y);
Canvas.MoveTo (Origen.X,Origen.Y);
Canvas.LineTo (X,Y);
end;
end;
Procedure TForm1.Circulo (Const X,Y : Integer);
Begin
With Image1.Canvas Do Begin
Pen.Mode := pmNotXor;
MoveTo (Origen.X,Origen.Y);
Ellipse (Origen.X,Origen.Y,Punto.X,Punto.Y);
MoveTo (Origen.X,Origen.Y);
Ellipse (Origen.X,Origen.Y,X,Y);
end; //Final del With Image1.Canvas
end;
Procedure TForm1.Pincel (Const X,Y : Integer);
Begin
With Image1.Canvas Do Begin
Pen.Mode := pmNotXor;
LineTo (X,Y);
end;
end;
procedure TForm1.Color1Click(Sender: TObject);
begin
If ColorDialog1.Execute Then
Image1.Canvas.Pen.Color := ColorDialog1.Color;
end;
procedure TForm1.Lineacontinua1Click(Sender: TObject);
begin
Image1.Canvas.Pen.Style := psSolid;
LineaContinua1.Checked := True;
end;
procedure TForm1.Lineadiscontinua1Click(Sender: TObject);
begin
Image1.Canvas.Pen.Style := psDash;
LineaDiscontinua1.Checked := True;
end;
procedure TForm1.Lineadepuintos1Click(Sender: TObject);
begin
Image1.Canvas.Pen.Style := psDot;
Lineadepuintos1.Checked := True;
end;
procedure TForm1.Fino1Click(Sender: TObject);
begin
Image1.Canvas.Pen.Width := 1;
Fino1.Checked := True;
end;
procedure TForm1.Mediano1Click(Sender: TObject);
begin
Image1.Canvas.Pen.Width := 5;
Mediano1.Checked := True;
end;
procedure TForm1.Grueso1Click(Sender: TObject);
begin
Image1.Canvas.Pen.Width := 10;
Grueso1.Checked := True;
end;
procedure TForm1.Salir1Click(Sender: TObject);
begin
Close;
end;
end.