SlideShare una empresa de Scribd logo
1 de 94
Entorno de Desarrollo
El entorno de desarrollo, también conocido como IDE, se muestra al iniciar
Delphi integrando todas las herramientas necesarias (Editor de código, Editor de
imágenes, Depurador, Herramientas de conexión a bases de datos, fichas de
componentes, etc.) para desarrollar nuestras distintas aplicaciones. En la
siguiente figura se muestra su entorno.
Menú Principal . . . En él, Se puede realizar casi todo desde los diferentes
submenús como definir las opciones de compilación, personalizar las fichas de
componentes o agregar nuevas, guardar o abrir proyectos, etc., es necesario
revisarlo antes de comenzar.
Barra de Herramientas . . . Esto es solo un conjunto de botones de acceso
rápido a las diferentes opciones del menú, lo cual nos facilita ejecutar las acciones
más utilizadas de una manera mas rápida. Dando un Click sobre ellas con el botón
derecho del ratón podremos configurarlas. A continuación muestro la función de
alguno de ellos.
Fichas de Componentes . . . Son las que dan Acceso a los componentes que
forman la biblioteca de componentes visuales conocida también como VCL
( Visual Component Library) y se encuentra dividida en varias categorías según las
funciones que realizán. Cada paleta incluye en su parte izquierda el botón puntero
que no es un componente sino que su función es parecida a la de cualquier
programa gráfico sirve para deseleccionar componentes seleccionados, etc. Para
insertar un componente en el formulario solo selecciona el componente a insertar
después pulsa sobre el formulario y arrastra el ratón para definir su tamaño, en
caso que no lo arrastres Delphi automáticamente le pone su tamaño
predeterminado. Otra forma de insertar los componentes es dando doble Clic
sobre el componente a insertar en la ficha de componentes.
Formulario o Form . . . Es la pieza principal del diseño de las aplicaciones, es el
contenedor final de otros componentes que finalmente constituirán nuestra
aplicación. El formulario es un componente más de Delphi por lo cual tiene
propiedades y eventos los cuales se pueden alterar y trabajar con ellos. Para
aquellas personas que emigran de lenguajes de programación lineal como C o
Clipper tengan en cuenta que ustedes utilizaran tantos formularios como su
aplicación los requiera.
Inspector de Objetos u Object Inspector . . . Este nos permite modificar las
propiedades y respuestas a sucesos o eventos de los componentes, sus datos
muestran el estado del componente seleccionado o del mismo formulario. Esta
dividido en dos partes en forma de pestañas o solapas una que dice Properties y
Events. A continuación se muestra las propiedades del formulario.
Existen propiedades que tienen un signo de mas, eso
significa que son contenedoras de otras opciones. A
continuación se explican algunas de las propiedades más
comunes del formulario.
BorderIcons: Tiene cuatro opciones mismas que reciben un
valor falso o verdadero (True o False) de las cuales dos son
muy útiles y empezaremos por la de biMinimize, esta opción
esta en True por default y permite que nuestro formulario se
pueda minimizar. biMaximize por default está en True y
permite que nuestro formulario se pueda maximizar en
tiempo de ejecución.
BorderStyle: Despliega una lista con los diferentes estilos de bordes para el
formulario.
Caption: Esta es una propiedad importante debido a que es aquí en donde
escribimos el texto de la barra de titulo del formulario, es alfanumérica y por defaul
tendrá el nombre del formulario (Form1 en este caso)..
Name: Es el nombre del componente, por Defaul aparecerá Form y el numero de
formulario, en este caso es Form1, este se puede modificar y ponerle un nombre
que nosotros queramos has de cuenta que el formulario es una variable y la
propiedad Name tiene el nombre de esa variable.
Position : Despliega una lista en la cual muestra las diferentes posiciones sobre
las cuales podemos mostrar nuestro formulario al momento de correrlo.
WindowsSatate: Despliega una lista de valores WsNormal, WsMinimized,
WsMaximized, las cuales alteran nuestro formulario al momento de correrlo es
decir si elegimos la de WsMaximized mostrara maximizado nuestro formulario.
Para dimensionar nuestro formulario basta con alterar las propiedades Height y
Width aunque también se puede realizar posicionando sobre los bordes del
formulario el puntero del ratón y arrastrarlo hasta lograr la dimensión que
queramos.
Nota: Existen Propiedades que son iguales para varios componentes como
Caption, Font, Visible, etc.
Ahora mostraré los eventos del formulario.
Los eventos son sucesos que detecta nuestro formulario y
según el suceso detectado se ejecuta su código, existen
varios eventos, explicaré solo algunos, de cualquier forma
durante el curso se explicarán más. Para introducir el
código basta con dar doble Click en la parte derecha del
evento a utilizar y Delphi automáticamente nos crea el
procedimiento de dicho evento y nos muestra el editor de
código.
Principales eventos del ratón.
Nombre. Acción.
OnDlClik Doble clic de ratón.
OnClick Un clic de ratón.
OnMouseMove El ratón pasa por encima del control.
OnMouseDown Es pulsado un botón del ratón.
OnMouseUp Es liberado el botón anteriormente pulsado
Principales eventos de teclado.
Nombre Acción
OnKeyPress
El código que se ponga en este
evento se ejecutará cada que se
presione una tecla, este evento
nos permite revisar la variable
Key, misma que contiene
contiene la tecla presionada.
Previamente la propiedad
KeyPreview se tiene que poner
en True.
OnKeyDown Una tecla ha sido pulsada.
OnKeyUp La tecla anteriormente pulsada
ha sido liberada
Principales eventos del sistema.
Nombre Acción
OnActivate El formulario se activa, y toma el papel principal.
OnClose El formulario se cierra.
OnCloseQuery Se ha solicitado cerrar el formulario.
OnCreate El formulario se crea.
OnDesactive El formulario pierde el papel principal pero sigue
existiendo.
OnDestroy El formulario es destruido, y se devuelve la memoria
usada a Windows.
OnPaint El formulario necesita ser pintado, porque algo ha
cambiado en él.
OnResize Ha cambiado el tamaño del formulario.
Nota: Existen eventos que nos ofrecen ciertos datos o variables propios del
evento a tratar con los cuales se puede trabajar y pueden ser de mucha utilidad
como es el caso de Key del evento OnkeyPress.
Editor de Código . . . Es la parte principal del entorno de desarrollo, es aquí
donde se escribirá el código del programa. Por cada formulario que se crea Delphi
genera un unit que contiene todo el código asociado a ese formulario. Ese unit se
graba con la extensión .Pas. A continuación se muestra el editor de código.
Como se puede ver, en el formulario yo puse un componente TButton y en su
evento OnClick puse un mensaje. Hay que recordar que la escritura del código es
en Pascal o dicho de otra forma Object Pascal.
Nota: Antes de pasar a nuestro primer programa quisiera dar un tip. Una vez que
tenemos un componente insertado en nuestro formulario en caso de que
queramos moverlo lo podemos hacer con el ratón pero también lo podemos hacer
con la tecla CTRL + Flechas de dirección, de igual forma si queremos
redimensionarlo lo podemos hacer con la tecla Shift + Flechas de dirección.
Ahora si, para que veas que el manual va en serio desarrollaremos un sencillo
programa, muy clásico pero necesario. Entra a Delphi, automáticamente te va a
crear un nuevo proyecto, de cualquier forma puedes crearlo en el menú
File/New/Applications. bien ya tenemos un nuevo proyecto ahora realiza lo
siguiente:
• Vete al Inspector de Objetos, tendrás activada la ficha Properties si no
actívala, posiciónate en la propiedad Caption y ponle el siguiente texto: Mi
primer programa en Delphi compadre.
• Vete a la Propiedad Position dale click en su derecha y te desplegara una
lista de valores elige la que dice PoScreenCenter. Esto para que te centre
el formulario en tu pantalla.
• Ahora Dale un Click a la pestaña que dice Events para que te muestre los
eventos del formulario. Después posiciónate en el evento que dice OnClick
y da doble Click en su parte derecha en lo blanco, te abrirá el editor de
código y creará un procedimiento, dentro del begin y el end pon
ShowMessage('Esperate estoy empezando'); Te tiene que quedar de la
siguiente forma:
procedure TForm1.FormClick(Sender: TObject);
begin
ShowMessage('Esperate estoy empezando');
end;
Ok. Ahora solo corre tu programa pulsando F9 y veras el resultado. Cada que
des un click sobre el formulario te mostrara el mensaje. Puedes experimentar tu
solo, cambiando las propiedades del formulario y corriéndolo para ver sus efectos.
Operadores Lógicos y Aritméticos
Operadores Aritméticos . . . . Permite realizar todo tipo de operaciones comunes
con operandos numéricos ya sean reales o enteros, en la siguiente tabla se
muestran los tipos de datos.
Operador Operación Tipo
Operando
Tipo
Resultado
+
Suma Integer
Real
Integer
Real
-
Resta Integer
Real
Integer
Real
*
Multiplicación Integer
Real
Integer
Real
/ División Integer
Real
Integer
Real
Div División entera Integer Integer
Mod Resto Integer Integer
Operadores Lógicos . . . Se dividen en dos categorías los lógicos y los
booleanos. La diferencia esta en que las operaciones lógicas llevan la
comparación de valores a nivel de bit y las operaciones booleanas realizan
comparaciones verificando si una cierta expresión es verdadera o falsa. En la
siguiente tabla se presentan las operaciones lógicas.
Operador Operación Tipo Operando Tipo Resultado
Not
Negación a nivel de
Bit. Integer
Integer
And Producto a nivel de
Bit. Integer
Integer
Or Suma a nivel de Bit. Integer Intege
Xor Or Exclusiva a nivel
de Bit.
Integer Integer
Shl Desplazamiento bit a
bit hacia la izquierda.
Integer Integer
Shr Desplazamiento bit a
bit hacia la derecha.
Integer Integer
La siguiente tabla muestra los operadores booleanos.
Operador Operación Tipo
Operando
Tipo
Resultado
Not Negación.
Boolean
Boolean
And Producto
lógico. Boolean
Boolean
Or Suma
lógica.
Boolean Boolean
Xor Or Exclusiva
lógica.
Boolean Boolean
Operadores Relaciónales . . . Los utilizamos para realizar comparaciones entre
dos valores y a continuación se muestran en la siguiente tabla.
Operador Operación Tipo Resultado
= Igualdad.
Boolean
< > Desigualdad.
Boolean
< Menor que. Boolean
> Mayor que. Boolean
<= Menor o Igual que. Boolean
>= Mayor o Igual que. Boolean
Precedencia de Operadores . . . Cuando se evalúa una expresión en la que
aparecen combinados diferentes operadores, las operaciones que representan se
ejecutan en cierto orden que están marcados por la precedencia de los
operadores. A continuación se muestra una tabla con su precedencia.
Operador Precedencia Categoría
@ , Not Primera
Operadores
Unarios
* , / , Div ,
Mod , And , Shl
, Shr , As
Segunda
Operadores de
Multiplicación
+ , - , Or , Xor Tercera Operadores de
Adición
=, <> , < , > ,
<= , >=
Cuarta Operadores
Relacionales
Existen cuatro reglas de precedencia que se deben de tomar en cuenta:
• Las expresiones encerradas entre paréntesis se evalúan antes de tratarlas
como un único operando. Lo que significa que primero se evalúa lo que
esta dentro del paréntesis por ejemplo la siguiente operación valor := 10 +
(3*3); primero multiplica 3*3 y su resultado lo suma con el 10.
• Un operador unario siempre precede al operador binario, por ejemplo -5 *
10 es lo mismo que tuviéramos (-5) * 10.
• Un operador que se encuentra entre dos operadores de precedencias
diferentes se relaciona con el operador de precedencia mayor, por ejemplo
valor := 5 * 3 + 10; en este caso primero se multiplica y después se suma.
• Un operando que se encuentra entre dos operadores iguales se relaciona
con el de su izquierda. Por ejemplo si se tuviera valor := 5 + 3 + 6; es lo
mismo que valor := (5 + 3) + 6;.
Declaración de Variables y Constantes
CONSTANTES . . . Se utilizan para representar lógicamente un valor que será
utilizado repetidamente en nuestro programa y que no variará durante su
ejecución. Para su declaración se utiliza la palabra reservada Const. Por ejemplo
continuación declararé la constante PI = 3.14 y nombre ='Pablo ' en el evento
Oncreate del formulario.
procedure TForm1.FormCreate(Sender: TObject);
const
PI = 3.14;
nombre = 'Pablo ';
begin
ShowMessage(nombre+FloatToStr(PI));
end;
Si declaras constantes o variables dentro de algún procedimiento, irían entre el
Procedure y el Begin. Como puedes ver utilizamos nuevamente la función
ShowMesage() la cual me permite mandar un mensaje sencillo al usuario pero
bueno se explicará más adelante en mensajes. De igual forma utilizo la función
FloatToStr() la cual me permite convertir valores de tipo flotante a cadena.
Variables . . . Una variable es un valor perteneciente a un cierto dominio
y puede variar durante la ejecución del programa. En Delphi las Variables se
declaran con la palabra reservada Var. Por ejemplo realizaremos la misma función
que las constantes pero ahora utilizando variables y el código quedaría así:
procedure TForm1.FormCreate(Sender: TObject);
var
PI : Real;
nombre : String;
begin
PI := 3.14;
nombre := 'Pablo ';
ShowMessage(nombre + FloatToStr(PI));
end;
NOTA: En Delphi las Asignaciones se realizan mediante := como puedes
observar.
Bien ya vimos como declarar constantes y variables ahora es necesario ver los
tipos de datos soportados por Delphi.
Delphi Soporta tipos de datos simples y tipos de datos compuestos pero por ahora
nos enfocaremos a los simples.
Tipos Enteros . . . Son aquellos que representan números no decimales
dentro de un rango y existen diferentes tipos de enteros clasificados según su
rango. A continuación muestro una tabla con los tipos de datos enteros.
Tipo
Rango de
Valores
Formato
Byte 0 .. 25 8 bits sin signo
Word 0 .. 65535 16 bits sin signo
LongWord 0 .. 4294967295 32 bits sin signo
ShortInt -128 .. 127 8 bits con signo
SmallInt -32768 .. 32767 16 bits con signo
LongInt
-2147483648 ..
2147483648
32 bits con signo
Int64
-2Exp63 ..
2Exp63-1
64 bits con signo
Integer
-2147483648 ..
2147483648
32 bits con signo
Cardinal 0 .. 214 748364832 bits sin signo
Por defecto las operaciones aritméticas con valores enteros devolverán un valor
entero, hay que tener cuidado por que una variable de tipo entera no puede
almacenar un dato de tipo real, más sin embargo una variable de tipo real si puede
recibir un dato entero.
Tipos Reales . . . Son adecuados para variables que albergan valores con
una parte decimal, a continuación muestro una tabla con los diferentes tipos reales
soportados por Object Pascal.
Tipo Rango de valores
Dígitos
Significativos
Tamaño
en
Bytes
Single
± 1.5 * 10Exp-45 .. ±
3.4 * 10Exp38
7-8 4
Real48
± 2.9 * 10Exp-39 .. ±
1.7 * 10Exp38
11-12 6
Real
± 5.0 * 10Exp-324 .. ±
1.7 * 10Exp308
15-16 8
Double
± 5.0 * 10Exp-324 .. ±
1.7 * 10Exp308
15-16 8
Extended
± 3.4 * 10Exp-4932 .. ±
1.1 * 10Exp4392
19-20 10
Comp -2Exp63 .. 2Exp63 -1 19-20 8
Currency
-9223372036854775808
..
19-20 8
9223372036854775807
La declaración de variables reales utiliza exactamente la misma sintaxis que la
explicada para los números enteros. De hecho en el ejemplo anterior se declaro
una variable de tipo Real.
Tipos Booleanos . . . Este es un tipo de dato muy sencillo pero
igualmente utilizado, representan cantidades lógicas como verdadero o falso y en
el Object Pascal existen cuatro que son: Boolean, ByteBool, WordBool y
LongBool. El que se recomienda más es el tipo Boolean debido a que utiliza
menos memoria, las otras existen para permitir la compatibilidad con otros
lenguajes y el entorno de Windows. Bueno a continuación te muestro su tabla.
Tipo
Memoria Requerida
en bytes
Boolean 1 (Recomendado)
ByteBoolean 1
WordBool 2
LongBool 4
Se declaran como cualquier otra variable solo que el valor que pueden recibir es
True o False. Ejemplo. Este código se puso en el evento Oncreate del Formulario
Ok.
procedure TForm1.FormCreate(Sender: TObject);
var
Compadre : Boolean;
begin
Compadre := True;
If Compadre = True then
ShowMessage('Tu si eres mi compadre')
Else
ShowMEssage('Tu no eres mi compadre');
end;
Este fue un ejemplo inútil, pero es solo para ilustrar su manejo muy simplemente,
tu eres quien le darás una verdadera aplicación si tus problemas lo requieren. Por
lo pronto puedes experimentar cambiando la asignación de compadre a False.
Tipos de Carácter . . . Los tipos de carácter están diseñados para
albergar caracteres según un cierto código numérico que usualmente es el ANSI
que mediante palabras de 8 bits representa hasta 256 caracteres. A continuación
muestro su tabla.
Tipo
Carácter que
contiene
Memoria
requerida en
Bytes
AnsiChar
Un Caracter
Ansi
1
WideChar
Un Caracter
Unicode
2
Char
Un Caracter
Ansi
1
Tipos Cadena de Caracteres . . . También conocidos como
String. Estas existen como tipos predefinidos que albergan la concatenación de un
determinado número de caracteres bueno es algo parecido a los arrays si así lo
quieren ver. En seguida muestro la tabla con los diferentes tipos.
Tipo
Carácter
que
contiene
Longitud
Máxima
Memoria
AnsiString AnsiChar
~2Exp31
Caractere
s
Hasta GB.
ShortString AnsiChar
255
Caractere
s
2 a 256
Bytes.
String AnsiChar
~2Exp31
Caractere
s
256 hasta
2GB.
WideString WideChar
~2Exp30
Caractere
s
Hasta
2GB.
Te pongo un ejemplo para explicar su uso.
procedure TForm1.FormCreate(Sender: TObject);
var
Nombre, Apellido : String;
begin
Nombre := 'Pablo ';
Apellido := 'Bustos';
Nombre := Nombre + Apellido;
ShowMessage(Nombre);
end;
Nota: a diferencia de C y otros lenguajes, en Delphi las concatenaciones se hacen
con el signo +; las asignaciones se hacen normalmente, únicamente utilizan las
comillas simples (') para indicarle que se trata de una cadena. Como
anteriormente se mencionó estas variables son parecidas a los arrays y podríamos
accesar directamente a alguna posición de la variable por ejemplo si a la variable
Nombre únicamente quisiera concatenarle la letra B de la Variable Apellido lo
haría de la siguiente forma: Nombre := Nombre + Apellido[1]. Como puedes ver a
diferencia de C el inicio de posiciones comienza en 1 y no en 0. Ok.
Existe la instrucción Array perteneciente a los datos compuestos, la cual permite
declarar arreglos de una o varias dimensiones.
Sentencias de control
Todo programa esta constituido por decisiones y acciones que se ejecutan
repetidamente en función del estado del programa y las sentencias de control, son
las que nos permiten hacer esas cosas. Explicaré las más utilizadas.
Condicion If ... Then : Las condiciones If sin duda son unas de las
mas utilizadas y permite condicionar la ejecución de un determinado código al
cumplirse una determinada condición. La sintaxis seria como sigue:
If Condicion Then
Codigo1
Else
Codigo2
Codigo1, se ejecutará cuando la condición se cumple y Codigo2 cuando la
condición no se cumple. Pueden anidarse tantas sentencias if como necesites.
Cuando los códigos a ejecutar tanto para el Else como para el IF son más de una
instrucción se deben de poner entre un Begin y un End. Para que quede mas claro
haremos un ejercicio mas practico, el código irá en el evento Oncreate del Form.
Se preguntarán por que utilizo ese evento bueno pues por que todavía no les
enseño como funcionan otros componentes.
procedure TForm1.FormCreate(Sender: TObject);
var numero : Integer;
begin
Randomize();
numero := random(20);
if numero > 10 Then
begin
numero := numero * numero;
ShowMessage('Es mayor, al cuadrado es: ' + IntToStr(numero));
end
Else
begin
numero := numero * numero;
ShowMessage('Es menor, al cuadrado es: ' + IntToStr(numero));
end;
end;
Nota: En el ejemplo declaro una variable de tipo entero después utilizo la función
Randomize() la cual inicializa el motor de generación de números aleatorios luego
asigno a numero el resultado que devuelva random(20) la cual es una función que
devuelve un valor aleatorio entre un rango previamente especificado que en este
caso es un 20. Este ejemplo es muy sencillo lo que hace es generar un numero
aleatorio lo compara y si es mayor que diez manda un mensaje diciendo que es
mayor y mostrando su cuadrado y en caso de que sea menor hace casi lo mismo
solo que indica que es menor.
Case ... OF : Permite comparar una variable o expresión con un conjunto
predeterminado de valores y ejecutar un código determinado de acuerdo al
resultado de la comparación o expresión. Aquí tienes su sintaxis.
Case Expresion Of
Lista de constantes separadas por comas : Codigo;
Valor Inicial .. Valor final : Codigo2;
Else
Codigo por Defecto;
Hay va un ejemplo para que quede mas claro Ok.
procedure TForm1.FormCreate(Sender: TObject);
var numero : Word;
begin
Randomize();
numero := Random(4);
Case numero Of
0: ShowMessage('El numero es un Cero');
1: ShowMessage('El numero es un Uno');
2: ShowMessage('El numero es un Dos');
else
ShowMessage('El numero es mayor que dos');
end;
end;
Este es un ejemplo muy sencillo, genero un numero aleatorio de entre 4 dígitos
incluyendo el cero, luego con el Case lo comparo hasta el numero dos dejando un
mensaje en el else para cuando el numero sea mayor que dos.
Bueno creo que ha llegado la hora de explicar los ciclos o bucles así que
empezaremos.
Repeat Until : Permite ejecutar un determinado código hasta que se
satisfaga una cierta condición, su sintaxis es de la siguiente forma:
Repeat
Codigo
Until Condicion
La condición debe producir un resultado de tipo Booleano, cabe mencionar que en
este tipo de ciclos el código se ejecuta por lo menos una vez debido a que la
condición se realiza en la parte final del ciclo.
Les pondré un sencillo ejemplo pero ahora utilizaremos el evento OnClick del
Form.
procedure TForm1.FormClick(Sender: TObject);
var nl.*umero, suma : Integer;
begin
numero := 1;
suma := 0;
repeat
suma := suma + numero;
inc(numero);
until numero = 10;
ShowMessage(IntToStr(suma));
end;
While ... Do : Es parecido al anterior solo que la verificación del ciclo se
realiza al inicio. Aquí tienes su sintaxis.
While Condición Do
Codigo
Si el código es mas de una instrucción se tendrá que poner entre un Begin y un
End. que no se te olvide. De este ciclo no pondré ejemplo creo que tu puedes
utilizar el código anterior y aplicarlo a este ciclo.
For ... Do : Nos permite repetir la ejecución de un determinado código un
numero definido de veces. La sintaxis es como sigue.
For Variable := Valor Inicial To/Downto Valor Final Do
Codigo
El Downto es para realizar ciclos en decremento y el To en incremento. así que si
quieres sumar los números del 1 al 100 seria:
procedure TForm1.FormClick(Sender: TObject);
var numero, suma: Integer;
begin
suma :=0;
For numero := 1 To 100 Do
suma := suma + numero;
ShowMessage(IntToStr(suma));
end;
Con esto hemos concluido una parte que es fundamental conocer para el manejo
de Delphi, como lo es su entorno de desarrollo, declaración de constantes,
variables y sus sentencias de control. Así que de aquí en adelante nos
dedicaremos a ver cosas mucho más interesantes, explotaremos la potencialidad
de Delphi y empezaremos por ver los tipos de mensajes que Delphi permite
realizar.
Mensajes en Delphi
Es verdaderamente útil poder interactuar con el usuario, decirle que es lo que esta
ocurriendo o dejarlo que tome decisiones. Esto en parte podemos lograrlo con las ventanas
o cuadros de mensaje, por si no tienes una idea clara de que es lo que son pues son por
ejemplo el cuadro que te aparece en Word (u otra Aplicación) cuando no has guardado tu
trabajo preguntando si deseas guardarlo.
Delphi permite Los siguientes tipos de Mensajes.
• ShowMessage
• ShowMessagePos
• MessageDlg
• MessageDlgPos
• MessageBox
ShowMessage . . . Es el mas sencillo de todos y ya lo hemos utilizado
en ejercicios anteriores. El cuadro parece por defecto centrado en la pantalla, el
titulo de la ventana es el nombre de la aplicación, el texto del mensaje lo
indicamos nosotros entre comillas simples y solo tiene un botón. Ejemplo:
ShowMessage('Quiubule Familia').
ShowMessagePos . . . Es Parecido al anterior pero tiene dos valores mas
que indican las coordenadas donde se mostrara el cuadro indicando primero el
ancho y luego el largo. Debes tener cuidado pues la posición se debe poner en
Pixeles por lo tanto debes sabe el tamaño de tu pantalla, esto lo logras haciendo
una pequeña llamada al Objeto TScreen.Width obtienesel ancho y con
Screen.Height el Largo. Bueno como ejemplo podrías poner en el evento Onclick
de tu formulario el siguiente código:
ShowMessagePos ('Utilizando Coordenadas', Screen.Width div 3,Screen.Height
div 3);
MessageDlg . . . Hasta ahora los tipos anteriores de mensajes no dejan
que el usuario pues pueda tomar alguna decisión o algo por el estilo verdad, así
que el tipo de mensaje MessageDlg nos proporciona esa posibilidad. Los valores
que recibe son primeramente el texto que queremos mostrar, el tipo de cuadro que
mostraremos según una lista predefinida por Windows, los botones que se
mostraran y la ayuda de la aplicación que creemos si es que colocamos un botón
de ayuda en el cuadro. Bien ahora les mostrare la lista de cuadros predefinidos
por Windows.
• mtIformation
• mtWarning
• mtError
• mtConfirmation
• mtCustom
Por cada tipo de cuadro windows automáticamente te mostrara una imagen
relacionada al cuadro elegido. Ahora es necesario saber cuales son los tipos de
botones que podemos utilizar.
• mbYes
• mbNo
• mbOk
• mbCancel
• mbAbort
• mbRetry
• mbIgnore
• mbAll
• mbHelp
Los tipos de botones que deseas debes ponerlos entre corchetes ([ ]), y seguidos
de una coma. O si lo prefieres Otra forma de hacerlo es poner un serie de
botones predefinidos, pero si lo haces no pongas los corchetes. Los botones
predefinidos son:
• mbYesNoCancel
• mbAbortRetryIgnore
• mbOkCancel
Bien ahora pondré un ejemplo de como utilizarlo, pon el siguiente código en el
evento Onclick de tu Formulario.
If MessageDlg ('¿Estas Aprendiendo?', mtConfirmation ,[mbyes,mbno],0) = mrYes
Then ShowMessage ('Que bueno, entonces vamos bien')
else
ShowMessage ('Hay jode, pos estúdiale mas');
Si pusiste atención te pudiste haber dado cuenta que MessageDlg devuelve el
valor del botón pulsado por el usuario. El valor devuelto puede tomar los
siguientes valores:
• mrNone
• mrAbort
• mrYes
• mrOk
• mrRetry
• mrNo
• mrCancel
• mrIgnore
• mrAll
El valor de la constante tiene el nombre del botón pulsado, de esa forma en el
ejemplo cuando es pulsado el botón mbYes, el valor devuelto es mrYes.
MessageDlgPos . . . Esta es una variante de la función MessageDlg,
funciona exactamente igual solo que se le tienen que pasar las coordenadas de
donde queremos que aparezca el cuadro de mensaje. Ejemplo
If MessageDlgPos ('¿Estas Aprendiendo?', mtConfirmation ,
[mbyes,mbno],0,Screen.Width,Screen.Height) = mrYes Then ShowMessage ('Que
bueno, entonces vamos bien')
else
ShowMessage ('Hay jode, pos estúdiale mas');
MessageBox . . . Es un tipo de mensaje que hace llamada a la Api de
Windows sacándonos el titulo de los botones en español, claro si nuestro Windows
esta en español. No adentrare mucho en esto así que pondré un ejemplo de su
uso.
if Application.MessageBox('QUIERES SALIR DEL
PROGRAMA ?','SALIR',MB_OKCANCEL+MB_ICONQUESTION)=IDOK then
Application.Terminate;
En este caso también se controla el tipo de botón a poner y las combinaciones de
las imágenes que pone Windows por defecto te las listo continuación. Los tipos de
botones a poner ya se listaron anteriormente.
 Mb_IconAsterisk
 Mb_IconError
 Mb_IconExclamation
 Mb_iconHand
 Mb_IconInformation
 Mb_IconQuestion
 Mb_IconStop
 Mb_IconWarning
Bueno creo que sobre mensajes seria todo. Ahora pasaremos a explicar lo que
estaban esperando las fichas de componentes visuales. Finalmente verdad...
Ficha Standar
En esta ficha se encuentran los componentes mas utilizados y es la que esta
activada cuando entramos a Delphi. Explicare únicamente los principales.
Nota: Realizare algunos ejercicios durante el transcurso de la explicación.
Ficha Standar.
Empezaremos a partir del segundo componente.
Imag Componente Descripción
MainMenu
Es un componente no visual que permite diseñar el
menú del formulario que si será visual.
PopupMenu
Permite diseñar Menús contextuales o emergentes,
que aparecerán al pulsar el botón secundario del
ratón.
Label
Es un cuadro de texto estático, por lo tanto visualiza
texto pero no puede ser modificado.
Edit
Es un cuadro de Edición de Texto que permite
visualizar y modificar una línea de texto.
Memo Es un Cuadro de Texto multilinea, se puede
visualizar y modificar varias líneas de texto. Es
parecido al Bloc de Notas
Button
Es un Botton clásico de cualquier aplicación
Windows, no lleva ninguna imagen solo texto.
ChechBox
Es una casilla de verificación que permite
seleccionar y deseleccionar opciones.
RadioButton
Botón de opción parecido al CheckBox, se utiliza
para seleccionar dentro de un conjunto de
RadioButton u opciones solamente uno de ellos.
ListBox
Es una lista Standard de Windows en la que el
usuario puede seleccionar un elemento de la lista.
ComboBox
Lista desplegable que combina las características
de un ListBox y un Edit permitiendo al usuario
seleccionar un elemento.
ScrollBar Barra de desplazamiento estándar.
GroupBox
Funciona como contenedor de objetos, permitiendo
agrupar diferentes controles.
RadioGroup
Es un contenedor exclusivamente para los
RadioButtons.
Panel
Contenedor de objetos pero mas potente que el
GroupBox.
Bueno ahora vamos a lo bueno aremos un ejercicio utilizando algunos
componentes explicados. así es que arranca Delphi o crea una nueva Aplicación.
Coloca un GroupBox en tu formulario, Dentro de el coloca dos etiquetas mismas
que en su propiedad Caption les pondras Valor uno y Valor dos. Después pon dos
Edit ve a su propiedad Text y quítales el texto que tienen por defaul. Deben de ir
un Edit abajo de cada Label. Selecciona el Componente GroupBox y en su
propiedad Caption Coloca el texto Valores. Todo el GroupBox y su componentes
cárgalos hacia tu parte superior izquierda.
Ahora en tu parte superior derecha pega un componente Label y en su propiedad
Caption le pondrás Operación, Después coloca un componente ComboBox debajo
del Label. Te vas a la propiedad Text del comboBox y Escribes el texto Suma.
después ve a la propiedad Items y dale Click donde dice String. te saldra una
ventana en la cual escribirás los textos Suma, Resta en líneas o filas separadas. y
das Ok a la ventana.
Después coloca debajo del ComboBox un componente Button y en su propiedad
Caption pon Calcular. Ahora coloca un componente Panel debajo del Componente
Button. dentro del panel pon un componente Label que por cierto si has seguido
mis instrucciones será el Label6 y de hecho debe de ser el seis por que lo
utilizaremos para pegar el resultado de una operación.
Muy bien ahora pon un componente RadioGroup en la parte inferior izquierda, en
su propiedad Caption pon color de ventana. Después dentro de el coloca dos
RadioButtons al primero en su propiedad Caption Pon el texto Azul, y al segundo
ponle Normal.
Ahora pon un Componente Button al costado derecho del RadioGroup. y pon en
su propiedad Caption Aplicar.
Pon un componente MainMenu, Dale doble Click. te saldra una ventana en la cual
se irán viendo las opciones del menú que bayas poniendo en su propiedad
Caption. Ahora vete a la propiedad Caption y escribe &Principal (El Amperson
indica la tecla caliente), da enter y ahora te aparecerá principal en la ventana que
estará a tu derecha, en esa ventana debajo de la leyenda Principal habrá un
campo en blanco selecciona con el ratón, después vete a la propiedad Caption y
escribe &Salir. Ahora da click sobre el formulario para regresar a el.
Ahora el diseño quedaría como sigue
Ahora vamos con el código. Vete al evento Onclick del Button1 que dice Calcular.
dentro de el pondremos el siguiente código:
if ComboBox1.Text = 'Suma' Then
Begin
Label6.Caption := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text));
End;
if ComboBox1.Text = 'Resta' Then
Begin
Label6.Caption := FloatToStr(StrToFloat(Edit1.Text) - StrToFloat(Edit2.Text));
End;
Si te das cuenta en el Edit1 y Edit2 Guardamos los valores con los que aremos
una suma o resta según elija el usuario. El resultado lo pegaremos en el Label6 en
su propiedad Caption. Tanto el Edit como el Label son de tipo String por lo que
para hacer la operación es necesario convertirlo por lo tanto los Edit los convierto
a flotantes mediante FloatToStr(). Ahora el resultado será un tipo de dato flotante
para asignárselo al Label que es de tipo String tengo que convertirlo mediante la
instrucción FloatToStr();
En lo que respecta al uso del ComboBox me sirve para que el usuario elija el tipo
de operación a realizar (Suma o Resta) yo previamente definí Suma y Resta en el
ComboBox. Cuidado si te fijas la primera letra de Suma y Resta esta en
mayúsculas si tu la escribes diferente tendrás que modificar las comparaciones en
el If.
Muy bien Ahora en el Evento Onclick del Button2 que dice Aplicar pon este código.
if RaDioButton1.Checked = True then
Form1.Color := ClBlue
else
Form1.Color := clBtnFace;
Como puedes ver la propiedad Checked me indica si un RadioButton esta o no
Activado. Y dependiendo de eso modifico el color del Form.
Ahora vete al menú desplegable y dale Click en la opción Salir de esta forma
Delphi te creara el procedimiento Tform1.Salir1Click en el cual pondrás este
código.
Application.Terminate;
Esta instrucción permite terminar correctamente la aplicación y devolver la
memoria a Windows.
Ahora solo corre el programa con F9 y listo. Experimenta con el.
Ficha Additional
Contiene componentes que amplían los componentes de la estándar y que
igualmente se utilizan frecuentemente. Explicare solo algunos de ellos. De
cualquier forma si sabes un poco de ingles puedes consultar la ayuda de Delphi
seleccionando la ficha y después presionando F1.
Imagen Componente Descripción
BitBtn
Es un Botton que se le puede añadir un
gráfico Bitmap. Contiene la propiedad Kind
que trae una lista de botones predefinidos con
sus Bitmap.
SpeedButton
Es un botón utilizado en las barras de
herramientas, se le puede agregar un Bitmap
y trae la propiedad Flat que permite dar una
apariencia de boton plano.
MaskEdit
Se utiliza para validar la entrada de datos
mediante el formateo del texto como lo es la
fecha, etc.
Image
Permite mostrar gráficos como Bitmaps,
iconos, Windows Metafiles, etc.
Shape Permite dibujar polígonos, círculos y líneas.
Bevel Es un rectángulo en 3D.
ScrollBox
Define un área contenedora mayor al área
visualizada, automáticamente al sobrepasar el
área salen las barras deslizadoras.
CheckListBox
Es un ListBox solo que añade un CheckBox
para cada elemento de la lista.
Splitter
Sirve para definir áreas modificables por parte
del usuario.
StaticText
Es similar a Label, solo que tiene mas
propiedades modificables.
ControlBar
Se utiliza para crear barras de Herramientas
acoplables.
Chart Util para crear diferentes tipos de gráficos.
Bueno ahora es el momento de realizar algún ejercicio en donde utilicemos
algunos componentes descritos.
Crea una nueva aplicación, al Caption del formulario ponle Ficha Addiotional, en el
formulario por un componente StaticText, en la Propiedad Caption pon Fecha, la
propiedad BorderStyle ponla en sbsSunken.
Coloca un componente MaskEdit, Da un Click sobre él con el botón secundario del
ratón, te saldrá un menú desplegable elige la opción Input Mask Editor ( Esto
también lo puedes realizar en la propiedad EditMask), te saldrá una venta con
mascaras predefinidas. Elige la que dice Date, si quieres la fecha en formato
MM/DD/AA, esta un botón que dice Masks, dale click y vete al directorio Bin de
Delphi y elige el archivo Spain. Ahora ya que seleccionaste Date. solo dale Ok. y
listo tienes tu mascara para la fecha.
Ahora Pon este código en el evento OnCreate de tu Form.
MaskEdit1.Text := DateToStr(Date);
La función que devuelve la hora del sistema es Date y el valor devuelto es de tipo
fecha así que se tiene que convertir a String para pegarse en el MaskEdit.
Muy bien ahora coloca un componente Shape en el Form, ve a la propiedad
Shape y Elige la opcion StCircle. Despues ve a la propiedad Brush, presenta dos
opciones elige la opción Colors y elige el color ClLime.
Despues de esto coloca un BitBtn a un costado del componente Shape. ve a la
propiedad que dice Glyph y dale Click a su derecha. te presentara una ventana en
la cual te permitirá buscar y agregar una imagen al boton asi que dale click a la
opción Load y ve al directorio imagesbuttons de Delphi, en este directorio tendras
una serie de gráficos que Delphi te instala, bueno elige la imagen Group. Una vez
agregada la imagen ve a la propiedad Caption y Ponle Color.
Coloca un SpeedButton en el formulario, en la propiedad Caption ponle figura, ve
a la propiedad Glyph y ponle la imagen Form. Recuerda para ponerle la imagen es
igual que cuando se la pusiste al BitBtn. Bien ahora ya con la imagen puesta ve a
la propiedad Flat y ponla en True.
Ahora coloca un componente Image, su propiedad Align ponla en AlClient. con
esto la imagen ocupara todo el formulario. Ve a la propiedad Picture y dale click a
su derecha, de igual forma como en los botones agregamos una imagen haz lo
mismo solo que ahora ve al directorio ImagesBackgrnd y elige la imagen Writing.
Ahora te muestro como quedaría la parte visual del formulario.
Ahora en el Evento Onclick del BitBtn se pondría:
procedure TForm1.BitBtn1Click(Sender: TObject);
var numero : Word;
begin
Randomize();
numero := Random(3);
if numero = 0 then
Shape1.Brush.Color := ClBlue;
if numero = 1 then
Shape1.Brush.Color := ClBlack;
if numero = 2 then
Shape1.Brush.Color := ClYellow;
if numero = 3 then
Shape1.Brush.Color := ClLime;
end;
Con este código generamos un numero aleatorio de entre cuatro números
incluyendo el cero, y según el resultado estamos cambiando de color al Shape.
Pon en el SpeedButton este codigo.
procedure TForm1.SpeedButton1Click(Sender: TObject);
var numero : Word;
begin
randomize();
numero := random(5);
if numero = 0 then
Shape1.Shape := StCircle;
if numero = 1 then
Shape1.Shape := StEllipse;
if numero = 2 then
Shape1.Shape := StRectangle;
if numero = 3 then
Shape1.Shape := StRoundRect;
if numero = 4 then
Shape1.Shape := StRoundSquare;
if numero = 5 then
Shape1.Shape := StSquare;
end;
Estamos generando aleatoriamente 6 posibles datos (0-5) mismos que utilizamos
como constantes para cada una de las formas del Shape. Bueno con esto hemos
concluido este pequeñísimo ejercicio. Por ahora estamos haciendo cosas muy
simples les prometo que posteriormente aremos algo mas complicado mientras
tanto pasaremos a la siguiente ficha.
Ficha Win32
Contiene componentes que permiten la creación de aplicaciones que cumplen con
las especificaciones de Windows 95 o superior. A continuación se muestra.
Imagen Componente Descripción
TabControl
Crea solapas para cuadros de dialogo
multipágina.
PageControl
Crea una área multipágina, en donde cada pagina
es accesible desde las mismas solapas del
componente.
ImageList
Define una matriz de imágenes del mismo
tamaño mismas que son accesibles a través de su
índice.
RichEdit
Es una caja de texto que acepta el formato de
texto enriquecido, por lo tanto a nivel de palabra
se le puede modificar el tamaño, color, etc.
TrackBar
Es una barra de desplazamiento de Windows, que
nos permite desplazar el control por un conjunto
de valores.
ProgresBar Es una barra de progreso estándar que nos indica
el avance de un determinado proceso.
Animate
Muestra secuencias de BitMaps o Archivos Avi
sin sonido.
DateTimePicker
Despliega fechas y permite seleccionarlas,
también permite introducirlas.
MonthCalendar Nos presenta el calendario por meses.
StatusBar Es una barra de estado clásica de Windows.
ToolBar Permite crear una barra de Herramientas.
CoolBar
Es un contenedor de Barras de herramientas
mismas que pueden ser configurables por el
usuario
Bueno es tiempo de hacer un ejemplo de su uso así que realiza lo siguiente:
Crea una nueva aplicación, al caption del form ponle Ficha Win32, coloca un
componente Image list en el form, dale doble Click al componente, te saldrá una
ventana en la cual podrás agregar imágenes, dale al botón que dice Add, vete a la
carpeta Images/Buttons de Delphi, y agrega el archivo que dice DoorOpen,
después que lo abres, regresas a la ventana anterior y te mandara un mensaje en
ingles que dice la dimensión de la imagen es demasiado grande y pregunta si la
divide en dos, dale que si, te pondrá dos imágenes, hay un botón que dice Delete,
borra la segunda imagen con ese botón. Ok. Ahora así como agregaste esta
imagen quiero que agregues dos mas, bueno la imagen del botón te la dejo a tu
gusto Ok. el caso que te tienen que quedar tres imágenes enumeradas del 0 al 2.
Después de agregar las imágenes solo da click al botón de OK.
Coloca un componente ToolBar, en su propiedad Caption Ponle Herramientas,
Vete a la propiedad ImageList y selecciona el texto ImageList1 (Es el componente
de imágenes que creamos). Ahora dale Click al Componente con el botón
secundario del ratón y te saldrá un menú emergente, selecciona la opción New
Button, con esto te crea un botón en en el componente ToolBar. Ok. Ahora vete a
la propiedad Hint del botón que acabas de crear y ponle Salir, ve a la propiedad
ShowHint y ponla en True. Ok. Después ve a la propiedad ImageIndex y ponle 0
(A este botón le pondremos la imagen que este en el índice 0). Ahora nuevamente
con el botón secundario del ratón dale click al ToolBar y ahora eliges la opcion
NewSeparator, con esto te crea un botón separador, a este botón no le haremos
nada Ok. De igual forma como creaste el primer botón crea dos mas y en su Hint
pondrás Animación, calendario, en la propiedad ImageIndex pon 1 y 2
respectivamente. Con eso tendremos nuestra barra de herramientas.
Ahora coloca un componente PageControl, Dale click al componente con el botón
secundario del ratón, en el menú emergente selecciona New Page, con esto te a
creado una nueva pagina, ahora vete a la propiedad Caption y ponle Animación.
Ahora si sobre esa nueva pagina pegaras un componente Animate, vete a la
propiedad CommonAvi y selecciona el valor aviCopyFile. Después vete a la ficha
Standar y coloca dos Buttons debajo del componente Animate, a uno le pones
Animar y al Otro Detener. Con esto tendremos lista nuestra primer pagina así es
que selecciona el componente PageControl y con el botón secundario del ratón
dale nuevamente Click y elige la opción de NewPage. Ahora Vete a la propiedad
Caption y ponle Calendarios. Coloca dentro de esta pagina un componente
MonthCalendary un componente DateTimePicker, a estos componentes no les
haremos nada.
Si todo va bien el diseño estaría mas o menos así.
Muy bien ahora vamos a introducir el código, empezaremos por los botones de la
barra de herramientas.
Dale Doble Click al primer botón que le pusimos Salir, con esto te genera
automáticamente el evento Onclick, puedes hacerlo de la otra forma que tu ya
sabes no importa. Bueno pon este código.
Application.Terminate;
Ahora en el Tercer botón que le pusimos Animación pondrás este otro código.
PageControl1.ActivePageIndex := 0;
Como puedes ver las paginas del PageControl tienen un índice empezando de
cero así es que solo es cuestión de poner que pagina es la que quieres activar.
En el ultimo Botón (Calendarios) pondrás este código.
PageControl1.ActivePageIndex := 1;
Muy bien ahora selecciona la pagina que dice Animacion del PageControl. en el
evento Onclick del Button Animar pondrás este código.
Animate1.Active := True;
Por ultimo en el evento Onclick del botón Detener pon este código.
Animate1.Stop;
Muy bien.... traigan la tequila compadres.. pos ya terminamos. ahora solo córrelo
con F9 y listo.
Ficha System
Contiene componentes que permiten acceder a algunos elementos importantes
del sistema, enseguida muestro la ficha.
Imagen Componente Descripción
Timer
Es un temporizador que ejecuta un evento cada intervalo
de tiempo programado.
PaintBox Define una área en la que se puede dibujar.
MediaPlayer
Es un Panel de control del reproductor de vídeo
multimedia y de archivos de sonido.
OLEContainer
Es un contenedor que define una área de cliente OLE. Lo
utilizaremos en el ejemplo para ver video.
DDEClientConv
Establece una conexión DDE como cliente a un servidor
DDE.
DDEClientItem
Especifica los datos que serán enviados a un servidor
DDE.
DDEServerConv Establece una conexión como servidor DDE.
DDEServerItem
Especifica los datos que serán enviados a un cliente
DDE.
Muy bien ahora como se supone que ya sabemos utilizar alguna variedad de
componentes pues lo que haremos es un reproductor de vídeo casi casi
profesional....... Bueno ustedes son los que retocaran algunos detalles.
Reproductor de Vídeo
Primeramente diseñaremos el aspecto visual después nos iremos con el código
Ok.
Crea una nueva Aplicación. Al Caption del Form ponle Mi Reproductor de Vídeo.
Ve a la ficha System y coloca un componente OleContainer que abarque una parte
considerable del formulario.
Ve a la ficha Estándar y coloca un componente ScrollBar. Ponlo debajo del
componente OleContainer.
Ve a la ficha System y coloca un componente MediaPlayer, ahora vete a la
propiedad VisibleButtons, te desglosara todos los botones del Media Player,
Estarn en True por Defaul, quiero que dejes solamente los botones btPlay,
btPause, btStop en True los demás ponlos en False. Ahora ve a la Propiedad
Display, te desplegara una lista de componentes elige el componente
OleContainer1.
A un costado del componente mediaPlayer pon un componente BitBtn (Esta en la
ficha Additional), agrégale una imagen (ya sabes como) y en la propiedad caption
ponle Abrir.
Ve a la ficha estándar y pon un componente Label, en su caption ponle Duracion,
pon otro componente Label abajo de ese, y en su caption ponle T. Transcurrido.
Ok. ahora pon dos componentes Label nuevamente y su propiedad Visible
pónselas en False. el tercer Label tiene que quedar a un costado del Label 1 y el
cuarto del 2. De cualquier forma abajo presento el diseño.
Ve a la ficha System y pon un componente Timer.
Mira compadre no explique todas las fichas que trae Delphi. Ok. pero con lo que
hemos visto hasta ahora ya sabes navegar entre las fichas y sus componentes así
es que vamos a utilizar un componente que esta en otra ficha diferente a las
vistas.
Vete a la ficha Dialogs, Pon el componente OpenDialog, es un componente no
visual y mediante la instruccion Execute nos mostrara la típica ventana de Abrir un
Archivo.
Bien una vez puesto este componente vete a la propiedad Filter da doble Click a
su derecha y te saldrá una venta dividida en dos partes la de la izquierda dice
Filter Name y la de la derecha dice Filter. Ahora en filter name Escribirás Archivos
Avi, en Filter escribiras *.Avi, nuevamente en una nueva fila escribe en Filter Name
Todos los Archivos y en Filter *.*. Esa ventana quedaría de la siguiente forma.
Muy bien Ahora ve a la ficha Win32 y coloca un componente StatusBar.
Automáticamente se colocara en la parte inferior del formulario. Vete a la
propiedad SimplePanel y ponla en True, Después ve a la Propiedad Simpletext y
ponle Inactivo, Tienes que ponerlo como yo te lo estoy Escribiendo ya que esa
etiqueta la utilizo para saber el estado del formulario y las mayúsculas o
minúsculas son sensibles en las comparaciones.
Muy bien si has hecho todo lo que te dije el Formulario tiene que lucir mas o
menos Así.
Ahora viene lo interesante el código. Ojo el código va completo con todo y los
procedimientos que Delphi me genera en cada evento. Esos procedimientos no se
copian por que Delphi te los crea. Ok. Ahora pon este código en el BitBtn1 al que
le pusimos Abrir.
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Opendialog1.Execute = True then
begin
MediaPlayer1.FileName := OpenDialog1.FileName;
MediaPlayer1.Open;
Mediaplayer1.DisplayRect :=
rect(0,0,OleContainer1.Width,OleContainer1.Height);
MEdiaPlayer1.Play;
StatusBar1.SimpleText := 'Repoduciendo Archivo: ' + OpenDialog1.FileName;
Label3.Visible := True;
Label4.Visible := True;
end;
end;
Observa que el OpenDialog1.Execute devuelve un valor True cuando el usuario
abre un archivo, la propiedad FileName contiene el nombre el archivo que abrió. El
MediaPlayer mediante su propiedad FileName le indicamos el archivo que
reproducirá, después simplemente lo abrimos.
Si te fijas la propiedad DisplayRect permite indicar el tamaño en que queremos
visualizar el Vídeo que por cierto es el tamaño del componente OleContainer.
Después ponemos visibles los Labels 3 y 4, en estos se muestra el tiempo total del
vídeo y en el otro se mostrara el tiempo en el que va la reproducción.
Ahora pondrás este código en el evento OnTimer del componente Timer. Puedes
irte al inspector de Objetos o simplemente dale Doble Click con el ratón al
componente.
procedure TForm1.Timer1Timer(Sender: TObject);
var posicion, duracion : LongInt;
begin
if StatusBar1.SimpleText <> 'Inactivo' then
begin
with MediaPlayer1 do
begin
MediaPlayer1.TimeFormat := tfMilliseconds;
duracion := Round(Length div 1000);
scrollBar1.Max := length;
Label3.Caption := Format('%d:%d',[duracion div 60, duracion Mod 60]);
posicion := round(Position div 1000);
Label4.Caption := Format('%d:%d',[posicion div 60, posicion Mod 60]);
ScrollBar1.Position := position; //minuto * 60 + segundo;
end;
end;
end;
El componente Timer va a estar ejecutando este código cada segundo.
Primeramente verifica el StatusBar, si la propiedad simpletext es diferente a
Inactivo ejecutara el código que le sigue, observa que utilizamos un With
MediaPlayer do con el cual nos permite acceder a todos las propiedades de ese
componente. Indicamos al MediaPlayer que el formato del tiempo será en
Milisegundos, posteriormente calculamos la duración del archivo, calculamos su
posición y las pegamos en los Labels. Ha y desde luego vamos recorriendo el
ScroolBar.
Hasta ahora con el código que hemos puesto, nuestra aplicación es capaz de
reproducir vídeo y esta bien pero que tal si le damos un toque mas especialon
como que al presionar las teclas Alt + Enter, el vídeo se vea a pantalla completa y
de igual forma al volverlas a presionar regrese a pantalla normal. Bueno para
lograr eso pon este código en el evento OnKeyDown del Formulario.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (HiWord(GetKeyState(VK_MENU)) <> 0) and (Key = 13) then
begin
if Form1.WindowState = WsNormal then
begin
Ancho := Form1.Width;
Alto := Form1.Height;
Label1.Visible := False;
Label2.Visible := False;
Label3.Visible := False;
Label4.Visible := False;
MediaPlayer1.Visible := False;
BitBtn1.Visible := False;
StatusBar1.Visible := False;
ScrollBar1.Visible := False;
OleContainer1.Visible := False;
Form1.BorderStyle := BsNone;
Form1.WindowState := WsMaximized;
MediaPlayer1.Display := Form1;
MediaPlayer1.DisplayRect :=
rect(0,0,Form1.Clientwidth,Form1.ClientHeight);
end
else
begin
Form1.WindowState := WsNormal;
Form1.Width := Ancho;
Form1.Height := Alto;
Form1.Position := PoScreenCenter;
Label1.Visible := True;
Label2.Visible := True;
Label3.Visible := True;
Label4.Visible := True;
MediaPlayer1.Visible := True;
BitBtn1.Visible := True;
StatusBar1.Visible := True;
ScrollBar1.Visible := True;
OleContainer1.Visible := True;
Form1.BorderStyle := BsSingle;
MediaPlayer1.Display := OleContainer1;
MediaPlayer1.DisplayRect :=
rect(0,0,Form1.Clientwidth,Form1.ClientHeight);
end;
end;
end;
Como puedes ver es mas código verdad, pues si pero es que para reproducir el
vídeo a pantalla completa tenemos que poner en False la propiedad Visible de
todos los componentes Visuales y de igual forma ponerla en True cuando regrese
a pantalla normal. Antes de seguir con el código debes saber que he declarado
dos variables de tipo global para este formulario, las variables son Ancho y Alto,
las utilizo para almacenar el tamaño del Form al momento de maximizarlo a
pantalla completa y de esta forma cuando el usuario regrese a pantalla normal
utilizo el valor de esas variables para volver el Form a su tamaño original.
Las variables Globales del Form las declaras en la cláusula Var del Unit del Form.
esta justo arriba de la cláusula Implementation. mira para que te ubiques te
muestro la parte en donde tienes que declararlas. Ok.
var
Form1: TForm1;
Ancho : Integer; //Aqui estan declaradas
Alto : Integer;
implementation
{$R *.dfm}
Como ves están casi al inicio del Unit. Sí puedes encontrarlo y declararlas verdad.
yo se que si.
Muy bien prosiguiendo con la explicación, estoy utilizando una llamada a
GetKeySatate y Key para saber cuando se presionan las teclas Alt y Enter(Checa
su uso en la pagina de trucos). Ahora cuando se presionan estas teclas resta
saber en que estado se encuentra mi formulario, en caso de que este normal lo
maximizo en caso contrario lo pongo en estado normal, Ahora esto se realiza
checando la propiedad WindowsState.
Cuando maximizo la ventana en las variables globales Ancho y Alto guardo el
valor de las propiedades Width y Height del Form mismas que tienen las
dimensiones del formulario respectivamente. Después Pongo la propiedad Visible
en False de todos los componentes visuales. Enseguida entenderás por que. Hay
te va una nota acerca del MediaPlayer, no nada mas puedes reproducir vídeo en
un OleContainer si no en cualquier superficie plana, como un Panel o el mismo
Form, y es eso lo que hacemos, ponemos la propiedad BorderStyle del form en
BsNone y lo maximizamos, de esta forma el Form abarca toda la pantalla
incluyendo la barra de inicio de windows, bueno despues unicamente resta
indicarle al MediaPlayer que se va a reproducir en el form, y eso lo hacemos
mediante la propiedad Display. Ojo aparte de indicarle que se reproducirá en el
form hay que indicarle las nuevas dimensiones del vídeo mediante la propiedad
DisplayRect. Esto es en si lo que sucede cuando se maximiza.
Órale pues..... cuando se minimiza pues simplemente pones visibles todos los
componentes visuales, volvemos a poner el BorderStyle del Form en BsSingle, la
propiedad WindowsState del form la ponemos en WsNormal, mediante las
variables Globales Ancho y Alto ponemos las dimensiones del Form, le indicamos
al mediaPlayer que se reproducirá en el OleContainer y listo. Hay otras cosillas
pero es básicamente esto.
Baya hasta que termine el ejemplo verdad compadres.... Bueno pero el manual
aun sigue le cuelga siempre muchita información todavía.
Bases de Datos
Baya por fin hemos llegado a una parte que tal vez estabas esperando. Antes de
empezar quiero adelantarles que durante los capítulos siguientes aremos algunas
bases de datos.
Delphi posee su propio motor de base de datos el BDE o Borland Databae Engine
el cual nos permite desarrollar nuestras aplicaciones independizándolas del gestor
de bases de datos. El BDE sirve como traductor entre nuestra aplicación y las
bases de datos que utilizamos funcionando también como interfaz entre los
componentes especializados para bases de datos que posee Delphi. El BDE
cuenta con una biblioteca de funciones conocida como IDAPI (Integrated
Database Applications Program Interface) que es el traductor ante los distintos
gestores de bases de datos para que entiendan lo que nuestra aplicación realiza.
Delphi posee una herramienta que nos permite diseñar nuestras bases de datos,
es un programa llamado Database DeskTop.
Primeramente mostrare las fichas de componentes mas comunes relacionados
con el manejo de bases de datos.
Ficha Data Access
Contiene componentes para realizar conexiones con las bases de datos y obtener
la información que en ella se almacena. A continuación se muestra.
Ficha Data Acces
Imagen Componente Descripción
DataSource
Realiza las conexiones a las bases de
datos.
ClientDataSet
Permite el acceso a datos tanto en una
aplicación estándar como el acceso
desde clientes en sistemas distribuidos.
Ficha Data Controls
En esta ficha se encuentran componentes similares a los de la ficha standard y
Additional pero que estarán ligados a bases de datos permitiendo con esto trabajar
con la información almacenada en ellas.
Imagen Componente Descripción
DbGrid
Presenta los datos en una rejilla de
filas y columnas.
DbNavigator
Posibilita la navegación por los
registros de una tabla permitiendo su
navegación, modificación,
eliminación.
DbText Label vinculado a bases de datos.
DbEdit
Cuadro de texto vinculado a bases de
datos.
DbMemo Memo vinculado a bases de datos.
DbImage Image vinculado a bases de datos.
DbListBox ListBox Vinculado a bases de datos.
DbComboBox
ComboBox vinculado a bases de
datos.
DbCheckBox CheckBox vinculado a bases de datos.
DbRadioGroup
RadioGroup vinculado a bases de
datos.
DbLookupListBox
ListBox que presenta datos de una
tabla y modifica los de otra.
DbLookupComboBox
ComboBox que presenta datos de una
tabla y modifica los de otra.
DbRichEdit RichEdit vinculado a bases de datos.
DbCtrlGrid
Permite personalizar un area de
presentación de datos y permite que el
área actúe como un Dbgrid.
DbChart Chart vinculado a bases de datos.
Ficha BDE
Esta ficha contiene componentes que habilitan la conexión a bases de datos
utilizando el BDE engine de Delphi.
Imagen Componente Descripción
Table
Permite la conexión a una tabla de una base
de datos.
Query
Permite crear y ejecutar consultas SQL a
una base de datos.
StoredProc
Permite ejecutar procedimientos
almacenados en un servidor de bases de
datos.
DataBase Realiza conexiones a servidores remotos.
Session
Gestiona y controla las conexiones activas a
las bases de datos.
BatchMove
Permite realizar acciones sobre los datos
localmente que luego serán enviados al
servidor.
UpdateSQL
Permite realizar actualizaciones en una base
de datos SQL.
NestedTable
Encapsula una tabla que esta anidada dentro
del campo de otra tabla.
BDEClientDataSet
Permite el acceso a datos por parte de
aplicaciones cliente, etc. a través del BDE.
Database DeskTop
Delphi nos permite crear bases de datos en tiempo de ejecución mediante código,
pero también nos brinda la posibilidad de crearlas en tiempo de diseño mediante el
Database Desktop. Esta herramientas nos permite en realidad hacer otras cosillas,
pero no quiero adentrarme mucho en, solo quiero enseñarles lo básico para
continuar con este manual o curso.
Database DeskTop me permite crear tablas de diferente tipo como tablas Paradox,
Dbase, MsAcces, Foxpro, Informix, etc. en este caso nos enfocaremos a crear
tablas de tipo Paradox aunque en su momento are una aclaración cuando es
necesario utilizar algún otro tipo de tabla. OK.
Muy bien para entrar al DataBase DeskTop lo podemos hacer de dos formas, la
primera es accesando desde el menú inicio/programas/Delphi/Database DeskTop.
La otra es Dentro de Delphi te vas al Menú Tools y encontraras la opción
Database Desktop. Muy al accesar al el te aparecerá de la siguiente forma.
Muy bien, antes de seguir quiero explicar que en Delphi se manejan mucho los
alias, los cuales son un identificador para un directorio o carpeta en los cuales se
tienen guardadas las bases de datos. Estos alias son muy útiles ya que
usualmente tienes que indicar la ruta en dónde está tu tabla como por ejemplo
c:programaTablas, ahora el detalle está que cuando pasas tu aplicación a otra
unidad debes cambiar la ruta a cada tabla y recompilar. todo eso se soluciona
pues utilizando alias, de hecho en los programas instaladores como el Install
Shield te permite crear el alias que en tu aplicación ayas puesto, es útil de verdad.
Solo que para estos ejercicios lo are de la forma tradicional solo queria informarles
que existe esa posibilidad, por cierto en el alias DbDemos Delphi guarda algunas
tablas de ejemplo por si después quieres hecharles un ojillo primo.
Muy bien vete al menú que dice File, después al New y por ultimo Table, de esta
forma creamos nosotros una tabla, pero antes nos presenta una pequeña ventana
en la cual nos pide que elijamos que tipo de dato crearemos, si va hacer paradox,
foxpro, etc. te presento esa venta.
Elige Paradox 7, de hecho esta activada por defaul. después de eso te saldrá la
siguiente ventana:
En esta ventana es en donde crearemos la estructura de nuestra base de datos el
campo Field Name contendrá los nombres de los campos de nuestra base de
datos que en este ejemplo serán: Clave, producto, proveedor, precio y mínimo.
Después está otra leyenda que dice Type, contendrá el tipo de dato que será
nuestro campo, para seleccionar el tipo de dato basta con situarnos en Type y
presionar la barra espaciadora y nos desplegara todos los tipos de datos, de
cualquier forma si sabemos su tecla abreviada se la podemos escribir
directamente.
Está la leyenda que dice Size la cual indica el tamaño del campo, eso se lo
indicamos tecleándolos directamente.
Por ultimo está la leyenda Key, sirve para indicar cuales campos serán nuestras
claves primarias. para elegir un campo como clave primaria posicionate en Key y
presiona la barra espaciadora, se pondrá un asterisco en señal de que es clave
primaria.
Ahora quiero que hagas la siguiente estructura:
Field Name Type Size Key
Clave I (Long Integer) * (Clave Primaria)
Producto A (Alpha) 40
Cantidad N (Numeric)
Precio $ (Money)
Minimo I (Integer)
Muy bien ya que tecleaste esta estructura quiero que te ubiques en la parte
izquierda de tu ventana, encontraras una leyenda que dice Table Properties y
debajo de ella un especie de Combobox. Ese combobox contiene las propiedades
de la tabla que tu puedes configurar. No entrare en mas detalles, solo te digo que
experimentes un poco con ellas.
No vamos a crear algún índice secundario en esta tabla por que usaremos
algunas sentencias Sql en búsquedas por producto con propósito de aprendizaje,
por lo tanto no es necesario crearlo.
Muy bien ahora solo quiero que des Click en el botón que dice Save As, y
guardes la tabla en el directorio c:Ejemplo con el nombre de Inventario. Para crear
el directorio vete al explorador ó Mi PC y simplemente vete a la unidad C y créala.
De igual forma como creaste esta tabla quiero que hagas las siguientes tablas y
las guardes en el mismo directorio OK.
Tabla Ventas (que sea paradox 7).
Field Names Type Size Key
Fecha D
*
Ingreso $
Guardala con el nombre de ventas OK.
Tabla Auxiliar (que sea paradox 7).
Field Names Type Size Key
Clave I
Cantidad N
Producto A
40
Precio $
Subtotal $
Guardala con el nombre de Auxiliar OK.
El ejercicio que realizaremos se trata de un sistema que controla un inventario de
productos, ventas de productos y generación de reportes de las utilidades, en este
momento hemos creado las bases de datos, pero falta explicar muchas cosas que
son necesarias por lo tanto conforme se expliquen se le ira avanzando al sistema
Ok.
Componente TTable
Es un componente no visual y se encuentra en la ficha BDE.
Cuando se trabaja con una base de datos, el principal responsable de
prácticamente todo es el componente Table. Este componente es el encargado de
leer, escribir, actualizar, etc la base de datos a la cual esta conectado, y forma una
pareja muy útil con el componente Datasource, el cual es el encargado de
conectar el componente table con los controles usados para visualizar los datos.
La primera propiedad que se debe modificar en el componente es la que hace
referencia a que base de datos queremos conectar el componente y se trata de la
propiedad DatabaseName. Existen dos formas de indicarle la base de datos que
usaremos, una es dándole toda la ruta que en nuestro caso seria C:EJEMPLO o
indicando el alias que se haya definido en el sistema que es lo mas recomendable
utilizar los alias pero bueno esa es otra historia digiera chonita.
Bueno después de esto es necesario indicarle la tabla que se va a utilizar y esto
se hace en la propiedad TableName, esta propiedad me listara todas las tablas
existentes en la ruta o alias que pusimos en el DatabaseName, posteriormente la
propiedad Active se tendrá que poner en True para poder manipular la tabla.
Existen otras propiedades interesantes como IndexFieldNames que es para
indicarle el índice que usaremos en la tabla. Desde luego mostrara las claves
primarias que se hayan puesto cuando se diseño la B.D. Existe otra propiedad
para los índices secundarios que funciona exactamente igual y es la propiedad
IndexName.
El componente Table tiene una larga lista de eventos, que se pueden dividir en
tres grupos, los eventos que se producen antes de un operación como una
apertura, cierre, lectura, etc., los cuales empiezan por la palabra Before, luego
están los eventos que se producen en el momento y cuyo nombre empieza por
On y por ultimo los eventos que se producen después, cuyo nombre empieza por
After . A continuación te listo los principales eventos del componente Table.
AfterDelete Se genera después del borrado de un registro
AfterEdit Se genera después de editar un registro
AfterInsert Después de Insertar
After Post Después de grabar los datos
BeforeCancel Antes de cancelar la operación
BeforeClose Antes de que se cierre la tabla
BeforeDelete Antes de borrar un registro
BeforeEdit Antes de editar el registro actual
BeforeInsert Antes de insertar un registro
BeforeOpen Antes de abrir la tabla
BeforePost Antes de guardar los datos
OnCalcFields
Se genera cuando se va a calcular el valor de un
campo
OnDeleteError Cuando se produce un error al borrar un registro
OnEditError Cuando hay un error al editar un registro
OnFilterRecord Cuando se activa el filtrado
OnNewRecord Cuando se añade un registro
OnPostError Cuando hay un error durante el grabado de datos
Ahora te listare las operaciones mas comunes que se realizan en un componente
Ttable.
Open Se abre la tabla
Close Se cierra la tabla
Edit Para editar el campo actual
Insert Añade datos a la tabla
Post Graba los datos
Cancel Cancela la operación actual
Delete Borra el registro actual de la tabla
First Se va al primer registro de la tabla.
Last Se va al ultimo registro de la tabla.
Next Avanza al siguiente registro.
Prior Retrocede un registro.
Cuando se manejan bases de datos es común que necesitemos acceder a los sus
campos mediante código y precisamente un método de acerlo es utilizando
FieldByName.
Accesos fisicos a la tabla utilizando FieldByName . . .
FieldByName permite el acceso al objeto Tfield asociado a un determinado campo
a partir del nombre del campo en la tabla su sintaxis es de la siguiente forma:
Function FieldByName(Const NombreCampo: String): TField;
No te espantes es fácil utilizarlo por ejemplo en nuestra base de datos Inventario
que acabamos de crear si queremos acceder al campo Producto y asignarle un
nombre seria de la siguiente forma:
Table1.FieldByName('Producto').AsString := 'Sabritas';
Como ves primeramente va el nombre del componente Table que estará ligada a
nuestra base de datos física, posteriormente escribimos FieldByName en el cual
dentro de paréntesis y entre comillas simples indicaremos el nombre del campo al
cual aremos referencia, por ultimo bastara con indicarle el tipo de dato que es el
campo al cual hacemos referencia, que por cierto eso lo indicamos con el .As. En
caso de que quieras leer el valor de un campo y asignarlo a una variable pues
simplemente cambia la posición de la línea de código anteriormente escrita solo
recuerda que los tipos de datos sean iguales.
Inicio y fin de la Tabla . . .
Cuando en un desplazamiento sobre la tabla se llega a su inicio o a su final se
modifican las propiedades Bof y Eof. La propiedad Bof toma el valor True cuando
se esta en el primer registro de la tabla y la propiedad Eof toma el valor True
cuando se esta en el ultimo registro de la tabla o cuando la tabla esta vacía. Por
ejemplo para saber si se ha llegado al final de la tabla seria:
If Table1.Eof = True then
ShowMessage('SE ESTA EN EL FINAL DE LA TABLA');
Ordenación de Registros . . .
Una vez que se ha definido un DataSet los registros que contiene se encuentran
ordenados por su índice activo y este índice queda determinado por el valor de la
propiedad IndexName del componente TTable si no se especifica u índice
secundario se tomara el índice primario. Otra forma de ordenar la tabla es
utilizando la propiedad IndexFieldNames en la cual se pondrá el índice primario
por el cual se quiere ordenar. Los índices previamente se tuvieron que haber
declarado en la tabla. En tiempo de ejecución también se puede cambiar el índice
de ordenación, por ejemplo el código para ordenar la tabla Inventario a través de
su Clave primaria seria así.
Table1.IndexFieldNames := 'Clave';
Como puedes ver simplemente se le asigna el nombre del índice a la propiedad
IndexFieldNames. Es de igual forma para la propiedad IndexName.
Búsquedas de Registros . . .
El componente Table proporciona una serie de herramientas para realizar
búsquedas de registros con la limitación de que solo se realizaran con campos
indexados, yo utilizare el método mas común y menos problemático que es el
método directo.
Mediante el método FindKey se busca en la tabla para encontrar un registro en el
que sus campos índices coincidan con los que se han pasado como argumentos
en un array de valores separados por comas, regresa un valor Falso O Verdadero
dependiendo si tuvo éxito o no en la búsqueda. Por ejemplo en la tabla Inventarios
para buscar un producto se escribiría el siguiente código.
If Table1.FindKey([Edit1.Text]) = True Then
ShowMessage('Producto Localizado')
Else
ShowMessage('Producto no encontrado');
Como puedes ver simplemente va el nombre del componente Table que
previamente nosotros lo ligaremos a la B.D., posteriormente va FindKey en el cual
entre paréntesis y corchetes ponemos la variable o el dato a buscar que en este
caso estoy suponiendo que en un Edit el usuario escribió el producto que desea
buscar. Ahora como el método devuelve un valor True cuando se tiene éxito pues
solo lo comparo con un if igualado a True.
Ahora si deseas que el sistema en caso de que no encuentre el registro se
posicione en el registro mas cercano al buscado se pondría la siguiente
Instrucción.
If Table1.FindKey([Edit1.Text]) = True Then
ShowMessage('Producto Localizado')
Else
Table1.FindNearest([Edit1.Text]);
Como puedes ver esto lo hice utilizando la instrucción FindNearest.
Aunque Ami en lo particular me gusta utilizar este método y cuando necesito
realizar una búsqueda por un campo que no es índice utilizo el SQL pues... no le
aunque les explicare el otro método existente para busquedas.
El otro método de búsquedas es Locate, el cual nos permite buscar por una
condición en un columna o por varias columnas. Locate es una función que
devuelve True o False según ha tenido éxito o no, y si su busqueda fue exitosa la
tabla muestra la fila que cumplió la condición. Para usar este método se han de
pasar una serie de parámetros y a continuación te muestro su sintaxis:
Locate(const KeyFields : string; const KeyValues : Variant; Options :
TLocateOptions)
El primer parámetro es el campo o campos por los cuales queremos hacer la
búsqueda, por ejemplo en nuestra tabla Inventario hay un campo en el cual
guardamos el nombre de los productos y siqueremos realizar una búsqueda por
este campo es en este primer parámetro donde debemos poner el nombre del
campo.
El segundo contiene la condición, por ejemplo si estamos buscando productos
según su proveedor es aquí en donde lo pondríamos. El ejemplo quedaría así:
Table1.Locate ('Producto','CocaCola',[]);
Por último esta Options, el cual indica como se ha de realizar la búsqueda, si se
ignoran las mayúsculas, si se hacen búsquedas parciales en los campos
Alfanuméricos, etc, esto quiere decir que se mostraran las filas que contengan
CocaCola en sus respectivos campos además que otros datos, o sea que la
busqueda no es exacta. Por ejemplo:
Table1.Locate ('Producto','CocaCola',[ loCaseInsensitive]);
Recuerda que te dije que el componente Table va íntimamente relacionado con el
DataSource, pos es cierto así es que te te explicare su funcionamiento.
DataSource
El componente table pertenece a un grupo de componentes que son derivan del
componente TDataset, estos componentes acceden por diferentes caminos a los
datos, por lo que la interfaz obtenida difiere según el componente empleado. Para
que los diferentes controles que muestran los datos sean capaces de acceder a
esta variedad de interfaces pues se utiliza el DataSource el cual es un
componente intermedio el cual tiene la tarea de mostrar una interfaz común a
todos los controles.
La propiedad mas importante del DataSource es DataSet en la cual se pondrá la
tabla que queremos ligar a el.
Controles Data-Aware
Son los que se encuentran en la ficha DataAcces y Excepto por el componente
DbNavigator el resto de los componentes son utilizados para presentar los datos
de las tablas. Uno de los componentes mas comunes sin duda es el Dbgrid el cual
esta constituido por un conjunto de rejillas a través de las cuales nos presenta la
información de las tablas. A continuación te lo explicare.
Componente DBGrid . . .
Nos sirve para visualizar información almacenada en una tabla, pero aparte de eso
podemos también realizar inserciones, ediciones, modificaciones, etc. y cuenta
con varias propiedades y métodos que nos ofrecen una amplia gama de
configuraciones tanto para el aspecto como para el funcionamiento del control.
La propiedad principal es DataSource, es aquí en donde indicamos el datasource
al cual queremos vincularlo. En caso de que el DataSource se encuentre en otro
formulario pues simplemente se le escribe el nombre del formulario en el que se
encuentra y su dataSource, por ejemplo supongamos que tengo 2 formularios en
el primero tengo mi tabla y mi DataSource1 y en el segundo formulario tengo un
DbGrid1 pues simplemente para ligarlo en su propiedad DataSource pondría
Form1.DataSource1 y presto es todo. Después existen otras propiedades
interesantes como Options que a continuación describo.
dsEditing
El usuario puede editar los datos sobre la
rejilla
dgAlwaysShowEditor
La rejilla esta en modo edición, no hace
falta pulsar F2
dgTitles Muestra los títulos de las columnas
dgIndicator
Se muestra un indicador para conocer el
registro activo
dgColumnResize
Permite cambiar el ancho de las
columnas
dgColLins
Dibuja líneas de separación entre las
columnas
dgRowLines Dibuja líneas de separación entre las filas
dgTabs
Se puede navegar por el componente
usado la tecla Tab
dgRowSelect
Selecciona filas completas en lugar de
filas
dgConfirmDelete
Permite borrar registros, mostrando un
mensaje
dgCancelOnExit Cancelas las inserciones vacías al salir
del control
dgMultiSelect
Permite seleccionar múltiples filas a la
vez
Hasta ahora esta bien con el DBGrid pero su verdadera potencialidad se
encuentra en la propiedad Columns, que encapsula tanto el aspecto de las
columnas como los campos de las tablas o consultas SQL que están ligadas al la
columna. Cuando no se definen columnas en un DBGrid automáticamente el
control creara una columna para cada campo de nuestra base de datos. Para
accesar al editor de columnas basta con dar doble click sobre el componente o dar
un click con el botón secundario y elegir la opción Columns Editor del menú
emergente, saldrá la siguiente ventana.
Para este pequeño ejemplo es necesario que hagas lo siguiente:
1. Pon un componente Table, en su propiedad DataBasename elige DBDemos, en
su propiedad TableName elige la tabla Animals, pon la propiedad Active en True.
2. Coloca un componente DataSource y en su propiedad DataSet pon Table1.
3. Coloca un componente DbGrid y en su propiedad DataSource pon
DataSource1.
Ahora viene algo importante, hasta ahora nos mostrara todos los campos de la
tabla en nuestro DBGrid por lo tanto quiero que des doble Click sobre el DBGrid y
aparecerá el editor de columnas, pero sorpresa verdad esta vacío y eso es por
que no se han definido y para definirlos basta con dar un click en el tercer icono
que dice Add All Fields y nos agregara una columna para cada campo de nuestra
base de datos empezando por un índice cero, bien ahora ya tengo todos los
campos de mi base de datos por lo tanto si quiero borrar algunos bastara con
seleccionarlos y dar un click en el segundo icono que dice Delete Selected (Del),
cabe mencionar que no solo puedo borrar algunos campos que no quiera si no
que también puedo cambiar el orden de las columnas arrastrando con el puntero
del ratón a la posición que deseo un campo en particular.
Cuando estoy en el editor de columnas y selecciono una de ellas cambiaran las
propiedades en el inspector de objetos brindándonos con esto ciertas opciones
que podremos modificar, a continuación te las describo.
Alignment Alineación de la columna
Button style
Permite desplegar un lista con valores, o un
botón
Color Color de fondo de la columna
DropDown
Rows
Número de filas desplegables
FieldName Nombre del campo que se visualiza
Font
Fuente con la que se muestra la información
de la columna
PickList
Lista de valores que aparecerán al desplegar
la columna
ReadOnly Esta columna solo es de lectura
Width Ancho de la columna en Pixels
Title Título de la columna
Ahora la opción Title tiene ciertas propiedades que son interesantes es por eso
pariente que las describo.
La propiedad PickList es una propiedad que apunta a una lista de String y el
efecto que produce es que en la columna donde se ponga se muestra un menú
desplegable que se activara con el ratón y contendrá todo lo que hayamos puesto
AlignmentAlineación de la cabecera de columna
Caption Texto que muestra la cabecera de la columna
Color Color fondo de la cabecera
Font Fuente con la que mostrara la cabecera
en la propiedad PickList, solo ten cuidado ya que la propiedad ButtonStyle debe
ser cbsAuto.
Se puede manipular información y realizar operaciones con los campos del
DBGrid los métodos mas comunes son el
DbGrid1.Columns[número_columna].Propiedad y
DbGrid1.Fields[número_columna].propiedad. Todo dependerá de que tipo de
operación deseo realizar.
DBNAvigator . . .
Este control tiene incorporada las funcionalidades mas comunes que se realizan
sobre una base de datos ya que con el podemos navegar entre los registros,
eliminar un registro, ponerlo en modo de edición, insertar registros, etc. su
propiedad mas importante es la DataSource en la cual se tiene que indicar el
DataSource sobre el cual trabajara. Describo los botones del navegador.
Botón Método Descripción
nbFirst First
Salta al primer registro de la
tabla. Desactiva los botones
First y prior y activa Next y
Last si no lo estaban.
nbPrior Prior
Retrocede al registro anterior
del actual, activa Next y
Last.
nbNext Next
Avanza al registro posterior
al actual, activa First y Prior.
nbLast Last
Salta al ultimo registro de la
tabla, desabilita Next y Last
y activa First y Prior.
nbInsert Insert
Inserta un nuevo registro en
la posicion anterior al
registro actual, modifica el
estado de la tabla a modo de
Edicion.
nbDelete Delete
Borra el registro actual y se
posiciona en el registro
siguiente
nbEdit Edit
Pone la tabla en modo de
edición, con lo cual se
pueden modificar los datos
del registro.
nbPost Post Escribe en la base de datos
los cambios realizados sobre
el registro activo.
nbCancel Cancel
Cancela la edición del
registro activo y recupero
los datos anteriores.
nbRefresh Refresh
Refresca la tabla o la
actualiza.
Una propiedad interesante es la propiedad VisibleButtons que contiene todos los
botones que nos presenta el DBNavigator, basta con poner en false los que no
queramos que se muestren.
La propiedad Hints permite colocar una leyenda para cada botón, si desactivaste
algún botón su leyenda solo déjala en blanco. sale primo.
La propiedad ConfirmDelete recibe un valor Booleano y esta en True por defaul y
lo que realiza es mandarnos un mensaje de advertencia cuando se trata de borrar
un registro.
Ahora a nuestro formulario por favor colócale un DbNavigator y listo podrás
recorrer los campos de la tabla Animals que pusimos anteriormente, solo recuerda
poner en la Propiedad DataSource del DBNavigator DataSource1.
DBEdit, DBText (Ficha DataAcces). . .
El componente DBEdit esta diseñado tanto para presentar datos como para
introducir datos en una tabla y su propiedad mas importante es DataSource, la
cual hará referencia a la tabla con la que se trabajara.
La propiedad DataField Indica el campo de la base de datos con el cual se
trabajara. Esta propiedad mostrara todos los campos de la tabla solo tienes que
elegir cual quieres.
Otra propiedad interesante podría ser ReadOnly la cual recibe un valor Boolano y
sirve para poner el campo en solo lectura desabilitando de esta forma que se
capture información sobre el. Las demás propiedades son iguales a las del Edit.
El componente DBText esta diseñado solo para presentar información. Tiene el
aspecto de un Label solo que a diferencia de este ultimo, mostrara la información
contenida en un registro de la base de datos, no se puede introducir información
en un DBText.
Sus propiedades mas interesantes son el DataSource y DataField, las cuales
funcionan igual que las del DBEdit.
NOTA: Todos estos componentes funcionan a través de las propiedades
DataSource y DataField, solo es cuestión que indagues sobre ellos un poco y tu
mismo descubrirás su funcionalidad.
BUSQUEDAS SQL. . .
Para poder ejecutar una consulta SQL es necesario añadir un componente
TQuery. Con el componente TQuery podemos acceder a varias tablas a la vez o
filtrar dinámicamente cualquier tipo de registros.
La ejecución de una consulta SQL entrega como resultado una nueva tabla, las
características de esta tabla son en principio independientes de la base de datos.
A continuación te listo algunas sentencias SQL.
Propiedades de TQuery.
Propiedad Descripción
DataBaseName Nombre de la base de datos a la que se accede.
SQL
Array de string que contiene la consulta que dará lugar a la
nueva tabla.
Active
Provoca la presentación inmediata de los datos ejecutando
la consulta.
Params Array que incluye los parámetros de una consulta.
RequestLive
Permite modificar los registros que fueron resultado de una
consulta.
Metodos de TQuery.
Método Descripción
ExecSQL
Ejecuta la sentencia SQL sea o no de selección de
registros.
Open Ejecuta una consulta SQL de selección de registros.
Close Cierra el componente.
First
Last
Next
Prior
MoveBy
Navegación por los registros de la tabla.
Append Métodos para Insertar Registros.
Insert
AppendRecord
InsertRecord
Delete Borrar el registro actual.
Edit Permite modificar el registro actual.
La mayoría de las operaciones son similares a las que se realizan en un
componente TTable. Las consultas que se definen en la propiedad SQL. se
ejecutaran en tiempo de ejecución mediante los métodos Open y ExecSQL, en
donde Open se utiliza en consultas que devuelven una nueva tabla (Sentencias
Select) y ExecSql en aquellas que no devuelven ningún registro como una
eliminación o inserción.
Un componente TQuery difiere de un
componente TTable en que puede
acceder directamente a mas de una tabla
y sobre todo que permite seleccionar que
registros y que columnas se desean
presentar. haremos un ejemplo para que
quede mas claro el asunto.
Crea una nueva aplicación Delphi. Sobre
el formulario pon un componente TQuery
que esta en la ficha BDE.
En su propiedad DataBaseName pon
C:EJEMPLO que es el directorio en el
cual guardamos la tabla inventario.
Coloca un componente DataSource, en
su propiedad DataSet pon Query1.
Coloca un componente Label, en su propiedad Caption pon Producto.
Coloca en frente del Label un componente Edit.
Coloca un componente DbGrid, en su propiedad DataSource pon DataSource1.
Coloca un componente BitBtn.
Ahora el diseño quedaría mas o menos así.
Muy bien ahora viene lo interesante tienes que recordar que en la propiedad SQL
del Query es donde introduciremos el código SQL para realizar la búsqueda, ahora
debemos tomar en cuenta que es un array y que nosotros estamos manejando
una variable que es el nombre del producto a buscar mismo que se guarda en el
Edit1. Por lo tanto para generar la consulta es necesario realizar una serie de
concatenaciones que para no hacértela pesada pariente de muestro el codigo que
pondrías en el evento Onclick del BitBtn.
procedure TForm1.BitBtn1Click(Sender: TObject);
var consulta : String;
begin
consulta := 'SELECT PRODUCTO, PRECIO FROM INVENTARIO.DB WHERE
PRODUCTO LIKE ''';
consulta := consulta + '%';
consulta := consulta + EDIT1.Text;
consulta := consulta + '%';
consulta:=consulta + '''';
consulta:=consulta + ' ORDER BY PRODUCTO';
QUERY1.SQL.Clear;
QUERY1.SQL.ADD(consulta);
QUERY1.Active := TRUE;
QUERY1.Open;
end;
Para generar la consulta estoy utilizando la instrucción SELECT la cual tiene la
siguiente sintaxis:
SELECT Col1 [, Col2]
FROM Tabla
[WHERE Predicado]
[ORDER BY Columna]
En donde Col1 y Col2 son los nombres de las columnas de las tablas, en caso de
que se quieran mostrar todas las columnas utiliza el asterisco ( * ).
El predicado es una condición. La columna especificada en la cláusula ORDER BY
tiene que ser una de las columnas seleccionadas en la sentencia SELECT.
Yo en el ejemplo utilizo SELECT PRODUCTO, PRECIO FROM INVENTARIO.DB
WHERE PRODUCTO LIKE '''; muy bien explicare por pasos hasta where no creo
que haya problemas por que después del SELECT van las columnas que mostrare
en mi DBGrid despues mediante el form indico la tabla a la cual accedere y
mediante el WHERE condiciono la búsqueda, solo que les explicare que chingaos
es lo que me realiza LIKE.
LIKE lo que me permite es realizar búsquedas parciales o de semejanza, es decir
supongamos que yo no se el nombre completo de un producto, entonces que hago
bueno pues introduzco hasta donde se del nombre del producto y el sistema
buscara registro por registro donde haya semejanza con la cadena introducida. Es
como cuando buscamos archivos o carpetas en windows si ponemos imágenes
me mostrara todas las carpetas o archivos que se llamen imágenes o que en
alguna parte de su nombre diga imágenes. Creo que con esto quedo explicado
LIKE.
Ahora bien para utilizar el LIKE es necesario echar mano de un comodín que es el
% el cual deberá ir entre comillas simples. Por lo tanto entonces LIKE debera estar
por ejemplo LIKE '%COCA%'. Es por eso que al inicio y al final del SELECT le
pongo un % y entre los % coloco el contenido del Edit1.
Ahora comprendes por que utilizo una variable y realizo varias concatenaciones.
Bueno parientes después de que pongo toda la consulta que quiero realizar en la
variable consulta simplemente se la agrego a la propiedad SQL del Query
mediante QUERY1.SQL.ADD(consulta) y posteriormente Activo la consulta con
QUERY1.Active := TRUE Y QUERY1.Open para ejecutar la consulta.
Las consultas SQL tienen mucha mas potencialidad que lo que aquí te estoy
explicando te recomiendo que bajes algun manual sobre SQL y lo estudies de
cualquier forma el Query soporta la mayoría de las instrucciones SQL utilizadas.
Pariente solo te queda correr el programa y experimentar con el. Solo agrégale
algunos productos a la base de datos por que seguramente estará en blanco.
Puedes utilizar el DBGrid y DBNavigator que por cierto ya te los explique verdad.
Vamos amigo no te desanimes que todavía faltan los reportes y claro el ejercicio
final con nuestras bases de datos.
Reportes con QuickReport
Una cosa es utilizar el objeto Tprinter para mandar a impresión los archivos,
gráficos, etc., y otra muy distinta utilizar el QuikReport para la impresión de
información contenida en bases de datos.
Delphi dedica una ficha exclusiva para el manejo de impresiones, la cual es
Qreport de entre los cuales el componente mas importante es precisamente el
QuickReport. Esta ficha contiene a su vez un conjunto de componentes que se
direccionan directamente a los campos de las bases de datos permitiendo con
esto que la generación de informes sea verdaderamente sencilla. Bueno para que
veas que no soy gacho te explico algunos componentes de esa ficha.
Ficha QReport
Contiene 23 componentes que facilitan la creación de informes. Te describo solo
algunos de ellos.
Ficha QReport.
Componente Tipo Descripción
QuickReport
Control que agrupa el documento
QuickReport para añadir facilidades de
impresión de informes.
QRSubDetail Vincula DataSets adicionales al informe.
QRStringsBand Es un contenedor de objetos visuales.
QRBand
Presenta datos de fuentes que no son
bases de datos.
QRChildBand
Expanden a un componente QRBand con
el que se vinculan.
QRGroup Crea grupos de datos.
QRLabel Escribe Texto en un informe.
QRDBtext
Escribe texto vinculado a un campo de
una B.D. en un informe.
QRMemo Escribe texto multilínea en un informe.
QRRichText
Escribe texto con formato RTF en un
informe.
QRDBRichText
Escribe un campo de la base de datos
que contiene texto en formato RTF.
QRShape
Dibuja Líneas, Polígonos y Círculos en un
informe.
QRImage Dibuja imágenes en un informe.
QRDBImage
Dibuja un campo de la B.D. que contiene
una imagen.
QRChart Dibuja Gráficos en un informe.
Hay que mencionar que Delphi posee un asistente que te ayuda a generar
automáticamente el reporte, durante el proceso tu le indicas la tabla, los registros
que quieres imprimir, el tipo de reporte, etc. pero bueno eso lo puedes
experimentar por ti mismo esta en File/News/Others te saldrá una ventana elige la
pestaña de Business y el icono que dice QuickReport Wizad.
Para generar un informe es necesario crear un nuevo formulario y sobre el insertar
el componente QuickReport que será el contenedor de todos los demás
componentes que utilizaremos para nuestro informe. Al momento de colocar el
QuickReport saldrán las barras de desplazamiento del formulario eso por que el
área del QuickReport es mayor a la del formulario.
Tabla con las propiedades mas interesantes:
Propiedad Descripción
DataSet
La propiedad DataSet del QuickReport nos sirve
para indicarle sobre que tabla se estará
trabajando, en caso de que la tabla se tuviera en
otro formulario pues simplemente se le pone el
nombre del formulario en el que esta, seguido
del nombre de la tabla.
ShowProgress
Indica si se visualiza una ventana mientras se
generan datos a incluir en el informe, indicando
el estado de preparación del informe.
PrintEmpty
Controla si se debe imprimir el informe en el
caso de que no tenga ningún dato.
PrinterSetting
Contiene un subconjunto de propiedades
relacionadas con la configuración de la
impresora, copias a imprimir, impresión
multipágina, etc.
Bands
Contiene los distintos tipos de bandas para
nuestro informe.
Options
Permite la impresión del encabezado en la
primera pagina y el pie en la ultima.
Componente QRBand . . .
Un informe compadres esta dividido en varias secciones como lo son la cabecera
de pagina, el titulo, la cabecera de columnas, el pie de pagina, etc., y este
componente nos permite definir todas estas secciones comportándose como un
contenedor para cada una de esas secciones. Una de sus principales propiedades
es BandType en la cual indicamos el tipo de banda que utilizaremos pero bueno
no te aguites compita a continuación te listo los posibles valores para esta
propiedad.
Tipos de Bandas . . .
Constante Descripción
rbTitle
Banda con el titulo del informe y se imprime solo
en la primera pagina.
rbPageHeader
Cabecera de todas las paginas del informe, esta
se va a imprimir en la primera pagina
dependiendo del valor de la propiedad
TQuickRep.Options.FirstPageHeader.
rbPageFooter
Es el pie de pagina y se va a imprimir en la
ultima pagina dependiendo del valor de la
propiedad TQuickRep.Options.LastPageFooter.
rbSummary
Es un sumario que se imprime solo en la ultima
pagina al final de todos los datos.
rbColumnHeader
Es el titulo de cada columna de datos y se
imprime en cada pagina.
rbDetail
Registros del informe, se imprime una fila por
cada registro del DataSet del informe.
rbChild
Es una banda especial que permite extender la
presentación de los registros de un informe.
rbSubDetail
Es una banda especial que permite la
agrupación de los registros en grupos de detalle.
rbGroupHeader Es la cabecera de los grupos de detalle.
rbGroupFotter Es el pie de los grupos de detalle.
Los componentes especiales para bases de datos como el QRDBText funcionan
exactamente igual que los componentes contenidos en la ficha DataControls,
contienen una propiedad que dice DataSet en la cual indicaremos la tabla de la
cual jalara la información, después esta la propiedad DataField en la cual
indicaremos el campo de la base de datos que queremos imprimir.
Si utilizamos un QuickReport pues es por que necesitamos imprimir información
contenida en una tabla por lo tanto haremos un sencillo ejercicio en el cual
utilizaremos dos formularios en el primero mostraremos los registros de la tabla
animals que trae Delphi de ejemplo y en el segundo mostraremos una
previsualización de un QuicReport. Ahora por favor crea una nueva aplicación
coloca un componente Table sobre el formulario, en su propiedad DataBaseName
pon DBDemos, en su propiedad TableName pon Animals, despues solo vete a la
propiedad Active y ponla en True. Después de esto coloca un componente
DataSource y lígalo al componente Table.
Coloca un componente DBgrid y lígalo al DataSource. Ahora dale doble Click
sobre el componente y te sacara el Editor de Columnas dale sobre el tercer icono
que dice Add All Field, con esto te agregara todos los campos de la base de
datos, selecciona el campo que dice BMP que por cierto es el ultimo y tiene el
índice 4. Muy bien ya que lo seleccionaste presiona la tecla Suprimir para que lo
elimines. Después de esto cierra el editor de columnas.
Después coloca un DBNavigator y lígalo también al DataSource.
Coloca un componente DBImage que por cierto también esta en la ficha
DataControls, liga este componente al DataSource y en su propiedad DataField
busca el campo que dice BMP y selecciónalo. Ojo mediante la propiedad
DataSource del DBImage lo ligaras al componente DataSource.
Pon un Componente Button en el cual diga Imprimir. ahora el diseño del primer
formulario quedaría así.
Ahora solo pon Dos Labels en el primero pon Lista de animales y colócalo arriba
del DBGrid y al segundo ponle Imagen y ponlo arriba del componente DBIMage.
Muy bien el diseño quedaría de la siguiente forma:
Muy bien ya tenemos el primer formulario, ahora añade o crea otro formulario en
tu aplicación.
Sobre este segundo formulario coloca un componente QuikRep. ya que lo
colocaste vete a la propiedad Bands y la opción HasDetail ponla en True (con esto
automáticamente te genera una banda de tipo Detail sobre el QuickRep). Después
vete a la propiedad DataSet y ponle Form1.Table1.
Ahora coloca un componente QRBand sobre el QuikRep. te pondrá otra banda por
defaul de tipo Title. Vete a su propiedad Fames la cual contendrá varias opciones,
la opción DrawBootom ponla en True, esto nos pone una línea horizontal al final
de la banda.
Ahora coloca un componente QRLabel sobre el componente QRBand que dice
title en su parte inferior izquierda. Vete a la propiedad Caption del QRLabel y ponle
Impresión de Animales. Después ve a la propiedad AlignToBand y ponla en True,
ahora ve a la propiedad AlignMent y elige la opción taCenter. Con esto logramos
que se centre la etiqueta sobre la banda.
Pon otros dos QRLabel sobre el QRBand a uno ponle en su propiedad caption
Animal y al otro ponle Imagen. y colócalos uno después del otro en forma
horizontal dejando una distancia entre ellos.
Ahora pon un componente QRDBText en la otra Banda que dice Detail, vete a la
propiedad DataSet y ponle Form1. Table1 Después ve a la propiedad DataField y
elige el campo NAME. alinea este componente en dirección al QRLabel que dice
Animal.
Coloca un componente QRDBImage sobre la banda Detail, ve a la propiedad
DataSet y también ponle Form1.Table1 Después ve a la propiedad DataField y
elige el campo que dice BMP.
Ahora solo ajusta la anchura de la banda Detail para que se vea todo el
componente QRDBImage. de cualquier forma te muestro el diseño.
Con esto hemos terminado nuestro reporte ahora solo necesitamos mandarlo
llamar desde el botón imprimir del formulario uno, así que vete al formulario uno y
en el evento onclick del Botón pon este código.
Form2.QuickRep1.Preview;
Después de escribir esto corre tu programa, órale primo verdad al correrlo te
mandara el siguiente mensaje.
Este mensaje te lo manda por que en el formulario uno estamos haciendo
referencia al formulario dos y es necesario declararlo en el implementation, pero
no te preocupes Delphi lo hace por ti, solo dale Click en el botón de Yes y listo
vuelve a correr tu programa y experimenta con el.
Te voy a dar unas notillas sobre los métodos de mandar a impresión.
Método Descripción
Print
Imprime el informe directamente sobre
la impresora predeterminada de
windows.
Preview
Despliega la misma ventana de
previsualización que puede verse en
diseño. Es una ventana estándar de
QuickReport pero se puede utilizar
cualquier otra utilizando el método
TQuickRep.OnPreview.
PrintBackGround
Crea un proceso en segundo plano
para imprimir el informe y devuelve
instantáneamente la ejecución a la
aplicación.
Muy bien ahora para terminar este curso o manual como quiera que le llames falta
realizar una pequeña aplicación en la cual utilizaremos las bases de datos creadas
anteriormente en el Database DeskTop. La aplicación va a ser muy sencilla, será
un modulo de Inventario con todas su operaciones sobre los productos, un modulo
de ventas y otro de consultas de utilidades pero bueno mejor dale continuar
pariente.
Creación de la Aplicación
Bueno ha llegado el momento de que pongamos en practica lo que aprendimos,
así que crea una nueva aplicación en Delphi.
Al Caption del Formulario ponle Sistema de Ventas, biMaximize de la propiedad
BorderIcons ponla en False, la propiedad Position ponla en poScreenCenter.
Coloca un Panel, su propiedad AlignMent ponla en Top, deja su Caption en blanco
bórrale lo que tiene.
Sobre el panel coloca cuatro SpeedButtons en orden de izquierda a derecha
ponles el siguiente texto en su Caption.
1)Salir
2)Almacén
3)Ventas
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0
Manual de delphi 6.0

Más contenido relacionado

Similar a Manual de delphi 6.0 (20)

Guia para programar_vba_excel
Guia para programar_vba_excelGuia para programar_vba_excel
Guia para programar_vba_excel
 
fundamentos de programacion web
fundamentos de programacion webfundamentos de programacion web
fundamentos de programacion web
 
Presentación_VisualBasic
Presentación_VisualBasicPresentación_VisualBasic
Presentación_VisualBasic
 
Presentación de VisualBasic
Presentación de VisualBasicPresentación de VisualBasic
Presentación de VisualBasic
 
office
officeoffice
office
 
Conociendo Visual Basic
Conociendo Visual BasicConociendo Visual Basic
Conociendo Visual Basic
 
Presentación1
Presentación1Presentación1
Presentación1
 
Presentación de visual studio (1)
Presentación de visual studio (1)Presentación de visual studio (1)
Presentación de visual studio (1)
 
Visual basic 1º Año
Visual basic  1º AñoVisual basic  1º Año
Visual basic 1º Año
 
Trabajo
TrabajoTrabajo
Trabajo
 
Programación I
Programación IProgramación I
Programación I
 
Programación
ProgramaciónProgramación
Programación
 
Visual basic
Visual basicVisual basic
Visual basic
 
Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
 
PLC y Electroneumática: Codesys Grafcet
PLC y Electroneumática: Codesys GrafcetPLC y Electroneumática: Codesys Grafcet
PLC y Electroneumática: Codesys Grafcet
 
Guia Inicial Lazarus Ejercicio 1
Guia Inicial Lazarus Ejercicio 1Guia Inicial Lazarus Ejercicio 1
Guia Inicial Lazarus Ejercicio 1
 
Programa2 eclipse
Programa2 eclipsePrograma2 eclipse
Programa2 eclipse
 
Programa2
Programa2 Programa2
Programa2
 
Programa 2
Programa 2Programa 2
Programa 2
 
aplica los fundamentos de programación web
aplica los fundamentos de programación web aplica los fundamentos de programación web
aplica los fundamentos de programación web
 

Más de Warman Malio Mateo

2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf
2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf
2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdfWarman Malio Mateo
 
superacinpersonal-101006014623-phpapp02.pptx
superacinpersonal-101006014623-phpapp02.pptxsuperacinpersonal-101006014623-phpapp02.pptx
superacinpersonal-101006014623-phpapp02.pptxWarman Malio Mateo
 
segmentaciondemercados1 (1).ppt
segmentaciondemercados1 (1).pptsegmentaciondemercados1 (1).ppt
segmentaciondemercados1 (1).pptWarman Malio Mateo
 
2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf
2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf
2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdfWarman Malio Mateo
 
Practica consulta y reporte delphi paso a paso
Practica consulta y reporte delphi paso a pasoPractica consulta y reporte delphi paso a paso
Practica consulta y reporte delphi paso a pasoWarman Malio Mateo
 
Practica consulta y reporte delphi paso a paso (1)
Practica consulta y reporte delphi paso a paso (1)Practica consulta y reporte delphi paso a paso (1)
Practica consulta y reporte delphi paso a paso (1)Warman Malio Mateo
 
Cmoconstruirunamatrizdofa 120916105134-phpapp02
Cmoconstruirunamatrizdofa 120916105134-phpapp02Cmoconstruirunamatrizdofa 120916105134-phpapp02
Cmoconstruirunamatrizdofa 120916105134-phpapp02Warman Malio Mateo
 
Expoanalisisfoda 141030200330-conversion-gate01
Expoanalisisfoda 141030200330-conversion-gate01Expoanalisisfoda 141030200330-conversion-gate01
Expoanalisisfoda 141030200330-conversion-gate01Warman Malio Mateo
 
Organizacin de-recursos-humanos-1215758040367021-9
Organizacin de-recursos-humanos-1215758040367021-9Organizacin de-recursos-humanos-1215758040367021-9
Organizacin de-recursos-humanos-1215758040367021-9Warman Malio Mateo
 

Más de Warman Malio Mateo (20)

2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf
2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf
2-roberto-santacruz-emprendedores-y-emprendimiento-2017.pdf
 
OSSIAS DIAPOSITIVA.pptx
OSSIAS DIAPOSITIVA.pptxOSSIAS DIAPOSITIVA.pptx
OSSIAS DIAPOSITIVA.pptx
 
superacinpersonal-101006014623-phpapp02.pptx
superacinpersonal-101006014623-phpapp02.pptxsuperacinpersonal-101006014623-phpapp02.pptx
superacinpersonal-101006014623-phpapp02.pptx
 
segmentaciondemercados1 (1).ppt
segmentaciondemercados1 (1).pptsegmentaciondemercados1 (1).ppt
segmentaciondemercados1 (1).ppt
 
2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf
2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf
2_1_Tema_5_Programacion_EJERCICIOS_SCRATCH_SENCILLOS.pdf
 
Estados financieros
Estados financierosEstados financieros
Estados financieros
 
Programacion contenido
Programacion contenidoProgramacion contenido
Programacion contenido
 
Formacion humana hoy
Formacion humana hoyFormacion humana hoy
Formacion humana hoy
 
Ortografia basica
Ortografia basicaOrtografia basica
Ortografia basica
 
Reglas de-acentuación-web
Reglas de-acentuación-webReglas de-acentuación-web
Reglas de-acentuación-web
 
Reglas de-acentuación-web
Reglas de-acentuación-webReglas de-acentuación-web
Reglas de-acentuación-web
 
Practica consulta y reporte delphi paso a paso
Practica consulta y reporte delphi paso a pasoPractica consulta y reporte delphi paso a paso
Practica consulta y reporte delphi paso a paso
 
Practica consulta y reporte delphi paso a paso (1)
Practica consulta y reporte delphi paso a paso (1)Practica consulta y reporte delphi paso a paso (1)
Practica consulta y reporte delphi paso a paso (1)
 
Cmoconstruirunamatrizdofa 120916105134-phpapp02
Cmoconstruirunamatrizdofa 120916105134-phpapp02Cmoconstruirunamatrizdofa 120916105134-phpapp02
Cmoconstruirunamatrizdofa 120916105134-phpapp02
 
Expoanalisisfoda 141030200330-conversion-gate01
Expoanalisisfoda 141030200330-conversion-gate01Expoanalisisfoda 141030200330-conversion-gate01
Expoanalisisfoda 141030200330-conversion-gate01
 
Ejemplo plan empresa
Ejemplo plan empresaEjemplo plan empresa
Ejemplo plan empresa
 
Plan de negocio
Plan de negocioPlan de negocio
Plan de negocio
 
Organizacin de-recursos-humanos-1215758040367021-9
Organizacin de-recursos-humanos-1215758040367021-9Organizacin de-recursos-humanos-1215758040367021-9
Organizacin de-recursos-humanos-1215758040367021-9
 
Intro política económica
Intro política económicaIntro política económica
Intro política económica
 
Estados financieros
Estados financierosEstados financieros
Estados financieros
 

Último

NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFAROJosé Luis Palma
 
programa dia de las madres 10 de mayo para evento
programa dia de las madres 10 de mayo  para eventoprograma dia de las madres 10 de mayo  para evento
programa dia de las madres 10 de mayo para eventoDiegoMtsS
 
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIATRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIAAbelardoVelaAlbrecht1
 
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdfOswaldoGonzalezCruz
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOweislaco
 
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxc3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxMartín Ramírez
 
Procesos Didácticos en Educación Inicial .pptx
Procesos Didácticos en Educación Inicial .pptxProcesos Didácticos en Educación Inicial .pptx
Procesos Didácticos en Educación Inicial .pptxMapyMerma1
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas123yudy
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALEDUCCUniversidadCatl
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptxJunkotantik
 
RETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxRETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxAna Fernandez
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialpatriciaines1993
 
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzel CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzprofefilete
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfromanmillans
 
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxOLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxjosetrinidadchavez
 

Último (20)

NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
 
programa dia de las madres 10 de mayo para evento
programa dia de las madres 10 de mayo  para eventoprograma dia de las madres 10 de mayo  para evento
programa dia de las madres 10 de mayo para evento
 
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIATRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
 
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
 
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxc3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
 
Procesos Didácticos en Educación Inicial .pptx
Procesos Didácticos en Educación Inicial .pptxProcesos Didácticos en Educación Inicial .pptx
Procesos Didácticos en Educación Inicial .pptx
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptx
 
Sesión La luz brilla en la oscuridad.pdf
Sesión  La luz brilla en la oscuridad.pdfSesión  La luz brilla en la oscuridad.pdf
Sesión La luz brilla en la oscuridad.pdf
 
Earth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversaryEarth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversary
 
RETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxRETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docx
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundial
 
Power Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptxPower Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptx
 
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzel CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
Repaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia GeneralRepaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia General
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdf
 
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxOLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
 

Manual de delphi 6.0

  • 1. Entorno de Desarrollo El entorno de desarrollo, también conocido como IDE, se muestra al iniciar Delphi integrando todas las herramientas necesarias (Editor de código, Editor de imágenes, Depurador, Herramientas de conexión a bases de datos, fichas de componentes, etc.) para desarrollar nuestras distintas aplicaciones. En la siguiente figura se muestra su entorno. Menú Principal . . . En él, Se puede realizar casi todo desde los diferentes submenús como definir las opciones de compilación, personalizar las fichas de componentes o agregar nuevas, guardar o abrir proyectos, etc., es necesario revisarlo antes de comenzar. Barra de Herramientas . . . Esto es solo un conjunto de botones de acceso rápido a las diferentes opciones del menú, lo cual nos facilita ejecutar las acciones más utilizadas de una manera mas rápida. Dando un Click sobre ellas con el botón derecho del ratón podremos configurarlas. A continuación muestro la función de alguno de ellos.
  • 2. Fichas de Componentes . . . Son las que dan Acceso a los componentes que forman la biblioteca de componentes visuales conocida también como VCL ( Visual Component Library) y se encuentra dividida en varias categorías según las funciones que realizán. Cada paleta incluye en su parte izquierda el botón puntero que no es un componente sino que su función es parecida a la de cualquier programa gráfico sirve para deseleccionar componentes seleccionados, etc. Para insertar un componente en el formulario solo selecciona el componente a insertar después pulsa sobre el formulario y arrastra el ratón para definir su tamaño, en caso que no lo arrastres Delphi automáticamente le pone su tamaño predeterminado. Otra forma de insertar los componentes es dando doble Clic sobre el componente a insertar en la ficha de componentes. Formulario o Form . . . Es la pieza principal del diseño de las aplicaciones, es el contenedor final de otros componentes que finalmente constituirán nuestra aplicación. El formulario es un componente más de Delphi por lo cual tiene propiedades y eventos los cuales se pueden alterar y trabajar con ellos. Para aquellas personas que emigran de lenguajes de programación lineal como C o Clipper tengan en cuenta que ustedes utilizaran tantos formularios como su aplicación los requiera.
  • 3. Inspector de Objetos u Object Inspector . . . Este nos permite modificar las propiedades y respuestas a sucesos o eventos de los componentes, sus datos muestran el estado del componente seleccionado o del mismo formulario. Esta dividido en dos partes en forma de pestañas o solapas una que dice Properties y Events. A continuación se muestra las propiedades del formulario. Existen propiedades que tienen un signo de mas, eso significa que son contenedoras de otras opciones. A continuación se explican algunas de las propiedades más comunes del formulario. BorderIcons: Tiene cuatro opciones mismas que reciben un valor falso o verdadero (True o False) de las cuales dos son muy útiles y empezaremos por la de biMinimize, esta opción esta en True por default y permite que nuestro formulario se pueda minimizar. biMaximize por default está en True y permite que nuestro formulario se pueda maximizar en tiempo de ejecución.
  • 4. BorderStyle: Despliega una lista con los diferentes estilos de bordes para el formulario. Caption: Esta es una propiedad importante debido a que es aquí en donde escribimos el texto de la barra de titulo del formulario, es alfanumérica y por defaul tendrá el nombre del formulario (Form1 en este caso).. Name: Es el nombre del componente, por Defaul aparecerá Form y el numero de formulario, en este caso es Form1, este se puede modificar y ponerle un nombre que nosotros queramos has de cuenta que el formulario es una variable y la propiedad Name tiene el nombre de esa variable. Position : Despliega una lista en la cual muestra las diferentes posiciones sobre las cuales podemos mostrar nuestro formulario al momento de correrlo. WindowsSatate: Despliega una lista de valores WsNormal, WsMinimized, WsMaximized, las cuales alteran nuestro formulario al momento de correrlo es decir si elegimos la de WsMaximized mostrara maximizado nuestro formulario. Para dimensionar nuestro formulario basta con alterar las propiedades Height y Width aunque también se puede realizar posicionando sobre los bordes del formulario el puntero del ratón y arrastrarlo hasta lograr la dimensión que queramos. Nota: Existen Propiedades que son iguales para varios componentes como Caption, Font, Visible, etc. Ahora mostraré los eventos del formulario. Los eventos son sucesos que detecta nuestro formulario y según el suceso detectado se ejecuta su código, existen varios eventos, explicaré solo algunos, de cualquier forma durante el curso se explicarán más. Para introducir el código basta con dar doble Click en la parte derecha del evento a utilizar y Delphi automáticamente nos crea el procedimiento de dicho evento y nos muestra el editor de código.
  • 5. Principales eventos del ratón. Nombre. Acción. OnDlClik Doble clic de ratón. OnClick Un clic de ratón. OnMouseMove El ratón pasa por encima del control. OnMouseDown Es pulsado un botón del ratón. OnMouseUp Es liberado el botón anteriormente pulsado Principales eventos de teclado. Nombre Acción OnKeyPress El código que se ponga en este evento se ejecutará cada que se presione una tecla, este evento nos permite revisar la variable Key, misma que contiene contiene la tecla presionada. Previamente la propiedad KeyPreview se tiene que poner en True. OnKeyDown Una tecla ha sido pulsada. OnKeyUp La tecla anteriormente pulsada ha sido liberada Principales eventos del sistema. Nombre Acción OnActivate El formulario se activa, y toma el papel principal. OnClose El formulario se cierra. OnCloseQuery Se ha solicitado cerrar el formulario. OnCreate El formulario se crea. OnDesactive El formulario pierde el papel principal pero sigue existiendo. OnDestroy El formulario es destruido, y se devuelve la memoria usada a Windows.
  • 6. OnPaint El formulario necesita ser pintado, porque algo ha cambiado en él. OnResize Ha cambiado el tamaño del formulario. Nota: Existen eventos que nos ofrecen ciertos datos o variables propios del evento a tratar con los cuales se puede trabajar y pueden ser de mucha utilidad como es el caso de Key del evento OnkeyPress. Editor de Código . . . Es la parte principal del entorno de desarrollo, es aquí donde se escribirá el código del programa. Por cada formulario que se crea Delphi genera un unit que contiene todo el código asociado a ese formulario. Ese unit se graba con la extensión .Pas. A continuación se muestra el editor de código. Como se puede ver, en el formulario yo puse un componente TButton y en su evento OnClick puse un mensaje. Hay que recordar que la escritura del código es en Pascal o dicho de otra forma Object Pascal. Nota: Antes de pasar a nuestro primer programa quisiera dar un tip. Una vez que tenemos un componente insertado en nuestro formulario en caso de que queramos moverlo lo podemos hacer con el ratón pero también lo podemos hacer con la tecla CTRL + Flechas de dirección, de igual forma si queremos redimensionarlo lo podemos hacer con la tecla Shift + Flechas de dirección. Ahora si, para que veas que el manual va en serio desarrollaremos un sencillo programa, muy clásico pero necesario. Entra a Delphi, automáticamente te va a crear un nuevo proyecto, de cualquier forma puedes crearlo en el menú
  • 7. File/New/Applications. bien ya tenemos un nuevo proyecto ahora realiza lo siguiente: • Vete al Inspector de Objetos, tendrás activada la ficha Properties si no actívala, posiciónate en la propiedad Caption y ponle el siguiente texto: Mi primer programa en Delphi compadre. • Vete a la Propiedad Position dale click en su derecha y te desplegara una lista de valores elige la que dice PoScreenCenter. Esto para que te centre el formulario en tu pantalla. • Ahora Dale un Click a la pestaña que dice Events para que te muestre los eventos del formulario. Después posiciónate en el evento que dice OnClick y da doble Click en su parte derecha en lo blanco, te abrirá el editor de código y creará un procedimiento, dentro del begin y el end pon ShowMessage('Esperate estoy empezando'); Te tiene que quedar de la siguiente forma: procedure TForm1.FormClick(Sender: TObject); begin ShowMessage('Esperate estoy empezando'); end; Ok. Ahora solo corre tu programa pulsando F9 y veras el resultado. Cada que des un click sobre el formulario te mostrara el mensaje. Puedes experimentar tu solo, cambiando las propiedades del formulario y corriéndolo para ver sus efectos. Operadores Lógicos y Aritméticos Operadores Aritméticos . . . . Permite realizar todo tipo de operaciones comunes con operandos numéricos ya sean reales o enteros, en la siguiente tabla se muestran los tipos de datos. Operador Operación Tipo Operando Tipo Resultado + Suma Integer Real Integer Real
  • 8. - Resta Integer Real Integer Real * Multiplicación Integer Real Integer Real / División Integer Real Integer Real Div División entera Integer Integer Mod Resto Integer Integer Operadores Lógicos . . . Se dividen en dos categorías los lógicos y los booleanos. La diferencia esta en que las operaciones lógicas llevan la comparación de valores a nivel de bit y las operaciones booleanas realizan comparaciones verificando si una cierta expresión es verdadera o falsa. En la siguiente tabla se presentan las operaciones lógicas. Operador Operación Tipo Operando Tipo Resultado Not Negación a nivel de Bit. Integer Integer And Producto a nivel de Bit. Integer Integer Or Suma a nivel de Bit. Integer Intege Xor Or Exclusiva a nivel de Bit. Integer Integer Shl Desplazamiento bit a bit hacia la izquierda. Integer Integer Shr Desplazamiento bit a bit hacia la derecha. Integer Integer
  • 9. La siguiente tabla muestra los operadores booleanos. Operador Operación Tipo Operando Tipo Resultado Not Negación. Boolean Boolean And Producto lógico. Boolean Boolean Or Suma lógica. Boolean Boolean Xor Or Exclusiva lógica. Boolean Boolean Operadores Relaciónales . . . Los utilizamos para realizar comparaciones entre dos valores y a continuación se muestran en la siguiente tabla. Operador Operación Tipo Resultado = Igualdad. Boolean < > Desigualdad. Boolean < Menor que. Boolean > Mayor que. Boolean <= Menor o Igual que. Boolean >= Mayor o Igual que. Boolean Precedencia de Operadores . . . Cuando se evalúa una expresión en la que aparecen combinados diferentes operadores, las operaciones que representan se ejecutan en cierto orden que están marcados por la precedencia de los operadores. A continuación se muestra una tabla con su precedencia. Operador Precedencia Categoría @ , Not Primera Operadores Unarios
  • 10. * , / , Div , Mod , And , Shl , Shr , As Segunda Operadores de Multiplicación + , - , Or , Xor Tercera Operadores de Adición =, <> , < , > , <= , >= Cuarta Operadores Relacionales Existen cuatro reglas de precedencia que se deben de tomar en cuenta: • Las expresiones encerradas entre paréntesis se evalúan antes de tratarlas como un único operando. Lo que significa que primero se evalúa lo que esta dentro del paréntesis por ejemplo la siguiente operación valor := 10 + (3*3); primero multiplica 3*3 y su resultado lo suma con el 10. • Un operador unario siempre precede al operador binario, por ejemplo -5 * 10 es lo mismo que tuviéramos (-5) * 10. • Un operador que se encuentra entre dos operadores de precedencias diferentes se relaciona con el operador de precedencia mayor, por ejemplo valor := 5 * 3 + 10; en este caso primero se multiplica y después se suma. • Un operando que se encuentra entre dos operadores iguales se relaciona con el de su izquierda. Por ejemplo si se tuviera valor := 5 + 3 + 6; es lo mismo que valor := (5 + 3) + 6;. Declaración de Variables y Constantes
  • 11. CONSTANTES . . . Se utilizan para representar lógicamente un valor que será utilizado repetidamente en nuestro programa y que no variará durante su ejecución. Para su declaración se utiliza la palabra reservada Const. Por ejemplo continuación declararé la constante PI = 3.14 y nombre ='Pablo ' en el evento Oncreate del formulario. procedure TForm1.FormCreate(Sender: TObject); const PI = 3.14; nombre = 'Pablo '; begin ShowMessage(nombre+FloatToStr(PI)); end; Si declaras constantes o variables dentro de algún procedimiento, irían entre el Procedure y el Begin. Como puedes ver utilizamos nuevamente la función ShowMesage() la cual me permite mandar un mensaje sencillo al usuario pero bueno se explicará más adelante en mensajes. De igual forma utilizo la función FloatToStr() la cual me permite convertir valores de tipo flotante a cadena. Variables . . . Una variable es un valor perteneciente a un cierto dominio y puede variar durante la ejecución del programa. En Delphi las Variables se declaran con la palabra reservada Var. Por ejemplo realizaremos la misma función que las constantes pero ahora utilizando variables y el código quedaría así: procedure TForm1.FormCreate(Sender: TObject); var PI : Real; nombre : String; begin PI := 3.14; nombre := 'Pablo '; ShowMessage(nombre + FloatToStr(PI)); end; NOTA: En Delphi las Asignaciones se realizan mediante := como puedes observar. Bien ya vimos como declarar constantes y variables ahora es necesario ver los tipos de datos soportados por Delphi. Delphi Soporta tipos de datos simples y tipos de datos compuestos pero por ahora nos enfocaremos a los simples.
  • 12. Tipos Enteros . . . Son aquellos que representan números no decimales dentro de un rango y existen diferentes tipos de enteros clasificados según su rango. A continuación muestro una tabla con los tipos de datos enteros. Tipo Rango de Valores Formato Byte 0 .. 25 8 bits sin signo Word 0 .. 65535 16 bits sin signo LongWord 0 .. 4294967295 32 bits sin signo ShortInt -128 .. 127 8 bits con signo SmallInt -32768 .. 32767 16 bits con signo LongInt -2147483648 .. 2147483648 32 bits con signo Int64 -2Exp63 .. 2Exp63-1 64 bits con signo Integer -2147483648 .. 2147483648 32 bits con signo Cardinal 0 .. 214 748364832 bits sin signo Por defecto las operaciones aritméticas con valores enteros devolverán un valor entero, hay que tener cuidado por que una variable de tipo entera no puede almacenar un dato de tipo real, más sin embargo una variable de tipo real si puede recibir un dato entero. Tipos Reales . . . Son adecuados para variables que albergan valores con una parte decimal, a continuación muestro una tabla con los diferentes tipos reales soportados por Object Pascal. Tipo Rango de valores Dígitos Significativos Tamaño en Bytes Single ± 1.5 * 10Exp-45 .. ± 3.4 * 10Exp38 7-8 4 Real48 ± 2.9 * 10Exp-39 .. ± 1.7 * 10Exp38 11-12 6 Real ± 5.0 * 10Exp-324 .. ± 1.7 * 10Exp308 15-16 8 Double ± 5.0 * 10Exp-324 .. ± 1.7 * 10Exp308 15-16 8 Extended ± 3.4 * 10Exp-4932 .. ± 1.1 * 10Exp4392 19-20 10 Comp -2Exp63 .. 2Exp63 -1 19-20 8 Currency -9223372036854775808 .. 19-20 8
  • 13. 9223372036854775807 La declaración de variables reales utiliza exactamente la misma sintaxis que la explicada para los números enteros. De hecho en el ejemplo anterior se declaro una variable de tipo Real. Tipos Booleanos . . . Este es un tipo de dato muy sencillo pero igualmente utilizado, representan cantidades lógicas como verdadero o falso y en el Object Pascal existen cuatro que son: Boolean, ByteBool, WordBool y LongBool. El que se recomienda más es el tipo Boolean debido a que utiliza menos memoria, las otras existen para permitir la compatibilidad con otros lenguajes y el entorno de Windows. Bueno a continuación te muestro su tabla. Tipo Memoria Requerida en bytes Boolean 1 (Recomendado) ByteBoolean 1 WordBool 2 LongBool 4 Se declaran como cualquier otra variable solo que el valor que pueden recibir es True o False. Ejemplo. Este código se puso en el evento Oncreate del Formulario Ok. procedure TForm1.FormCreate(Sender: TObject); var Compadre : Boolean; begin Compadre := True; If Compadre = True then ShowMessage('Tu si eres mi compadre') Else ShowMEssage('Tu no eres mi compadre'); end; Este fue un ejemplo inútil, pero es solo para ilustrar su manejo muy simplemente, tu eres quien le darás una verdadera aplicación si tus problemas lo requieren. Por lo pronto puedes experimentar cambiando la asignación de compadre a False. Tipos de Carácter . . . Los tipos de carácter están diseñados para albergar caracteres según un cierto código numérico que usualmente es el ANSI
  • 14. que mediante palabras de 8 bits representa hasta 256 caracteres. A continuación muestro su tabla. Tipo Carácter que contiene Memoria requerida en Bytes AnsiChar Un Caracter Ansi 1 WideChar Un Caracter Unicode 2 Char Un Caracter Ansi 1 Tipos Cadena de Caracteres . . . También conocidos como String. Estas existen como tipos predefinidos que albergan la concatenación de un determinado número de caracteres bueno es algo parecido a los arrays si así lo quieren ver. En seguida muestro la tabla con los diferentes tipos. Tipo Carácter que contiene Longitud Máxima Memoria AnsiString AnsiChar ~2Exp31 Caractere s Hasta GB. ShortString AnsiChar 255 Caractere s 2 a 256 Bytes. String AnsiChar ~2Exp31 Caractere s 256 hasta 2GB. WideString WideChar ~2Exp30 Caractere s Hasta 2GB. Te pongo un ejemplo para explicar su uso. procedure TForm1.FormCreate(Sender: TObject); var Nombre, Apellido : String; begin Nombre := 'Pablo '; Apellido := 'Bustos'; Nombre := Nombre + Apellido; ShowMessage(Nombre); end;
  • 15. Nota: a diferencia de C y otros lenguajes, en Delphi las concatenaciones se hacen con el signo +; las asignaciones se hacen normalmente, únicamente utilizan las comillas simples (') para indicarle que se trata de una cadena. Como anteriormente se mencionó estas variables son parecidas a los arrays y podríamos accesar directamente a alguna posición de la variable por ejemplo si a la variable Nombre únicamente quisiera concatenarle la letra B de la Variable Apellido lo haría de la siguiente forma: Nombre := Nombre + Apellido[1]. Como puedes ver a diferencia de C el inicio de posiciones comienza en 1 y no en 0. Ok. Existe la instrucción Array perteneciente a los datos compuestos, la cual permite declarar arreglos de una o varias dimensiones. Sentencias de control Todo programa esta constituido por decisiones y acciones que se ejecutan repetidamente en función del estado del programa y las sentencias de control, son las que nos permiten hacer esas cosas. Explicaré las más utilizadas. Condicion If ... Then : Las condiciones If sin duda son unas de las mas utilizadas y permite condicionar la ejecución de un determinado código al cumplirse una determinada condición. La sintaxis seria como sigue: If Condicion Then Codigo1 Else Codigo2 Codigo1, se ejecutará cuando la condición se cumple y Codigo2 cuando la condición no se cumple. Pueden anidarse tantas sentencias if como necesites. Cuando los códigos a ejecutar tanto para el Else como para el IF son más de una instrucción se deben de poner entre un Begin y un End. Para que quede mas claro haremos un ejercicio mas practico, el código irá en el evento Oncreate del Form. Se preguntarán por que utilizo ese evento bueno pues por que todavía no les enseño como funcionan otros componentes.
  • 16. procedure TForm1.FormCreate(Sender: TObject); var numero : Integer; begin Randomize(); numero := random(20); if numero > 10 Then begin numero := numero * numero; ShowMessage('Es mayor, al cuadrado es: ' + IntToStr(numero)); end Else begin numero := numero * numero; ShowMessage('Es menor, al cuadrado es: ' + IntToStr(numero)); end; end; Nota: En el ejemplo declaro una variable de tipo entero después utilizo la función Randomize() la cual inicializa el motor de generación de números aleatorios luego asigno a numero el resultado que devuelva random(20) la cual es una función que devuelve un valor aleatorio entre un rango previamente especificado que en este caso es un 20. Este ejemplo es muy sencillo lo que hace es generar un numero aleatorio lo compara y si es mayor que diez manda un mensaje diciendo que es mayor y mostrando su cuadrado y en caso de que sea menor hace casi lo mismo solo que indica que es menor. Case ... OF : Permite comparar una variable o expresión con un conjunto predeterminado de valores y ejecutar un código determinado de acuerdo al resultado de la comparación o expresión. Aquí tienes su sintaxis. Case Expresion Of Lista de constantes separadas por comas : Codigo; Valor Inicial .. Valor final : Codigo2; Else Codigo por Defecto;
  • 17. Hay va un ejemplo para que quede mas claro Ok. procedure TForm1.FormCreate(Sender: TObject); var numero : Word; begin Randomize(); numero := Random(4); Case numero Of 0: ShowMessage('El numero es un Cero'); 1: ShowMessage('El numero es un Uno'); 2: ShowMessage('El numero es un Dos'); else ShowMessage('El numero es mayor que dos'); end; end; Este es un ejemplo muy sencillo, genero un numero aleatorio de entre 4 dígitos incluyendo el cero, luego con el Case lo comparo hasta el numero dos dejando un mensaje en el else para cuando el numero sea mayor que dos. Bueno creo que ha llegado la hora de explicar los ciclos o bucles así que empezaremos. Repeat Until : Permite ejecutar un determinado código hasta que se satisfaga una cierta condición, su sintaxis es de la siguiente forma: Repeat Codigo Until Condicion La condición debe producir un resultado de tipo Booleano, cabe mencionar que en este tipo de ciclos el código se ejecuta por lo menos una vez debido a que la condición se realiza en la parte final del ciclo.
  • 18. Les pondré un sencillo ejemplo pero ahora utilizaremos el evento OnClick del Form. procedure TForm1.FormClick(Sender: TObject); var nl.*umero, suma : Integer; begin numero := 1; suma := 0; repeat suma := suma + numero; inc(numero); until numero = 10; ShowMessage(IntToStr(suma)); end; While ... Do : Es parecido al anterior solo que la verificación del ciclo se realiza al inicio. Aquí tienes su sintaxis. While Condición Do Codigo Si el código es mas de una instrucción se tendrá que poner entre un Begin y un End. que no se te olvide. De este ciclo no pondré ejemplo creo que tu puedes utilizar el código anterior y aplicarlo a este ciclo. For ... Do : Nos permite repetir la ejecución de un determinado código un numero definido de veces. La sintaxis es como sigue. For Variable := Valor Inicial To/Downto Valor Final Do Codigo El Downto es para realizar ciclos en decremento y el To en incremento. así que si quieres sumar los números del 1 al 100 seria: procedure TForm1.FormClick(Sender: TObject); var numero, suma: Integer; begin suma :=0; For numero := 1 To 100 Do suma := suma + numero; ShowMessage(IntToStr(suma)); end;
  • 19. Con esto hemos concluido una parte que es fundamental conocer para el manejo de Delphi, como lo es su entorno de desarrollo, declaración de constantes, variables y sus sentencias de control. Así que de aquí en adelante nos dedicaremos a ver cosas mucho más interesantes, explotaremos la potencialidad de Delphi y empezaremos por ver los tipos de mensajes que Delphi permite realizar. Mensajes en Delphi Es verdaderamente útil poder interactuar con el usuario, decirle que es lo que esta ocurriendo o dejarlo que tome decisiones. Esto en parte podemos lograrlo con las ventanas o cuadros de mensaje, por si no tienes una idea clara de que es lo que son pues son por ejemplo el cuadro que te aparece en Word (u otra Aplicación) cuando no has guardado tu trabajo preguntando si deseas guardarlo. Delphi permite Los siguientes tipos de Mensajes. • ShowMessage • ShowMessagePos • MessageDlg • MessageDlgPos • MessageBox ShowMessage . . . Es el mas sencillo de todos y ya lo hemos utilizado en ejercicios anteriores. El cuadro parece por defecto centrado en la pantalla, el titulo de la ventana es el nombre de la aplicación, el texto del mensaje lo indicamos nosotros entre comillas simples y solo tiene un botón. Ejemplo: ShowMessage('Quiubule Familia'). ShowMessagePos . . . Es Parecido al anterior pero tiene dos valores mas que indican las coordenadas donde se mostrara el cuadro indicando primero el ancho y luego el largo. Debes tener cuidado pues la posición se debe poner en Pixeles por lo tanto debes sabe el tamaño de tu pantalla, esto lo logras haciendo una pequeña llamada al Objeto TScreen.Width obtienesel ancho y con Screen.Height el Largo. Bueno como ejemplo podrías poner en el evento Onclick de tu formulario el siguiente código: ShowMessagePos ('Utilizando Coordenadas', Screen.Width div 3,Screen.Height div 3);
  • 20. MessageDlg . . . Hasta ahora los tipos anteriores de mensajes no dejan que el usuario pues pueda tomar alguna decisión o algo por el estilo verdad, así que el tipo de mensaje MessageDlg nos proporciona esa posibilidad. Los valores que recibe son primeramente el texto que queremos mostrar, el tipo de cuadro que mostraremos según una lista predefinida por Windows, los botones que se mostraran y la ayuda de la aplicación que creemos si es que colocamos un botón de ayuda en el cuadro. Bien ahora les mostrare la lista de cuadros predefinidos por Windows. • mtIformation • mtWarning • mtError • mtConfirmation • mtCustom Por cada tipo de cuadro windows automáticamente te mostrara una imagen relacionada al cuadro elegido. Ahora es necesario saber cuales son los tipos de botones que podemos utilizar. • mbYes • mbNo • mbOk • mbCancel • mbAbort • mbRetry • mbIgnore • mbAll • mbHelp Los tipos de botones que deseas debes ponerlos entre corchetes ([ ]), y seguidos de una coma. O si lo prefieres Otra forma de hacerlo es poner un serie de botones predefinidos, pero si lo haces no pongas los corchetes. Los botones predefinidos son: • mbYesNoCancel • mbAbortRetryIgnore • mbOkCancel Bien ahora pondré un ejemplo de como utilizarlo, pon el siguiente código en el evento Onclick de tu Formulario. If MessageDlg ('¿Estas Aprendiendo?', mtConfirmation ,[mbyes,mbno],0) = mrYes Then ShowMessage ('Que bueno, entonces vamos bien')
  • 21. else ShowMessage ('Hay jode, pos estúdiale mas'); Si pusiste atención te pudiste haber dado cuenta que MessageDlg devuelve el valor del botón pulsado por el usuario. El valor devuelto puede tomar los siguientes valores: • mrNone • mrAbort • mrYes • mrOk • mrRetry • mrNo • mrCancel • mrIgnore • mrAll El valor de la constante tiene el nombre del botón pulsado, de esa forma en el ejemplo cuando es pulsado el botón mbYes, el valor devuelto es mrYes. MessageDlgPos . . . Esta es una variante de la función MessageDlg, funciona exactamente igual solo que se le tienen que pasar las coordenadas de donde queremos que aparezca el cuadro de mensaje. Ejemplo If MessageDlgPos ('¿Estas Aprendiendo?', mtConfirmation , [mbyes,mbno],0,Screen.Width,Screen.Height) = mrYes Then ShowMessage ('Que bueno, entonces vamos bien') else ShowMessage ('Hay jode, pos estúdiale mas'); MessageBox . . . Es un tipo de mensaje que hace llamada a la Api de Windows sacándonos el titulo de los botones en español, claro si nuestro Windows esta en español. No adentrare mucho en esto así que pondré un ejemplo de su uso. if Application.MessageBox('QUIERES SALIR DEL PROGRAMA ?','SALIR',MB_OKCANCEL+MB_ICONQUESTION)=IDOK then Application.Terminate; En este caso también se controla el tipo de botón a poner y las combinaciones de las imágenes que pone Windows por defecto te las listo continuación. Los tipos de botones a poner ya se listaron anteriormente.
  • 22.  Mb_IconAsterisk  Mb_IconError  Mb_IconExclamation  Mb_iconHand  Mb_IconInformation  Mb_IconQuestion  Mb_IconStop  Mb_IconWarning Bueno creo que sobre mensajes seria todo. Ahora pasaremos a explicar lo que estaban esperando las fichas de componentes visuales. Finalmente verdad... Ficha Standar En esta ficha se encuentran los componentes mas utilizados y es la que esta activada cuando entramos a Delphi. Explicare únicamente los principales. Nota: Realizare algunos ejercicios durante el transcurso de la explicación. Ficha Standar. Empezaremos a partir del segundo componente. Imag Componente Descripción MainMenu Es un componente no visual que permite diseñar el menú del formulario que si será visual. PopupMenu Permite diseñar Menús contextuales o emergentes, que aparecerán al pulsar el botón secundario del ratón. Label Es un cuadro de texto estático, por lo tanto visualiza texto pero no puede ser modificado. Edit Es un cuadro de Edición de Texto que permite visualizar y modificar una línea de texto. Memo Es un Cuadro de Texto multilinea, se puede visualizar y modificar varias líneas de texto. Es
  • 23. parecido al Bloc de Notas Button Es un Botton clásico de cualquier aplicación Windows, no lleva ninguna imagen solo texto. ChechBox Es una casilla de verificación que permite seleccionar y deseleccionar opciones. RadioButton Botón de opción parecido al CheckBox, se utiliza para seleccionar dentro de un conjunto de RadioButton u opciones solamente uno de ellos. ListBox Es una lista Standard de Windows en la que el usuario puede seleccionar un elemento de la lista. ComboBox Lista desplegable que combina las características de un ListBox y un Edit permitiendo al usuario seleccionar un elemento. ScrollBar Barra de desplazamiento estándar. GroupBox Funciona como contenedor de objetos, permitiendo agrupar diferentes controles. RadioGroup Es un contenedor exclusivamente para los RadioButtons. Panel Contenedor de objetos pero mas potente que el GroupBox. Bueno ahora vamos a lo bueno aremos un ejercicio utilizando algunos componentes explicados. así es que arranca Delphi o crea una nueva Aplicación. Coloca un GroupBox en tu formulario, Dentro de el coloca dos etiquetas mismas que en su propiedad Caption les pondras Valor uno y Valor dos. Después pon dos Edit ve a su propiedad Text y quítales el texto que tienen por defaul. Deben de ir un Edit abajo de cada Label. Selecciona el Componente GroupBox y en su propiedad Caption Coloca el texto Valores. Todo el GroupBox y su componentes cárgalos hacia tu parte superior izquierda. Ahora en tu parte superior derecha pega un componente Label y en su propiedad Caption le pondrás Operación, Después coloca un componente ComboBox debajo del Label. Te vas a la propiedad Text del comboBox y Escribes el texto Suma. después ve a la propiedad Items y dale Click donde dice String. te saldra una ventana en la cual escribirás los textos Suma, Resta en líneas o filas separadas. y das Ok a la ventana. Después coloca debajo del ComboBox un componente Button y en su propiedad Caption pon Calcular. Ahora coloca un componente Panel debajo del Componente Button. dentro del panel pon un componente Label que por cierto si has seguido mis instrucciones será el Label6 y de hecho debe de ser el seis por que lo utilizaremos para pegar el resultado de una operación. Muy bien ahora pon un componente RadioGroup en la parte inferior izquierda, en su propiedad Caption pon color de ventana. Después dentro de el coloca dos
  • 24. RadioButtons al primero en su propiedad Caption Pon el texto Azul, y al segundo ponle Normal. Ahora pon un Componente Button al costado derecho del RadioGroup. y pon en su propiedad Caption Aplicar. Pon un componente MainMenu, Dale doble Click. te saldra una ventana en la cual se irán viendo las opciones del menú que bayas poniendo en su propiedad Caption. Ahora vete a la propiedad Caption y escribe &Principal (El Amperson indica la tecla caliente), da enter y ahora te aparecerá principal en la ventana que estará a tu derecha, en esa ventana debajo de la leyenda Principal habrá un campo en blanco selecciona con el ratón, después vete a la propiedad Caption y escribe &Salir. Ahora da click sobre el formulario para regresar a el. Ahora el diseño quedaría como sigue Ahora vamos con el código. Vete al evento Onclick del Button1 que dice Calcular. dentro de el pondremos el siguiente código: if ComboBox1.Text = 'Suma' Then Begin Label6.Caption := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text)); End; if ComboBox1.Text = 'Resta' Then Begin
  • 25. Label6.Caption := FloatToStr(StrToFloat(Edit1.Text) - StrToFloat(Edit2.Text)); End; Si te das cuenta en el Edit1 y Edit2 Guardamos los valores con los que aremos una suma o resta según elija el usuario. El resultado lo pegaremos en el Label6 en su propiedad Caption. Tanto el Edit como el Label son de tipo String por lo que para hacer la operación es necesario convertirlo por lo tanto los Edit los convierto a flotantes mediante FloatToStr(). Ahora el resultado será un tipo de dato flotante para asignárselo al Label que es de tipo String tengo que convertirlo mediante la instrucción FloatToStr(); En lo que respecta al uso del ComboBox me sirve para que el usuario elija el tipo de operación a realizar (Suma o Resta) yo previamente definí Suma y Resta en el ComboBox. Cuidado si te fijas la primera letra de Suma y Resta esta en mayúsculas si tu la escribes diferente tendrás que modificar las comparaciones en el If. Muy bien Ahora en el Evento Onclick del Button2 que dice Aplicar pon este código. if RaDioButton1.Checked = True then Form1.Color := ClBlue else Form1.Color := clBtnFace; Como puedes ver la propiedad Checked me indica si un RadioButton esta o no Activado. Y dependiendo de eso modifico el color del Form. Ahora vete al menú desplegable y dale Click en la opción Salir de esta forma Delphi te creara el procedimiento Tform1.Salir1Click en el cual pondrás este código. Application.Terminate; Esta instrucción permite terminar correctamente la aplicación y devolver la memoria a Windows. Ahora solo corre el programa con F9 y listo. Experimenta con el. Ficha Additional Contiene componentes que amplían los componentes de la estándar y que igualmente se utilizan frecuentemente. Explicare solo algunos de ellos. De
  • 26. cualquier forma si sabes un poco de ingles puedes consultar la ayuda de Delphi seleccionando la ficha y después presionando F1. Imagen Componente Descripción BitBtn Es un Botton que se le puede añadir un gráfico Bitmap. Contiene la propiedad Kind que trae una lista de botones predefinidos con sus Bitmap. SpeedButton Es un botón utilizado en las barras de herramientas, se le puede agregar un Bitmap y trae la propiedad Flat que permite dar una apariencia de boton plano. MaskEdit Se utiliza para validar la entrada de datos mediante el formateo del texto como lo es la fecha, etc. Image Permite mostrar gráficos como Bitmaps, iconos, Windows Metafiles, etc. Shape Permite dibujar polígonos, círculos y líneas. Bevel Es un rectángulo en 3D. ScrollBox Define un área contenedora mayor al área visualizada, automáticamente al sobrepasar el área salen las barras deslizadoras. CheckListBox Es un ListBox solo que añade un CheckBox para cada elemento de la lista. Splitter Sirve para definir áreas modificables por parte del usuario. StaticText Es similar a Label, solo que tiene mas propiedades modificables. ControlBar Se utiliza para crear barras de Herramientas acoplables. Chart Util para crear diferentes tipos de gráficos. Bueno ahora es el momento de realizar algún ejercicio en donde utilicemos algunos componentes descritos. Crea una nueva aplicación, al Caption del formulario ponle Ficha Addiotional, en el formulario por un componente StaticText, en la Propiedad Caption pon Fecha, la propiedad BorderStyle ponla en sbsSunken. Coloca un componente MaskEdit, Da un Click sobre él con el botón secundario del ratón, te saldrá un menú desplegable elige la opción Input Mask Editor ( Esto
  • 27. también lo puedes realizar en la propiedad EditMask), te saldrá una venta con mascaras predefinidas. Elige la que dice Date, si quieres la fecha en formato MM/DD/AA, esta un botón que dice Masks, dale click y vete al directorio Bin de Delphi y elige el archivo Spain. Ahora ya que seleccionaste Date. solo dale Ok. y listo tienes tu mascara para la fecha. Ahora Pon este código en el evento OnCreate de tu Form. MaskEdit1.Text := DateToStr(Date); La función que devuelve la hora del sistema es Date y el valor devuelto es de tipo fecha así que se tiene que convertir a String para pegarse en el MaskEdit. Muy bien ahora coloca un componente Shape en el Form, ve a la propiedad Shape y Elige la opcion StCircle. Despues ve a la propiedad Brush, presenta dos opciones elige la opción Colors y elige el color ClLime. Despues de esto coloca un BitBtn a un costado del componente Shape. ve a la propiedad que dice Glyph y dale Click a su derecha. te presentara una ventana en la cual te permitirá buscar y agregar una imagen al boton asi que dale click a la opción Load y ve al directorio imagesbuttons de Delphi, en este directorio tendras una serie de gráficos que Delphi te instala, bueno elige la imagen Group. Una vez agregada la imagen ve a la propiedad Caption y Ponle Color. Coloca un SpeedButton en el formulario, en la propiedad Caption ponle figura, ve a la propiedad Glyph y ponle la imagen Form. Recuerda para ponerle la imagen es igual que cuando se la pusiste al BitBtn. Bien ahora ya con la imagen puesta ve a la propiedad Flat y ponla en True. Ahora coloca un componente Image, su propiedad Align ponla en AlClient. con esto la imagen ocupara todo el formulario. Ve a la propiedad Picture y dale click a su derecha, de igual forma como en los botones agregamos una imagen haz lo mismo solo que ahora ve al directorio ImagesBackgrnd y elige la imagen Writing. Ahora te muestro como quedaría la parte visual del formulario.
  • 28. Ahora en el Evento Onclick del BitBtn se pondría: procedure TForm1.BitBtn1Click(Sender: TObject); var numero : Word; begin Randomize(); numero := Random(3); if numero = 0 then Shape1.Brush.Color := ClBlue; if numero = 1 then Shape1.Brush.Color := ClBlack; if numero = 2 then Shape1.Brush.Color := ClYellow; if numero = 3 then Shape1.Brush.Color := ClLime; end; Con este código generamos un numero aleatorio de entre cuatro números incluyendo el cero, y según el resultado estamos cambiando de color al Shape. Pon en el SpeedButton este codigo. procedure TForm1.SpeedButton1Click(Sender: TObject); var numero : Word; begin randomize(); numero := random(5); if numero = 0 then
  • 29. Shape1.Shape := StCircle; if numero = 1 then Shape1.Shape := StEllipse; if numero = 2 then Shape1.Shape := StRectangle; if numero = 3 then Shape1.Shape := StRoundRect; if numero = 4 then Shape1.Shape := StRoundSquare; if numero = 5 then Shape1.Shape := StSquare; end; Estamos generando aleatoriamente 6 posibles datos (0-5) mismos que utilizamos como constantes para cada una de las formas del Shape. Bueno con esto hemos concluido este pequeñísimo ejercicio. Por ahora estamos haciendo cosas muy simples les prometo que posteriormente aremos algo mas complicado mientras tanto pasaremos a la siguiente ficha. Ficha Win32 Contiene componentes que permiten la creación de aplicaciones que cumplen con las especificaciones de Windows 95 o superior. A continuación se muestra. Imagen Componente Descripción TabControl Crea solapas para cuadros de dialogo multipágina. PageControl Crea una área multipágina, en donde cada pagina es accesible desde las mismas solapas del componente. ImageList Define una matriz de imágenes del mismo tamaño mismas que son accesibles a través de su índice. RichEdit Es una caja de texto que acepta el formato de texto enriquecido, por lo tanto a nivel de palabra se le puede modificar el tamaño, color, etc. TrackBar Es una barra de desplazamiento de Windows, que nos permite desplazar el control por un conjunto de valores. ProgresBar Es una barra de progreso estándar que nos indica
  • 30. el avance de un determinado proceso. Animate Muestra secuencias de BitMaps o Archivos Avi sin sonido. DateTimePicker Despliega fechas y permite seleccionarlas, también permite introducirlas. MonthCalendar Nos presenta el calendario por meses. StatusBar Es una barra de estado clásica de Windows. ToolBar Permite crear una barra de Herramientas. CoolBar Es un contenedor de Barras de herramientas mismas que pueden ser configurables por el usuario Bueno es tiempo de hacer un ejemplo de su uso así que realiza lo siguiente: Crea una nueva aplicación, al caption del form ponle Ficha Win32, coloca un componente Image list en el form, dale doble Click al componente, te saldrá una ventana en la cual podrás agregar imágenes, dale al botón que dice Add, vete a la carpeta Images/Buttons de Delphi, y agrega el archivo que dice DoorOpen, después que lo abres, regresas a la ventana anterior y te mandara un mensaje en ingles que dice la dimensión de la imagen es demasiado grande y pregunta si la divide en dos, dale que si, te pondrá dos imágenes, hay un botón que dice Delete, borra la segunda imagen con ese botón. Ok. Ahora así como agregaste esta imagen quiero que agregues dos mas, bueno la imagen del botón te la dejo a tu gusto Ok. el caso que te tienen que quedar tres imágenes enumeradas del 0 al 2. Después de agregar las imágenes solo da click al botón de OK. Coloca un componente ToolBar, en su propiedad Caption Ponle Herramientas, Vete a la propiedad ImageList y selecciona el texto ImageList1 (Es el componente de imágenes que creamos). Ahora dale Click al Componente con el botón secundario del ratón y te saldrá un menú emergente, selecciona la opción New Button, con esto te crea un botón en en el componente ToolBar. Ok. Ahora vete a la propiedad Hint del botón que acabas de crear y ponle Salir, ve a la propiedad ShowHint y ponla en True. Ok. Después ve a la propiedad ImageIndex y ponle 0 (A este botón le pondremos la imagen que este en el índice 0). Ahora nuevamente con el botón secundario del ratón dale click al ToolBar y ahora eliges la opcion NewSeparator, con esto te crea un botón separador, a este botón no le haremos nada Ok. De igual forma como creaste el primer botón crea dos mas y en su Hint pondrás Animación, calendario, en la propiedad ImageIndex pon 1 y 2 respectivamente. Con eso tendremos nuestra barra de herramientas. Ahora coloca un componente PageControl, Dale click al componente con el botón secundario del ratón, en el menú emergente selecciona New Page, con esto te a creado una nueva pagina, ahora vete a la propiedad Caption y ponle Animación. Ahora si sobre esa nueva pagina pegaras un componente Animate, vete a la propiedad CommonAvi y selecciona el valor aviCopyFile. Después vete a la ficha Standar y coloca dos Buttons debajo del componente Animate, a uno le pones
  • 31. Animar y al Otro Detener. Con esto tendremos lista nuestra primer pagina así es que selecciona el componente PageControl y con el botón secundario del ratón dale nuevamente Click y elige la opción de NewPage. Ahora Vete a la propiedad Caption y ponle Calendarios. Coloca dentro de esta pagina un componente MonthCalendary un componente DateTimePicker, a estos componentes no les haremos nada. Si todo va bien el diseño estaría mas o menos así. Muy bien ahora vamos a introducir el código, empezaremos por los botones de la barra de herramientas. Dale Doble Click al primer botón que le pusimos Salir, con esto te genera automáticamente el evento Onclick, puedes hacerlo de la otra forma que tu ya sabes no importa. Bueno pon este código. Application.Terminate; Ahora en el Tercer botón que le pusimos Animación pondrás este otro código. PageControl1.ActivePageIndex := 0; Como puedes ver las paginas del PageControl tienen un índice empezando de cero así es que solo es cuestión de poner que pagina es la que quieres activar. En el ultimo Botón (Calendarios) pondrás este código.
  • 32. PageControl1.ActivePageIndex := 1; Muy bien ahora selecciona la pagina que dice Animacion del PageControl. en el evento Onclick del Button Animar pondrás este código. Animate1.Active := True; Por ultimo en el evento Onclick del botón Detener pon este código. Animate1.Stop; Muy bien.... traigan la tequila compadres.. pos ya terminamos. ahora solo córrelo con F9 y listo. Ficha System Contiene componentes que permiten acceder a algunos elementos importantes del sistema, enseguida muestro la ficha. Imagen Componente Descripción Timer Es un temporizador que ejecuta un evento cada intervalo de tiempo programado. PaintBox Define una área en la que se puede dibujar. MediaPlayer Es un Panel de control del reproductor de vídeo multimedia y de archivos de sonido. OLEContainer Es un contenedor que define una área de cliente OLE. Lo utilizaremos en el ejemplo para ver video. DDEClientConv Establece una conexión DDE como cliente a un servidor DDE. DDEClientItem Especifica los datos que serán enviados a un servidor DDE. DDEServerConv Establece una conexión como servidor DDE. DDEServerItem Especifica los datos que serán enviados a un cliente DDE. Muy bien ahora como se supone que ya sabemos utilizar alguna variedad de componentes pues lo que haremos es un reproductor de vídeo casi casi profesional....... Bueno ustedes son los que retocaran algunos detalles.
  • 33. Reproductor de Vídeo Primeramente diseñaremos el aspecto visual después nos iremos con el código Ok. Crea una nueva Aplicación. Al Caption del Form ponle Mi Reproductor de Vídeo. Ve a la ficha System y coloca un componente OleContainer que abarque una parte considerable del formulario. Ve a la ficha Estándar y coloca un componente ScrollBar. Ponlo debajo del componente OleContainer. Ve a la ficha System y coloca un componente MediaPlayer, ahora vete a la propiedad VisibleButtons, te desglosara todos los botones del Media Player, Estarn en True por Defaul, quiero que dejes solamente los botones btPlay, btPause, btStop en True los demás ponlos en False. Ahora ve a la Propiedad Display, te desplegara una lista de componentes elige el componente OleContainer1. A un costado del componente mediaPlayer pon un componente BitBtn (Esta en la ficha Additional), agrégale una imagen (ya sabes como) y en la propiedad caption ponle Abrir. Ve a la ficha estándar y pon un componente Label, en su caption ponle Duracion, pon otro componente Label abajo de ese, y en su caption ponle T. Transcurrido. Ok. ahora pon dos componentes Label nuevamente y su propiedad Visible pónselas en False. el tercer Label tiene que quedar a un costado del Label 1 y el cuarto del 2. De cualquier forma abajo presento el diseño. Ve a la ficha System y pon un componente Timer. Mira compadre no explique todas las fichas que trae Delphi. Ok. pero con lo que hemos visto hasta ahora ya sabes navegar entre las fichas y sus componentes así es que vamos a utilizar un componente que esta en otra ficha diferente a las vistas. Vete a la ficha Dialogs, Pon el componente OpenDialog, es un componente no visual y mediante la instruccion Execute nos mostrara la típica ventana de Abrir un Archivo. Bien una vez puesto este componente vete a la propiedad Filter da doble Click a su derecha y te saldrá una venta dividida en dos partes la de la izquierda dice
  • 34. Filter Name y la de la derecha dice Filter. Ahora en filter name Escribirás Archivos Avi, en Filter escribiras *.Avi, nuevamente en una nueva fila escribe en Filter Name Todos los Archivos y en Filter *.*. Esa ventana quedaría de la siguiente forma. Muy bien Ahora ve a la ficha Win32 y coloca un componente StatusBar. Automáticamente se colocara en la parte inferior del formulario. Vete a la propiedad SimplePanel y ponla en True, Después ve a la Propiedad Simpletext y ponle Inactivo, Tienes que ponerlo como yo te lo estoy Escribiendo ya que esa etiqueta la utilizo para saber el estado del formulario y las mayúsculas o minúsculas son sensibles en las comparaciones. Muy bien si has hecho todo lo que te dije el Formulario tiene que lucir mas o menos Así.
  • 35. Ahora viene lo interesante el código. Ojo el código va completo con todo y los procedimientos que Delphi me genera en cada evento. Esos procedimientos no se copian por que Delphi te los crea. Ok. Ahora pon este código en el BitBtn1 al que le pusimos Abrir. procedure TForm1.BitBtn1Click(Sender: TObject); begin if Opendialog1.Execute = True then begin MediaPlayer1.FileName := OpenDialog1.FileName; MediaPlayer1.Open; Mediaplayer1.DisplayRect := rect(0,0,OleContainer1.Width,OleContainer1.Height); MEdiaPlayer1.Play; StatusBar1.SimpleText := 'Repoduciendo Archivo: ' + OpenDialog1.FileName; Label3.Visible := True; Label4.Visible := True; end; end;
  • 36. Observa que el OpenDialog1.Execute devuelve un valor True cuando el usuario abre un archivo, la propiedad FileName contiene el nombre el archivo que abrió. El MediaPlayer mediante su propiedad FileName le indicamos el archivo que reproducirá, después simplemente lo abrimos. Si te fijas la propiedad DisplayRect permite indicar el tamaño en que queremos visualizar el Vídeo que por cierto es el tamaño del componente OleContainer. Después ponemos visibles los Labels 3 y 4, en estos se muestra el tiempo total del vídeo y en el otro se mostrara el tiempo en el que va la reproducción. Ahora pondrás este código en el evento OnTimer del componente Timer. Puedes irte al inspector de Objetos o simplemente dale Doble Click con el ratón al componente. procedure TForm1.Timer1Timer(Sender: TObject); var posicion, duracion : LongInt; begin if StatusBar1.SimpleText <> 'Inactivo' then begin with MediaPlayer1 do begin MediaPlayer1.TimeFormat := tfMilliseconds; duracion := Round(Length div 1000); scrollBar1.Max := length; Label3.Caption := Format('%d:%d',[duracion div 60, duracion Mod 60]); posicion := round(Position div 1000); Label4.Caption := Format('%d:%d',[posicion div 60, posicion Mod 60]); ScrollBar1.Position := position; //minuto * 60 + segundo; end; end; end; El componente Timer va a estar ejecutando este código cada segundo. Primeramente verifica el StatusBar, si la propiedad simpletext es diferente a Inactivo ejecutara el código que le sigue, observa que utilizamos un With MediaPlayer do con el cual nos permite acceder a todos las propiedades de ese componente. Indicamos al MediaPlayer que el formato del tiempo será en Milisegundos, posteriormente calculamos la duración del archivo, calculamos su posición y las pegamos en los Labels. Ha y desde luego vamos recorriendo el ScroolBar. Hasta ahora con el código que hemos puesto, nuestra aplicación es capaz de reproducir vídeo y esta bien pero que tal si le damos un toque mas especialon como que al presionar las teclas Alt + Enter, el vídeo se vea a pantalla completa y de igual forma al volverlas a presionar regrese a pantalla normal. Bueno para lograr eso pon este código en el evento OnKeyDown del Formulario.
  • 37. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (HiWord(GetKeyState(VK_MENU)) <> 0) and (Key = 13) then begin if Form1.WindowState = WsNormal then begin Ancho := Form1.Width; Alto := Form1.Height; Label1.Visible := False; Label2.Visible := False; Label3.Visible := False; Label4.Visible := False; MediaPlayer1.Visible := False; BitBtn1.Visible := False; StatusBar1.Visible := False; ScrollBar1.Visible := False; OleContainer1.Visible := False; Form1.BorderStyle := BsNone; Form1.WindowState := WsMaximized; MediaPlayer1.Display := Form1; MediaPlayer1.DisplayRect := rect(0,0,Form1.Clientwidth,Form1.ClientHeight); end else begin Form1.WindowState := WsNormal; Form1.Width := Ancho; Form1.Height := Alto; Form1.Position := PoScreenCenter; Label1.Visible := True; Label2.Visible := True; Label3.Visible := True; Label4.Visible := True; MediaPlayer1.Visible := True; BitBtn1.Visible := True; StatusBar1.Visible := True; ScrollBar1.Visible := True; OleContainer1.Visible := True; Form1.BorderStyle := BsSingle; MediaPlayer1.Display := OleContainer1; MediaPlayer1.DisplayRect := rect(0,0,Form1.Clientwidth,Form1.ClientHeight); end; end; end;
  • 38. Como puedes ver es mas código verdad, pues si pero es que para reproducir el vídeo a pantalla completa tenemos que poner en False la propiedad Visible de todos los componentes Visuales y de igual forma ponerla en True cuando regrese a pantalla normal. Antes de seguir con el código debes saber que he declarado dos variables de tipo global para este formulario, las variables son Ancho y Alto, las utilizo para almacenar el tamaño del Form al momento de maximizarlo a pantalla completa y de esta forma cuando el usuario regrese a pantalla normal utilizo el valor de esas variables para volver el Form a su tamaño original. Las variables Globales del Form las declaras en la cláusula Var del Unit del Form. esta justo arriba de la cláusula Implementation. mira para que te ubiques te muestro la parte en donde tienes que declararlas. Ok. var Form1: TForm1; Ancho : Integer; //Aqui estan declaradas Alto : Integer; implementation {$R *.dfm} Como ves están casi al inicio del Unit. Sí puedes encontrarlo y declararlas verdad. yo se que si. Muy bien prosiguiendo con la explicación, estoy utilizando una llamada a GetKeySatate y Key para saber cuando se presionan las teclas Alt y Enter(Checa su uso en la pagina de trucos). Ahora cuando se presionan estas teclas resta saber en que estado se encuentra mi formulario, en caso de que este normal lo maximizo en caso contrario lo pongo en estado normal, Ahora esto se realiza checando la propiedad WindowsState. Cuando maximizo la ventana en las variables globales Ancho y Alto guardo el valor de las propiedades Width y Height del Form mismas que tienen las dimensiones del formulario respectivamente. Después Pongo la propiedad Visible en False de todos los componentes visuales. Enseguida entenderás por que. Hay te va una nota acerca del MediaPlayer, no nada mas puedes reproducir vídeo en un OleContainer si no en cualquier superficie plana, como un Panel o el mismo Form, y es eso lo que hacemos, ponemos la propiedad BorderStyle del form en BsNone y lo maximizamos, de esta forma el Form abarca toda la pantalla incluyendo la barra de inicio de windows, bueno despues unicamente resta indicarle al MediaPlayer que se va a reproducir en el form, y eso lo hacemos mediante la propiedad Display. Ojo aparte de indicarle que se reproducirá en el form hay que indicarle las nuevas dimensiones del vídeo mediante la propiedad DisplayRect. Esto es en si lo que sucede cuando se maximiza.
  • 39. Órale pues..... cuando se minimiza pues simplemente pones visibles todos los componentes visuales, volvemos a poner el BorderStyle del Form en BsSingle, la propiedad WindowsState del form la ponemos en WsNormal, mediante las variables Globales Ancho y Alto ponemos las dimensiones del Form, le indicamos al mediaPlayer que se reproducirá en el OleContainer y listo. Hay otras cosillas pero es básicamente esto. Baya hasta que termine el ejemplo verdad compadres.... Bueno pero el manual aun sigue le cuelga siempre muchita información todavía. Bases de Datos Baya por fin hemos llegado a una parte que tal vez estabas esperando. Antes de empezar quiero adelantarles que durante los capítulos siguientes aremos algunas bases de datos. Delphi posee su propio motor de base de datos el BDE o Borland Databae Engine el cual nos permite desarrollar nuestras aplicaciones independizándolas del gestor de bases de datos. El BDE sirve como traductor entre nuestra aplicación y las bases de datos que utilizamos funcionando también como interfaz entre los componentes especializados para bases de datos que posee Delphi. El BDE cuenta con una biblioteca de funciones conocida como IDAPI (Integrated Database Applications Program Interface) que es el traductor ante los distintos gestores de bases de datos para que entiendan lo que nuestra aplicación realiza. Delphi posee una herramienta que nos permite diseñar nuestras bases de datos, es un programa llamado Database DeskTop. Primeramente mostrare las fichas de componentes mas comunes relacionados con el manejo de bases de datos. Ficha Data Access Contiene componentes para realizar conexiones con las bases de datos y obtener la información que en ella se almacena. A continuación se muestra.
  • 40. Ficha Data Acces Imagen Componente Descripción DataSource Realiza las conexiones a las bases de datos. ClientDataSet Permite el acceso a datos tanto en una aplicación estándar como el acceso desde clientes en sistemas distribuidos. Ficha Data Controls En esta ficha se encuentran componentes similares a los de la ficha standard y Additional pero que estarán ligados a bases de datos permitiendo con esto trabajar con la información almacenada en ellas. Imagen Componente Descripción DbGrid Presenta los datos en una rejilla de filas y columnas. DbNavigator Posibilita la navegación por los registros de una tabla permitiendo su navegación, modificación, eliminación. DbText Label vinculado a bases de datos. DbEdit Cuadro de texto vinculado a bases de datos. DbMemo Memo vinculado a bases de datos. DbImage Image vinculado a bases de datos. DbListBox ListBox Vinculado a bases de datos. DbComboBox ComboBox vinculado a bases de datos.
  • 41. DbCheckBox CheckBox vinculado a bases de datos. DbRadioGroup RadioGroup vinculado a bases de datos. DbLookupListBox ListBox que presenta datos de una tabla y modifica los de otra. DbLookupComboBox ComboBox que presenta datos de una tabla y modifica los de otra. DbRichEdit RichEdit vinculado a bases de datos. DbCtrlGrid Permite personalizar un area de presentación de datos y permite que el área actúe como un Dbgrid. DbChart Chart vinculado a bases de datos. Ficha BDE Esta ficha contiene componentes que habilitan la conexión a bases de datos utilizando el BDE engine de Delphi. Imagen Componente Descripción Table Permite la conexión a una tabla de una base de datos. Query Permite crear y ejecutar consultas SQL a una base de datos. StoredProc Permite ejecutar procedimientos almacenados en un servidor de bases de datos. DataBase Realiza conexiones a servidores remotos. Session Gestiona y controla las conexiones activas a las bases de datos.
  • 42. BatchMove Permite realizar acciones sobre los datos localmente que luego serán enviados al servidor. UpdateSQL Permite realizar actualizaciones en una base de datos SQL. NestedTable Encapsula una tabla que esta anidada dentro del campo de otra tabla. BDEClientDataSet Permite el acceso a datos por parte de aplicaciones cliente, etc. a través del BDE. Database DeskTop Delphi nos permite crear bases de datos en tiempo de ejecución mediante código, pero también nos brinda la posibilidad de crearlas en tiempo de diseño mediante el Database Desktop. Esta herramientas nos permite en realidad hacer otras cosillas, pero no quiero adentrarme mucho en, solo quiero enseñarles lo básico para continuar con este manual o curso. Database DeskTop me permite crear tablas de diferente tipo como tablas Paradox, Dbase, MsAcces, Foxpro, Informix, etc. en este caso nos enfocaremos a crear tablas de tipo Paradox aunque en su momento are una aclaración cuando es necesario utilizar algún otro tipo de tabla. OK. Muy bien para entrar al DataBase DeskTop lo podemos hacer de dos formas, la primera es accesando desde el menú inicio/programas/Delphi/Database DeskTop. La otra es Dentro de Delphi te vas al Menú Tools y encontraras la opción Database Desktop. Muy al accesar al el te aparecerá de la siguiente forma.
  • 43. Muy bien, antes de seguir quiero explicar que en Delphi se manejan mucho los alias, los cuales son un identificador para un directorio o carpeta en los cuales se tienen guardadas las bases de datos. Estos alias son muy útiles ya que usualmente tienes que indicar la ruta en dónde está tu tabla como por ejemplo c:programaTablas, ahora el detalle está que cuando pasas tu aplicación a otra unidad debes cambiar la ruta a cada tabla y recompilar. todo eso se soluciona pues utilizando alias, de hecho en los programas instaladores como el Install Shield te permite crear el alias que en tu aplicación ayas puesto, es útil de verdad. Solo que para estos ejercicios lo are de la forma tradicional solo queria informarles que existe esa posibilidad, por cierto en el alias DbDemos Delphi guarda algunas tablas de ejemplo por si después quieres hecharles un ojillo primo. Muy bien vete al menú que dice File, después al New y por ultimo Table, de esta forma creamos nosotros una tabla, pero antes nos presenta una pequeña ventana en la cual nos pide que elijamos que tipo de dato crearemos, si va hacer paradox, foxpro, etc. te presento esa venta.
  • 44. Elige Paradox 7, de hecho esta activada por defaul. después de eso te saldrá la siguiente ventana: En esta ventana es en donde crearemos la estructura de nuestra base de datos el campo Field Name contendrá los nombres de los campos de nuestra base de datos que en este ejemplo serán: Clave, producto, proveedor, precio y mínimo. Después está otra leyenda que dice Type, contendrá el tipo de dato que será nuestro campo, para seleccionar el tipo de dato basta con situarnos en Type y presionar la barra espaciadora y nos desplegara todos los tipos de datos, de cualquier forma si sabemos su tecla abreviada se la podemos escribir directamente. Está la leyenda que dice Size la cual indica el tamaño del campo, eso se lo indicamos tecleándolos directamente. Por ultimo está la leyenda Key, sirve para indicar cuales campos serán nuestras claves primarias. para elegir un campo como clave primaria posicionate en Key y presiona la barra espaciadora, se pondrá un asterisco en señal de que es clave primaria. Ahora quiero que hagas la siguiente estructura: Field Name Type Size Key
  • 45. Clave I (Long Integer) * (Clave Primaria) Producto A (Alpha) 40 Cantidad N (Numeric) Precio $ (Money) Minimo I (Integer) Muy bien ya que tecleaste esta estructura quiero que te ubiques en la parte izquierda de tu ventana, encontraras una leyenda que dice Table Properties y debajo de ella un especie de Combobox. Ese combobox contiene las propiedades de la tabla que tu puedes configurar. No entrare en mas detalles, solo te digo que experimentes un poco con ellas. No vamos a crear algún índice secundario en esta tabla por que usaremos algunas sentencias Sql en búsquedas por producto con propósito de aprendizaje, por lo tanto no es necesario crearlo. Muy bien ahora solo quiero que des Click en el botón que dice Save As, y guardes la tabla en el directorio c:Ejemplo con el nombre de Inventario. Para crear el directorio vete al explorador ó Mi PC y simplemente vete a la unidad C y créala. De igual forma como creaste esta tabla quiero que hagas las siguientes tablas y las guardes en el mismo directorio OK. Tabla Ventas (que sea paradox 7). Field Names Type Size Key Fecha D * Ingreso $ Guardala con el nombre de ventas OK. Tabla Auxiliar (que sea paradox 7). Field Names Type Size Key Clave I Cantidad N Producto A 40 Precio $ Subtotal $ Guardala con el nombre de Auxiliar OK. El ejercicio que realizaremos se trata de un sistema que controla un inventario de productos, ventas de productos y generación de reportes de las utilidades, en este
  • 46. momento hemos creado las bases de datos, pero falta explicar muchas cosas que son necesarias por lo tanto conforme se expliquen se le ira avanzando al sistema Ok. Componente TTable Es un componente no visual y se encuentra en la ficha BDE. Cuando se trabaja con una base de datos, el principal responsable de prácticamente todo es el componente Table. Este componente es el encargado de leer, escribir, actualizar, etc la base de datos a la cual esta conectado, y forma una pareja muy útil con el componente Datasource, el cual es el encargado de conectar el componente table con los controles usados para visualizar los datos. La primera propiedad que se debe modificar en el componente es la que hace referencia a que base de datos queremos conectar el componente y se trata de la propiedad DatabaseName. Existen dos formas de indicarle la base de datos que usaremos, una es dándole toda la ruta que en nuestro caso seria C:EJEMPLO o indicando el alias que se haya definido en el sistema que es lo mas recomendable utilizar los alias pero bueno esa es otra historia digiera chonita. Bueno después de esto es necesario indicarle la tabla que se va a utilizar y esto se hace en la propiedad TableName, esta propiedad me listara todas las tablas existentes en la ruta o alias que pusimos en el DatabaseName, posteriormente la propiedad Active se tendrá que poner en True para poder manipular la tabla. Existen otras propiedades interesantes como IndexFieldNames que es para indicarle el índice que usaremos en la tabla. Desde luego mostrara las claves primarias que se hayan puesto cuando se diseño la B.D. Existe otra propiedad para los índices secundarios que funciona exactamente igual y es la propiedad IndexName. El componente Table tiene una larga lista de eventos, que se pueden dividir en tres grupos, los eventos que se producen antes de un operación como una apertura, cierre, lectura, etc., los cuales empiezan por la palabra Before, luego están los eventos que se producen en el momento y cuyo nombre empieza por On y por ultimo los eventos que se producen después, cuyo nombre empieza por After . A continuación te listo los principales eventos del componente Table. AfterDelete Se genera después del borrado de un registro AfterEdit Se genera después de editar un registro AfterInsert Después de Insertar After Post Después de grabar los datos BeforeCancel Antes de cancelar la operación
  • 47. BeforeClose Antes de que se cierre la tabla BeforeDelete Antes de borrar un registro BeforeEdit Antes de editar el registro actual BeforeInsert Antes de insertar un registro BeforeOpen Antes de abrir la tabla BeforePost Antes de guardar los datos OnCalcFields Se genera cuando se va a calcular el valor de un campo OnDeleteError Cuando se produce un error al borrar un registro OnEditError Cuando hay un error al editar un registro OnFilterRecord Cuando se activa el filtrado OnNewRecord Cuando se añade un registro OnPostError Cuando hay un error durante el grabado de datos Ahora te listare las operaciones mas comunes que se realizan en un componente Ttable. Open Se abre la tabla Close Se cierra la tabla Edit Para editar el campo actual Insert Añade datos a la tabla Post Graba los datos Cancel Cancela la operación actual Delete Borra el registro actual de la tabla First Se va al primer registro de la tabla. Last Se va al ultimo registro de la tabla. Next Avanza al siguiente registro. Prior Retrocede un registro. Cuando se manejan bases de datos es común que necesitemos acceder a los sus campos mediante código y precisamente un método de acerlo es utilizando FieldByName. Accesos fisicos a la tabla utilizando FieldByName . . . FieldByName permite el acceso al objeto Tfield asociado a un determinado campo a partir del nombre del campo en la tabla su sintaxis es de la siguiente forma: Function FieldByName(Const NombreCampo: String): TField;
  • 48. No te espantes es fácil utilizarlo por ejemplo en nuestra base de datos Inventario que acabamos de crear si queremos acceder al campo Producto y asignarle un nombre seria de la siguiente forma: Table1.FieldByName('Producto').AsString := 'Sabritas'; Como ves primeramente va el nombre del componente Table que estará ligada a nuestra base de datos física, posteriormente escribimos FieldByName en el cual dentro de paréntesis y entre comillas simples indicaremos el nombre del campo al cual aremos referencia, por ultimo bastara con indicarle el tipo de dato que es el campo al cual hacemos referencia, que por cierto eso lo indicamos con el .As. En caso de que quieras leer el valor de un campo y asignarlo a una variable pues simplemente cambia la posición de la línea de código anteriormente escrita solo recuerda que los tipos de datos sean iguales. Inicio y fin de la Tabla . . . Cuando en un desplazamiento sobre la tabla se llega a su inicio o a su final se modifican las propiedades Bof y Eof. La propiedad Bof toma el valor True cuando se esta en el primer registro de la tabla y la propiedad Eof toma el valor True cuando se esta en el ultimo registro de la tabla o cuando la tabla esta vacía. Por ejemplo para saber si se ha llegado al final de la tabla seria: If Table1.Eof = True then ShowMessage('SE ESTA EN EL FINAL DE LA TABLA'); Ordenación de Registros . . . Una vez que se ha definido un DataSet los registros que contiene se encuentran ordenados por su índice activo y este índice queda determinado por el valor de la propiedad IndexName del componente TTable si no se especifica u índice secundario se tomara el índice primario. Otra forma de ordenar la tabla es utilizando la propiedad IndexFieldNames en la cual se pondrá el índice primario por el cual se quiere ordenar. Los índices previamente se tuvieron que haber declarado en la tabla. En tiempo de ejecución también se puede cambiar el índice de ordenación, por ejemplo el código para ordenar la tabla Inventario a través de su Clave primaria seria así. Table1.IndexFieldNames := 'Clave'; Como puedes ver simplemente se le asigna el nombre del índice a la propiedad IndexFieldNames. Es de igual forma para la propiedad IndexName.
  • 49. Búsquedas de Registros . . . El componente Table proporciona una serie de herramientas para realizar búsquedas de registros con la limitación de que solo se realizaran con campos indexados, yo utilizare el método mas común y menos problemático que es el método directo. Mediante el método FindKey se busca en la tabla para encontrar un registro en el que sus campos índices coincidan con los que se han pasado como argumentos en un array de valores separados por comas, regresa un valor Falso O Verdadero dependiendo si tuvo éxito o no en la búsqueda. Por ejemplo en la tabla Inventarios para buscar un producto se escribiría el siguiente código. If Table1.FindKey([Edit1.Text]) = True Then ShowMessage('Producto Localizado') Else ShowMessage('Producto no encontrado'); Como puedes ver simplemente va el nombre del componente Table que previamente nosotros lo ligaremos a la B.D., posteriormente va FindKey en el cual entre paréntesis y corchetes ponemos la variable o el dato a buscar que en este caso estoy suponiendo que en un Edit el usuario escribió el producto que desea buscar. Ahora como el método devuelve un valor True cuando se tiene éxito pues solo lo comparo con un if igualado a True. Ahora si deseas que el sistema en caso de que no encuentre el registro se posicione en el registro mas cercano al buscado se pondría la siguiente Instrucción. If Table1.FindKey([Edit1.Text]) = True Then ShowMessage('Producto Localizado') Else Table1.FindNearest([Edit1.Text]); Como puedes ver esto lo hice utilizando la instrucción FindNearest. Aunque Ami en lo particular me gusta utilizar este método y cuando necesito realizar una búsqueda por un campo que no es índice utilizo el SQL pues... no le aunque les explicare el otro método existente para busquedas.
  • 50. El otro método de búsquedas es Locate, el cual nos permite buscar por una condición en un columna o por varias columnas. Locate es una función que devuelve True o False según ha tenido éxito o no, y si su busqueda fue exitosa la tabla muestra la fila que cumplió la condición. Para usar este método se han de pasar una serie de parámetros y a continuación te muestro su sintaxis: Locate(const KeyFields : string; const KeyValues : Variant; Options : TLocateOptions) El primer parámetro es el campo o campos por los cuales queremos hacer la búsqueda, por ejemplo en nuestra tabla Inventario hay un campo en el cual guardamos el nombre de los productos y siqueremos realizar una búsqueda por este campo es en este primer parámetro donde debemos poner el nombre del campo. El segundo contiene la condición, por ejemplo si estamos buscando productos según su proveedor es aquí en donde lo pondríamos. El ejemplo quedaría así: Table1.Locate ('Producto','CocaCola',[]); Por último esta Options, el cual indica como se ha de realizar la búsqueda, si se ignoran las mayúsculas, si se hacen búsquedas parciales en los campos Alfanuméricos, etc, esto quiere decir que se mostraran las filas que contengan CocaCola en sus respectivos campos además que otros datos, o sea que la busqueda no es exacta. Por ejemplo: Table1.Locate ('Producto','CocaCola',[ loCaseInsensitive]); Recuerda que te dije que el componente Table va íntimamente relacionado con el DataSource, pos es cierto así es que te te explicare su funcionamiento. DataSource El componente table pertenece a un grupo de componentes que son derivan del componente TDataset, estos componentes acceden por diferentes caminos a los datos, por lo que la interfaz obtenida difiere según el componente empleado. Para que los diferentes controles que muestran los datos sean capaces de acceder a esta variedad de interfaces pues se utiliza el DataSource el cual es un componente intermedio el cual tiene la tarea de mostrar una interfaz común a todos los controles. La propiedad mas importante del DataSource es DataSet en la cual se pondrá la tabla que queremos ligar a el.
  • 51. Controles Data-Aware Son los que se encuentran en la ficha DataAcces y Excepto por el componente DbNavigator el resto de los componentes son utilizados para presentar los datos de las tablas. Uno de los componentes mas comunes sin duda es el Dbgrid el cual esta constituido por un conjunto de rejillas a través de las cuales nos presenta la información de las tablas. A continuación te lo explicare. Componente DBGrid . . . Nos sirve para visualizar información almacenada en una tabla, pero aparte de eso podemos también realizar inserciones, ediciones, modificaciones, etc. y cuenta con varias propiedades y métodos que nos ofrecen una amplia gama de configuraciones tanto para el aspecto como para el funcionamiento del control. La propiedad principal es DataSource, es aquí en donde indicamos el datasource al cual queremos vincularlo. En caso de que el DataSource se encuentre en otro formulario pues simplemente se le escribe el nombre del formulario en el que se encuentra y su dataSource, por ejemplo supongamos que tengo 2 formularios en el primero tengo mi tabla y mi DataSource1 y en el segundo formulario tengo un DbGrid1 pues simplemente para ligarlo en su propiedad DataSource pondría Form1.DataSource1 y presto es todo. Después existen otras propiedades interesantes como Options que a continuación describo. dsEditing El usuario puede editar los datos sobre la rejilla dgAlwaysShowEditor La rejilla esta en modo edición, no hace falta pulsar F2 dgTitles Muestra los títulos de las columnas dgIndicator Se muestra un indicador para conocer el registro activo dgColumnResize Permite cambiar el ancho de las columnas dgColLins Dibuja líneas de separación entre las columnas dgRowLines Dibuja líneas de separación entre las filas dgTabs Se puede navegar por el componente usado la tecla Tab dgRowSelect Selecciona filas completas en lugar de filas dgConfirmDelete Permite borrar registros, mostrando un mensaje dgCancelOnExit Cancelas las inserciones vacías al salir
  • 52. del control dgMultiSelect Permite seleccionar múltiples filas a la vez Hasta ahora esta bien con el DBGrid pero su verdadera potencialidad se encuentra en la propiedad Columns, que encapsula tanto el aspecto de las columnas como los campos de las tablas o consultas SQL que están ligadas al la columna. Cuando no se definen columnas en un DBGrid automáticamente el control creara una columna para cada campo de nuestra base de datos. Para accesar al editor de columnas basta con dar doble click sobre el componente o dar un click con el botón secundario y elegir la opción Columns Editor del menú emergente, saldrá la siguiente ventana. Para este pequeño ejemplo es necesario que hagas lo siguiente: 1. Pon un componente Table, en su propiedad DataBasename elige DBDemos, en su propiedad TableName elige la tabla Animals, pon la propiedad Active en True. 2. Coloca un componente DataSource y en su propiedad DataSet pon Table1. 3. Coloca un componente DbGrid y en su propiedad DataSource pon DataSource1. Ahora viene algo importante, hasta ahora nos mostrara todos los campos de la tabla en nuestro DBGrid por lo tanto quiero que des doble Click sobre el DBGrid y
  • 53. aparecerá el editor de columnas, pero sorpresa verdad esta vacío y eso es por que no se han definido y para definirlos basta con dar un click en el tercer icono que dice Add All Fields y nos agregara una columna para cada campo de nuestra base de datos empezando por un índice cero, bien ahora ya tengo todos los campos de mi base de datos por lo tanto si quiero borrar algunos bastara con seleccionarlos y dar un click en el segundo icono que dice Delete Selected (Del), cabe mencionar que no solo puedo borrar algunos campos que no quiera si no que también puedo cambiar el orden de las columnas arrastrando con el puntero del ratón a la posición que deseo un campo en particular. Cuando estoy en el editor de columnas y selecciono una de ellas cambiaran las propiedades en el inspector de objetos brindándonos con esto ciertas opciones que podremos modificar, a continuación te las describo. Alignment Alineación de la columna Button style Permite desplegar un lista con valores, o un botón Color Color de fondo de la columna DropDown Rows Número de filas desplegables FieldName Nombre del campo que se visualiza Font Fuente con la que se muestra la información de la columna PickList Lista de valores que aparecerán al desplegar la columna ReadOnly Esta columna solo es de lectura Width Ancho de la columna en Pixels Title Título de la columna Ahora la opción Title tiene ciertas propiedades que son interesantes es por eso pariente que las describo. La propiedad PickList es una propiedad que apunta a una lista de String y el efecto que produce es que en la columna donde se ponga se muestra un menú desplegable que se activara con el ratón y contendrá todo lo que hayamos puesto AlignmentAlineación de la cabecera de columna Caption Texto que muestra la cabecera de la columna Color Color fondo de la cabecera Font Fuente con la que mostrara la cabecera
  • 54. en la propiedad PickList, solo ten cuidado ya que la propiedad ButtonStyle debe ser cbsAuto. Se puede manipular información y realizar operaciones con los campos del DBGrid los métodos mas comunes son el DbGrid1.Columns[número_columna].Propiedad y DbGrid1.Fields[número_columna].propiedad. Todo dependerá de que tipo de operación deseo realizar. DBNAvigator . . . Este control tiene incorporada las funcionalidades mas comunes que se realizan sobre una base de datos ya que con el podemos navegar entre los registros, eliminar un registro, ponerlo en modo de edición, insertar registros, etc. su propiedad mas importante es la DataSource en la cual se tiene que indicar el DataSource sobre el cual trabajara. Describo los botones del navegador. Botón Método Descripción nbFirst First Salta al primer registro de la tabla. Desactiva los botones First y prior y activa Next y Last si no lo estaban. nbPrior Prior Retrocede al registro anterior del actual, activa Next y Last. nbNext Next Avanza al registro posterior al actual, activa First y Prior. nbLast Last Salta al ultimo registro de la tabla, desabilita Next y Last y activa First y Prior. nbInsert Insert Inserta un nuevo registro en la posicion anterior al registro actual, modifica el estado de la tabla a modo de Edicion. nbDelete Delete Borra el registro actual y se posiciona en el registro siguiente nbEdit Edit Pone la tabla en modo de edición, con lo cual se pueden modificar los datos del registro. nbPost Post Escribe en la base de datos los cambios realizados sobre
  • 55. el registro activo. nbCancel Cancel Cancela la edición del registro activo y recupero los datos anteriores. nbRefresh Refresh Refresca la tabla o la actualiza. Una propiedad interesante es la propiedad VisibleButtons que contiene todos los botones que nos presenta el DBNavigator, basta con poner en false los que no queramos que se muestren. La propiedad Hints permite colocar una leyenda para cada botón, si desactivaste algún botón su leyenda solo déjala en blanco. sale primo. La propiedad ConfirmDelete recibe un valor Booleano y esta en True por defaul y lo que realiza es mandarnos un mensaje de advertencia cuando se trata de borrar un registro. Ahora a nuestro formulario por favor colócale un DbNavigator y listo podrás recorrer los campos de la tabla Animals que pusimos anteriormente, solo recuerda poner en la Propiedad DataSource del DBNavigator DataSource1. DBEdit, DBText (Ficha DataAcces). . . El componente DBEdit esta diseñado tanto para presentar datos como para introducir datos en una tabla y su propiedad mas importante es DataSource, la cual hará referencia a la tabla con la que se trabajara. La propiedad DataField Indica el campo de la base de datos con el cual se trabajara. Esta propiedad mostrara todos los campos de la tabla solo tienes que elegir cual quieres. Otra propiedad interesante podría ser ReadOnly la cual recibe un valor Boolano y sirve para poner el campo en solo lectura desabilitando de esta forma que se capture información sobre el. Las demás propiedades son iguales a las del Edit. El componente DBText esta diseñado solo para presentar información. Tiene el aspecto de un Label solo que a diferencia de este ultimo, mostrara la información contenida en un registro de la base de datos, no se puede introducir información en un DBText. Sus propiedades mas interesantes son el DataSource y DataField, las cuales funcionan igual que las del DBEdit. NOTA: Todos estos componentes funcionan a través de las propiedades
  • 56. DataSource y DataField, solo es cuestión que indagues sobre ellos un poco y tu mismo descubrirás su funcionalidad. BUSQUEDAS SQL. . . Para poder ejecutar una consulta SQL es necesario añadir un componente TQuery. Con el componente TQuery podemos acceder a varias tablas a la vez o filtrar dinámicamente cualquier tipo de registros. La ejecución de una consulta SQL entrega como resultado una nueva tabla, las características de esta tabla son en principio independientes de la base de datos. A continuación te listo algunas sentencias SQL. Propiedades de TQuery. Propiedad Descripción DataBaseName Nombre de la base de datos a la que se accede. SQL Array de string que contiene la consulta que dará lugar a la nueva tabla. Active Provoca la presentación inmediata de los datos ejecutando la consulta. Params Array que incluye los parámetros de una consulta. RequestLive Permite modificar los registros que fueron resultado de una consulta. Metodos de TQuery. Método Descripción ExecSQL Ejecuta la sentencia SQL sea o no de selección de registros. Open Ejecuta una consulta SQL de selección de registros. Close Cierra el componente. First Last Next Prior MoveBy Navegación por los registros de la tabla. Append Métodos para Insertar Registros.
  • 57. Insert AppendRecord InsertRecord Delete Borrar el registro actual. Edit Permite modificar el registro actual. La mayoría de las operaciones son similares a las que se realizan en un componente TTable. Las consultas que se definen en la propiedad SQL. se ejecutaran en tiempo de ejecución mediante los métodos Open y ExecSQL, en donde Open se utiliza en consultas que devuelven una nueva tabla (Sentencias Select) y ExecSql en aquellas que no devuelven ningún registro como una eliminación o inserción. Un componente TQuery difiere de un componente TTable en que puede acceder directamente a mas de una tabla y sobre todo que permite seleccionar que registros y que columnas se desean presentar. haremos un ejemplo para que quede mas claro el asunto. Crea una nueva aplicación Delphi. Sobre el formulario pon un componente TQuery que esta en la ficha BDE. En su propiedad DataBaseName pon C:EJEMPLO que es el directorio en el cual guardamos la tabla inventario. Coloca un componente DataSource, en su propiedad DataSet pon Query1. Coloca un componente Label, en su propiedad Caption pon Producto. Coloca en frente del Label un componente Edit. Coloca un componente DbGrid, en su propiedad DataSource pon DataSource1. Coloca un componente BitBtn. Ahora el diseño quedaría mas o menos así.
  • 58. Muy bien ahora viene lo interesante tienes que recordar que en la propiedad SQL del Query es donde introduciremos el código SQL para realizar la búsqueda, ahora debemos tomar en cuenta que es un array y que nosotros estamos manejando una variable que es el nombre del producto a buscar mismo que se guarda en el Edit1. Por lo tanto para generar la consulta es necesario realizar una serie de concatenaciones que para no hacértela pesada pariente de muestro el codigo que pondrías en el evento Onclick del BitBtn. procedure TForm1.BitBtn1Click(Sender: TObject); var consulta : String; begin consulta := 'SELECT PRODUCTO, PRECIO FROM INVENTARIO.DB WHERE PRODUCTO LIKE '''; consulta := consulta + '%'; consulta := consulta + EDIT1.Text; consulta := consulta + '%'; consulta:=consulta + ''''; consulta:=consulta + ' ORDER BY PRODUCTO'; QUERY1.SQL.Clear; QUERY1.SQL.ADD(consulta); QUERY1.Active := TRUE; QUERY1.Open; end; Para generar la consulta estoy utilizando la instrucción SELECT la cual tiene la siguiente sintaxis: SELECT Col1 [, Col2] FROM Tabla [WHERE Predicado] [ORDER BY Columna] En donde Col1 y Col2 son los nombres de las columnas de las tablas, en caso de que se quieran mostrar todas las columnas utiliza el asterisco ( * ). El predicado es una condición. La columna especificada en la cláusula ORDER BY tiene que ser una de las columnas seleccionadas en la sentencia SELECT. Yo en el ejemplo utilizo SELECT PRODUCTO, PRECIO FROM INVENTARIO.DB WHERE PRODUCTO LIKE '''; muy bien explicare por pasos hasta where no creo que haya problemas por que después del SELECT van las columnas que mostrare en mi DBGrid despues mediante el form indico la tabla a la cual accedere y
  • 59. mediante el WHERE condiciono la búsqueda, solo que les explicare que chingaos es lo que me realiza LIKE. LIKE lo que me permite es realizar búsquedas parciales o de semejanza, es decir supongamos que yo no se el nombre completo de un producto, entonces que hago bueno pues introduzco hasta donde se del nombre del producto y el sistema buscara registro por registro donde haya semejanza con la cadena introducida. Es como cuando buscamos archivos o carpetas en windows si ponemos imágenes me mostrara todas las carpetas o archivos que se llamen imágenes o que en alguna parte de su nombre diga imágenes. Creo que con esto quedo explicado LIKE. Ahora bien para utilizar el LIKE es necesario echar mano de un comodín que es el % el cual deberá ir entre comillas simples. Por lo tanto entonces LIKE debera estar por ejemplo LIKE '%COCA%'. Es por eso que al inicio y al final del SELECT le pongo un % y entre los % coloco el contenido del Edit1. Ahora comprendes por que utilizo una variable y realizo varias concatenaciones. Bueno parientes después de que pongo toda la consulta que quiero realizar en la variable consulta simplemente se la agrego a la propiedad SQL del Query mediante QUERY1.SQL.ADD(consulta) y posteriormente Activo la consulta con QUERY1.Active := TRUE Y QUERY1.Open para ejecutar la consulta. Las consultas SQL tienen mucha mas potencialidad que lo que aquí te estoy explicando te recomiendo que bajes algun manual sobre SQL y lo estudies de cualquier forma el Query soporta la mayoría de las instrucciones SQL utilizadas. Pariente solo te queda correr el programa y experimentar con el. Solo agrégale algunos productos a la base de datos por que seguramente estará en blanco. Puedes utilizar el DBGrid y DBNavigator que por cierto ya te los explique verdad. Vamos amigo no te desanimes que todavía faltan los reportes y claro el ejercicio final con nuestras bases de datos. Reportes con QuickReport Una cosa es utilizar el objeto Tprinter para mandar a impresión los archivos, gráficos, etc., y otra muy distinta utilizar el QuikReport para la impresión de información contenida en bases de datos. Delphi dedica una ficha exclusiva para el manejo de impresiones, la cual es Qreport de entre los cuales el componente mas importante es precisamente el QuickReport. Esta ficha contiene a su vez un conjunto de componentes que se
  • 60. direccionan directamente a los campos de las bases de datos permitiendo con esto que la generación de informes sea verdaderamente sencilla. Bueno para que veas que no soy gacho te explico algunos componentes de esa ficha. Ficha QReport Contiene 23 componentes que facilitan la creación de informes. Te describo solo algunos de ellos. Ficha QReport. Componente Tipo Descripción QuickReport Control que agrupa el documento QuickReport para añadir facilidades de impresión de informes. QRSubDetail Vincula DataSets adicionales al informe. QRStringsBand Es un contenedor de objetos visuales. QRBand Presenta datos de fuentes que no son bases de datos. QRChildBand Expanden a un componente QRBand con el que se vinculan. QRGroup Crea grupos de datos. QRLabel Escribe Texto en un informe. QRDBtext Escribe texto vinculado a un campo de una B.D. en un informe. QRMemo Escribe texto multilínea en un informe. QRRichText Escribe texto con formato RTF en un informe. QRDBRichText Escribe un campo de la base de datos que contiene texto en formato RTF. QRShape Dibuja Líneas, Polígonos y Círculos en un informe.
  • 61. QRImage Dibuja imágenes en un informe. QRDBImage Dibuja un campo de la B.D. que contiene una imagen. QRChart Dibuja Gráficos en un informe. Hay que mencionar que Delphi posee un asistente que te ayuda a generar automáticamente el reporte, durante el proceso tu le indicas la tabla, los registros que quieres imprimir, el tipo de reporte, etc. pero bueno eso lo puedes experimentar por ti mismo esta en File/News/Others te saldrá una ventana elige la pestaña de Business y el icono que dice QuickReport Wizad. Para generar un informe es necesario crear un nuevo formulario y sobre el insertar el componente QuickReport que será el contenedor de todos los demás componentes que utilizaremos para nuestro informe. Al momento de colocar el QuickReport saldrán las barras de desplazamiento del formulario eso por que el área del QuickReport es mayor a la del formulario. Tabla con las propiedades mas interesantes: Propiedad Descripción DataSet La propiedad DataSet del QuickReport nos sirve para indicarle sobre que tabla se estará trabajando, en caso de que la tabla se tuviera en otro formulario pues simplemente se le pone el nombre del formulario en el que esta, seguido del nombre de la tabla. ShowProgress Indica si se visualiza una ventana mientras se generan datos a incluir en el informe, indicando el estado de preparación del informe. PrintEmpty Controla si se debe imprimir el informe en el caso de que no tenga ningún dato. PrinterSetting Contiene un subconjunto de propiedades relacionadas con la configuración de la impresora, copias a imprimir, impresión multipágina, etc. Bands Contiene los distintos tipos de bandas para nuestro informe. Options Permite la impresión del encabezado en la primera pagina y el pie en la ultima. Componente QRBand . . .
  • 62. Un informe compadres esta dividido en varias secciones como lo son la cabecera de pagina, el titulo, la cabecera de columnas, el pie de pagina, etc., y este componente nos permite definir todas estas secciones comportándose como un contenedor para cada una de esas secciones. Una de sus principales propiedades es BandType en la cual indicamos el tipo de banda que utilizaremos pero bueno no te aguites compita a continuación te listo los posibles valores para esta propiedad. Tipos de Bandas . . . Constante Descripción rbTitle Banda con el titulo del informe y se imprime solo en la primera pagina. rbPageHeader Cabecera de todas las paginas del informe, esta se va a imprimir en la primera pagina dependiendo del valor de la propiedad TQuickRep.Options.FirstPageHeader. rbPageFooter Es el pie de pagina y se va a imprimir en la ultima pagina dependiendo del valor de la propiedad TQuickRep.Options.LastPageFooter. rbSummary Es un sumario que se imprime solo en la ultima pagina al final de todos los datos. rbColumnHeader Es el titulo de cada columna de datos y se imprime en cada pagina. rbDetail Registros del informe, se imprime una fila por cada registro del DataSet del informe. rbChild Es una banda especial que permite extender la presentación de los registros de un informe. rbSubDetail Es una banda especial que permite la agrupación de los registros en grupos de detalle. rbGroupHeader Es la cabecera de los grupos de detalle. rbGroupFotter Es el pie de los grupos de detalle. Los componentes especiales para bases de datos como el QRDBText funcionan exactamente igual que los componentes contenidos en la ficha DataControls, contienen una propiedad que dice DataSet en la cual indicaremos la tabla de la cual jalara la información, después esta la propiedad DataField en la cual indicaremos el campo de la base de datos que queremos imprimir. Si utilizamos un QuickReport pues es por que necesitamos imprimir información contenida en una tabla por lo tanto haremos un sencillo ejercicio en el cual utilizaremos dos formularios en el primero mostraremos los registros de la tabla animals que trae Delphi de ejemplo y en el segundo mostraremos una previsualización de un QuicReport. Ahora por favor crea una nueva aplicación coloca un componente Table sobre el formulario, en su propiedad DataBaseName pon DBDemos, en su propiedad TableName pon Animals, despues solo vete a la
  • 63. propiedad Active y ponla en True. Después de esto coloca un componente DataSource y lígalo al componente Table. Coloca un componente DBgrid y lígalo al DataSource. Ahora dale doble Click sobre el componente y te sacara el Editor de Columnas dale sobre el tercer icono que dice Add All Field, con esto te agregara todos los campos de la base de datos, selecciona el campo que dice BMP que por cierto es el ultimo y tiene el índice 4. Muy bien ya que lo seleccionaste presiona la tecla Suprimir para que lo elimines. Después de esto cierra el editor de columnas. Después coloca un DBNavigator y lígalo también al DataSource. Coloca un componente DBImage que por cierto también esta en la ficha DataControls, liga este componente al DataSource y en su propiedad DataField busca el campo que dice BMP y selecciónalo. Ojo mediante la propiedad DataSource del DBImage lo ligaras al componente DataSource. Pon un Componente Button en el cual diga Imprimir. ahora el diseño del primer formulario quedaría así. Ahora solo pon Dos Labels en el primero pon Lista de animales y colócalo arriba del DBGrid y al segundo ponle Imagen y ponlo arriba del componente DBIMage. Muy bien el diseño quedaría de la siguiente forma: Muy bien ya tenemos el primer formulario, ahora añade o crea otro formulario en tu aplicación. Sobre este segundo formulario coloca un componente QuikRep. ya que lo colocaste vete a la propiedad Bands y la opción HasDetail ponla en True (con esto
  • 64. automáticamente te genera una banda de tipo Detail sobre el QuickRep). Después vete a la propiedad DataSet y ponle Form1.Table1. Ahora coloca un componente QRBand sobre el QuikRep. te pondrá otra banda por defaul de tipo Title. Vete a su propiedad Fames la cual contendrá varias opciones, la opción DrawBootom ponla en True, esto nos pone una línea horizontal al final de la banda. Ahora coloca un componente QRLabel sobre el componente QRBand que dice title en su parte inferior izquierda. Vete a la propiedad Caption del QRLabel y ponle Impresión de Animales. Después ve a la propiedad AlignToBand y ponla en True, ahora ve a la propiedad AlignMent y elige la opción taCenter. Con esto logramos que se centre la etiqueta sobre la banda. Pon otros dos QRLabel sobre el QRBand a uno ponle en su propiedad caption Animal y al otro ponle Imagen. y colócalos uno después del otro en forma horizontal dejando una distancia entre ellos. Ahora pon un componente QRDBText en la otra Banda que dice Detail, vete a la propiedad DataSet y ponle Form1. Table1 Después ve a la propiedad DataField y elige el campo NAME. alinea este componente en dirección al QRLabel que dice Animal. Coloca un componente QRDBImage sobre la banda Detail, ve a la propiedad DataSet y también ponle Form1.Table1 Después ve a la propiedad DataField y elige el campo que dice BMP. Ahora solo ajusta la anchura de la banda Detail para que se vea todo el componente QRDBImage. de cualquier forma te muestro el diseño.
  • 65. Con esto hemos terminado nuestro reporte ahora solo necesitamos mandarlo llamar desde el botón imprimir del formulario uno, así que vete al formulario uno y en el evento onclick del Botón pon este código. Form2.QuickRep1.Preview; Después de escribir esto corre tu programa, órale primo verdad al correrlo te mandara el siguiente mensaje. Este mensaje te lo manda por que en el formulario uno estamos haciendo referencia al formulario dos y es necesario declararlo en el implementation, pero no te preocupes Delphi lo hace por ti, solo dale Click en el botón de Yes y listo vuelve a correr tu programa y experimenta con el.
  • 66. Te voy a dar unas notillas sobre los métodos de mandar a impresión. Método Descripción Print Imprime el informe directamente sobre la impresora predeterminada de windows. Preview Despliega la misma ventana de previsualización que puede verse en diseño. Es una ventana estándar de QuickReport pero se puede utilizar cualquier otra utilizando el método TQuickRep.OnPreview. PrintBackGround Crea un proceso en segundo plano para imprimir el informe y devuelve instantáneamente la ejecución a la aplicación. Muy bien ahora para terminar este curso o manual como quiera que le llames falta realizar una pequeña aplicación en la cual utilizaremos las bases de datos creadas anteriormente en el Database DeskTop. La aplicación va a ser muy sencilla, será un modulo de Inventario con todas su operaciones sobre los productos, un modulo de ventas y otro de consultas de utilidades pero bueno mejor dale continuar pariente. Creación de la Aplicación Bueno ha llegado el momento de que pongamos en practica lo que aprendimos, así que crea una nueva aplicación en Delphi. Al Caption del Formulario ponle Sistema de Ventas, biMaximize de la propiedad BorderIcons ponla en False, la propiedad Position ponla en poScreenCenter. Coloca un Panel, su propiedad AlignMent ponla en Top, deja su Caption en blanco bórrale lo que tiene. Sobre el panel coloca cuatro SpeedButtons en orden de izquierda a derecha ponles el siguiente texto en su Caption. 1)Salir 2)Almacén 3)Ventas