Está en la página 1de 97

Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg1

Introduccin a la Programacin Rad Studio 7 XE10

Delphi para versiones desde 7 a XE10 Borland Embarcadero


Delphi es un lenguaje de programacin de la casa Borland-Embarcadero del tipo RAD (Diseo Rpido de
Aplicaciones) para Windows. La diferencia principal con respecto a Visual Basic (de Microsoft) es que posee un
control de bases de datos muy amplio, compatible con Oracle y su lenguaje est basado en Pascal.

Paletas Delphi 7
Delphi XE

Conceptos bsicos.
Proyecto. Un proyecto es un conjunto de mdulos de formulario, de cdigos y de
archivos que componen una aplicacin. La ventana View Project Manager muestra
todos los archivos que componen una aplicacin.
Formulario. Ventana con el diseo y el cdigo asociado a dicho formulario.
Componentes. Los componentes son objetos como cuadros, botones, etiquetas que
se disponen en un formulario o ventana para manipular o mostrar datos. Para poner los
componentes en un formulario usar la Tool Palette.
Propiedades. Usando la ventana de Object inspector (F11) se definen las propiedades
de formularios y controles. Las propiedades especifican los valores iniciales de las
caractersticas, tales como tamao, nombre y posicin.
Eventos: Es la respuesta a las acciones del usuario que desencadena una accin en el
programa.

Concepto de cdigo:
Es el texto escrito en un programa. El programa se divide en distintos apartados o
subrutinas generalmente como respuesta a un evento y se divide en procedimientos
(subrutinas) o funciones.
Acciones o subrutinas: Trozos de cdigo como respuesta a un evento o accin. No
recoge ni devuelve ningn dato.
Procedimientos: Trozos de cdigo como respuesta a un evento o accin. No
devuelven ningn valor pero s acepta o recoge uno o varios parmetros.
Funciones: Son procedimientos que adems devuelven un valor al procedimiento
desde donde se le llam
Diagrama de Flujo: Representa la esquematizacin grfica de un algoritmo, el cual
muestra grficamente los pasos o procesos a seguir para estructurar bien un programa.
Reglas de nomenclatura al declarar procedimientos o variables:
Deben comenzar por una letra
No pueden contener puntos
No puedes superar los 255 caracteres Propiedadesbsicasdelosobjetos:
Nombres de formularios no sobrepasar 40 caracteres Alignment Alineacin
No pueden tener el mismo nombre que una palabra clave BevelInner bordeinterior
Comentarios en el cdigo se inician con: // o entre { } BorderStyle estilodelborde
Caption rtulo
Eventos y acciones (sobre un componente): TabStop Saltotabulacin
Listadeeventos(Desencadenalaaccindeunobjeto) Color,Cursor Color,puntero
Enabled Activo
Evento Accin
Font Tipoletra
Click Alhacerclicconelmouse(oelteclado) Height Alturadelobjeto
DragDrop Alsoltaruncontrolarrastradoconelmouse Hint Etiquetaayuda
DragOver AlArrastraruncontrolconelmouse. Left Posicinizquierda
KeyDown Presionarunateclamientraselobjetotieneelfoco. Name Nombredelobjeto
KeyPress PresionarunateclaydevolversuvalorASCII. PopupMenu Mencontextual
KeyUp Liberarunateclamientraselobjetotieneelfoco. ShowHint Mostraretiquetas
MouseDown Presionarelbotndelmousesobreelobjeto. Top Posicinvertical
MouseMove Moverelpunterodelmouseporencimadelobjeto Visible Visible
MouseUp Liberarelbotndelmouseenelobjeto. Width Anchodelobjeto
Ejercicio 1. Crear una ventana hola mundo y un botn para cerrar.

Enprimerlugar,antesdetrabajarconDelphi,esaconsejablequecreesunacarpeta(subdirectorio)contu
nombreparaguardarahlosejercicios.
Crearunproyectonuevo:
Eligedelmen:FileNewAplication(oVCLFormsapplication)paracrearunnuevoproyecto.
Te aparecer una ventana o formulario vaco (Form). En el panel Inspector de objetos (Object Inspector),
verslaspropiedadesdelaventanaodelosobjetosqueenellapongas.
Cambiarelnombredelaventana:EnelpanelObjectInspector,pestaaProperties(Propiedades),hazclicen
Caption(rtulo)yensucasillaescribe:Ventanaparaponerunrtuloalaventana.

Aadir objetos desde la paleta de herramientas:

Poner un texto: En la paleta de herramientas, en la ficha Standard,


haz clic en el componente Label [A] (Etiqueta) y luego un clic sobre
la venta o formulario vaco.
Cambia la propiedad Caption de la etiqueta (Label1) del inspector de
objetos por: Hola mundo.
Puedes cambiar la propiedad Color y Font
para cambiar el color y tipo de letra favorita.
Arrastra el componente con el mouse para
centrarlo en la ventana.

Poner el botn de Salir: Elige el componente Button ( ) de la ficha Standard de la paleta y


haz un clic en la ventana para soltarlo encima este botn.
Cambia su propiedad Caption por: &Salir (El & subraya la letra principal hotkey)
Tambin puedes cambiar las propiedades de tamao y color con las propiedades del
inspector de objetos.
Asignar la accin al botn Salir: Pulsa doble clic sobre el botn Salir para abrir la ventana de
cdigo. Observa que ya nos ha escrito el inicio y final del subprograma o Procedure:
procedure TForm1.Button1Click(Sender: TObject);
begin

end;
Para indicar una accin a un objeto escribir el nombre del objeto, un punto y su accin: Form1.close;
Si no pones el nombre del objeto, te refieres a la ventana en general: slo debers escribir la palabra: close
(cerrar la ventana) en el lugar indicado:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
close; // -> Al final de una lnea de cdigo, poner punto y coma (;)
end;
Compilar y probar el programa: Pulsa el botn Run o elige del men: Run - run. Comprueba su
funcionamiento correcto cerrando la ventana.
Guardar el proyecto y los archivos fuentes:
1. Para guardar la ventana del formulario y su cdigo asociado elige del men: File Save as...
Hola1.pas
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg3
2. Para guardar el proyecto creado: elige del men: File Save project as... Hola (*.dpr o *.pdroj)
Ejercicio 2. Crear un contador de botones. Cambiar el nombre de los botones.
Crea un nuevo proyecto.
FileNewApplication (oVCLForms
application).

Busca en la paleta Estndar los


componentes: 3 componentes Button
y un componente panel y pon los
sobre el formulario (ventana vaca) como
en la imagen:

Selecciona cada componente aadido y en el Objet inspector (F11) cambia las siguientes propiedades:
En el Button1.Caption: Poner a cero
En el Button2.Caption: Contar
En el Button3.Caption: Salir
En el Panel1. Caption: 0 ; Panel1.Color:clWhite (blanco)
Selecciona cada componente creado y en el Objet inspector (F11) cambia los siguientes eventos, pulsando
doble clic sobre el evento: On clic o directamente sobre el componente:
Eventos: (pulsar doble clic en cada objeto)

En el Botn1: procedureTForm1.Button1Click(Sender:TObject);
begin
Panel1.Caption:='0';
end;

En el Boton2: procedureTForm1.Button2Click(Sender:TObject);
begin
Panel1.caption:=IntToStr(Strtoint(Panel1.caption)+1);
end;

En el Boton3: procedureTForm1.Button3Click(Sender:TObject);
begin
Close;
end;

Cambialavariabledeltiponumricoenteroacadenadetexto

Comentarios al ejercicio: Algunos componentes tienen propiedades del tipo de texto, numrico o lgicas.
No se pueden igualar o comparar propiedades de tipos diferentes. Para ello se debe realizar una conversin
de un formato a otro:
IntToStr convierte un valor numrico en un valor de texto para que se puedra mostrar en el panel1
StrtoInt Convierte un valor de tipo texto en su valor numrico
Probar la aplicacin:
Pulsa el botn Run o elige del men: Run run para comprobar su funcionamiento.
Guardar el proyecto: Crea una carpeta que se llame: Contador.
Escoge: File Save as... Para guardar el archivo de cdigo en la carpeta con el nombre: Contador1.pas
Escoge: File Save project as... Para guarda el proyecto en la carpeta con el nombre contador.dpr

Conversiones de tipos

IntToStr (Integer to String) Cambia del tipo de nmero entero a cadena de texto
StrToInt (String to Integer) Cambia del tipo cadena de texto a nmero entero

Otros:

StrToDate (Texto a fecha) StrToFloat (texto a decimal flotante)


InToEx (Entero a Extended) DateToStr (Fecha a Texto)
DateTimeToStr (Fecha/hora a texto) FloatToDecimal (Decimal flotante a decimal)
FloatToStr (Decimal flotante a texto) StrToTime (Texto a hora)
Formatfloat (Decimal flotante a texto con formato)
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg5

Ejercicio ventana con barra de progreso

Crea un nuevo proyecto: FileNewApplication VCL (oVCLFormsapplication).


Diseo:
Aade al formulario un objeto
barra de progreso ProgressBar
(de la paleta win32), dos
botones (Buttons), una etiqueta
Label (de la paleta Standard) y
un componente Timer (Paleta
System)
Distribuye y cambia las
propiedades de la ventana-
formulario como en la imagen.

Eventos:
Pulsa doble clic sobre el evento Timer1 para mostrar el procedure y aade el cdigo:
procedureTForm1.Timer1Timer(Sender:TObject);
begin
ProgressBar1.position:=ProgressBar1.position+1;//>incrementalabarraunaposicin
ifProgressBar1.position=100then //>sillegaa100
begin
Timer1.Enabled:=False; //>Paraeltemporizador
Showmessage('Transferenciarealizada'); //>muestraunmensaje
Application.Terminate; //>terminaelprograma
end;
end;

Probar la aplicacin: Pulsa Run para comprobar su funcionamiento.


Guardar el proyecto: Crea una carpeta que se llame: Transferencia
o Escoge: File Save as... Para guardar el archivo: Transferencia1.pas
o Escoge: File Save project as... Para guarda el proyecto Transferencia.dpr

Comentarios al ejercicio:
Para asignar un valor a un objeto o variable se indica con : = Ejemplo: ProgressBar1.position:=100;
Para comparar el valor de un objeto o variable se indica con = Ejemplo: ifProgressBar1.position=100..

Otros comparadores son:

Comparador smbolo ejemplo


Igual = ifProgressBar1.position=100thenshowmessage(Hasllegadoa100);
Mayor > ifProgressBar1.position>100thenshowmessage(Tehaspasadode100);
Menor < ifProgressBar1.position>100thenshowmessage(Annohasllegadoa100);
Mayor o igual >= ifedad>=100thenshowmessage(Hasllegadootehaspasadode100);
Menor o igual <= ifedad<=100thenshowmessage(Annohasllegadoa100);
Distinto < > != ifedad<>100thenshowmessage(Noes100);

Uso del Timer y posicin del objeto:
CreaunanuevaaplicacinVCL(libreravisual)escogiendodelmen:FileNewVCLFormApplicaton.
AadeunbotnButton1enunformularionuevo.CambiarsupropiedadCaptionpor:Plsame.
EneleventodelbotnOnMouseMove:
Button1.Left := Button1.Left + 1;
Ejecutayprueba(Run):Alintentarpulsarelbotn,estese
desplazahacialaderecha.
Anula esta ltima lnea de cdigo convirtindola en un
comentario:aade//delante
AadeuncomponenteTtimerdelapaletaSystem.
PonersupropiedadIntervala10ysipropiedadenabled
enFalse:
EneleventodelbotnOnClick:
Timer1.Enabled:=True;
EneleventodelTimerOnTimer:
Button1.Left:=Button1.Left+1;

Ejecutayprueba(Run):Alpulsarelbotn,activamoseltemporizadorTimerquedesplazaunpixelaladerechala
posicindelbotnacadapulsodesuintervalo,deduracin10milisegundos.
Paraguardarprimerolaunidadyluegoelproyecto,escogedelmen:FileSaveprojectas...
Uso de variables de fecha y decimal:
Una variable almacena un valor temporalmente para utilizarlo despus.
Se nombran o declaran al inicio del procedimiento en la seccin var y pueden ser de fecha (datetime),
numricas (integer), decimales sencillas o dobles (single o double), de texto (string), etc

CreaunanuevaaplicacinVCL(libreravisual)escogiendo
delmen:FileNewVCLFormApplicaton.
Aade un botn Button1, dos etiquetas, labels y dos
DatetimePickerdelapaletaWin32.
CambiaelnombredelosDatetimePickerpor:
Fecha_iniyFecha_fin
Pulsa doble clic sobre el botn y escribe en el evento del
botnOnClick:
Procedure ...Button1Click(Sender: TObject);
var
dias:double;//>creounavariabledecimaldoble
hoy:Tdatetime;//>creounavariabledefechahora
begin
dias:=Fecha_Fin.DateFecha_ini.date;//>restolasdosfechas
hoy:=date();
Showmessage('Hoyes'+datetostr(hoy)+'yhantranscurrido'+floattostr(dias)+'dias');
end;
PulsaRunoF9paracomprobarsufuncionamiento.
Variantedelejercicio.Calculatuedad:
Cambiaelformulariocomoenlaimagen
EscribeeneleventodelbotnOnClick:
procedureTForm1.Button1Click(Sender:TObject);
var
dias:double;//>creounavariableparaguardarlosdias
anos:double;//>creounavariableparaguardarlosaos
hoy:Tdatetime;//>creounavariableparaguardareldiadehoy
begin
hoy:=date();//>guardoenlavariableeldadehoy
dias:=hoyMonthCalendar1.Date;//>calculolosdastranscurridos
anos:=dias/365; //>calculolosaostranscurridos
Showmessage('Tienes'+FormatFloat('##0.##',dias)+'diaso'+FormatFloat('##0.##',anos)+'aos');
end;
Ejecutayguarda(Run):PulsaRunoF9paracomprobarsufuncionamiento.
Paraguardarprimerolaunidadyluegoelproyecto,escogedelmen:FileSaveprojectas...
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg7

Ejercicio: Navegador OfiChrome (CutreChrome)

Crea un nuevo proyecto FileNewApplication VCL (oVCLFormsapplication).


Diseo:
Aade al
formulario un
objeto Edit (de la
paleta Standard) y
un Objeto
WebBrowser (de
la paleta Internet
Distribuye y
cambia las
propiedades de la
ventana-formulario
como en la imagen

Selecciona el Edit 1 y en la pestaa Events pulsa doble clic sobre el evento:


OnKeyPress. Escribe el cdigo:
procedureTForm1.Edit1KeyPress(Sender:TObject;varKey:Char);
begin
ifkey=#13thenWebBrowser1.Navigate(Edit1.Text);//silateclapresionadaeslan13=INTRO
end;

Comentarios: Al pulsar la tecla INTRO en el edit1 pone en la direccin del navegador, el texto del Edit1
AlgunosCdigosdeteclaASCII: Valor
Retroceso{backspace}, #8
Tab{tab} #9
Supr{delete}o{del} #127
Entrar{enter}o~ #13
Esc{esc} #27
Probar la aplicacin: Pulsa Run para comprobar su funcionamiento.
Guardar el proyecto: Crea una carpeta que se llame: OfiChrome
o Escoge: File Save as... Para guardar el archivo: OfiChrome.pas
o Escoge: File Save project as... OfiChrome.dpr

Mejoras:
En la ventana: En la propiedad de la ventana Form1 cambia su estado por maximizado: WindowState:
wsMaximized y el texto de la ventana (Caption) por CutreChrome

Aade un Panel1 alineado al Top


Donde pondremos tres botones y el Edit1
como de muestra en la imagen.
Aadimos las acciones alos botones:
En el botn parar: WebBrowser1.Stop;
En el botn Inicio: WebBrowser1.Navigate('http://www.google.es');
En el botn Ir: WebBrowser1.Navigate(Edit1.Text);
Puedes cambiar el objeto Edit1 por un ComboBox1, aadienlo los eventos:
KeyPress: if key=#13 then
begin
WebBrowser1.Navigate(ComboBox1.Text);
ComboBox1.Items.Add(ComboBox1.Text);
end;
ComboBox1Select: WebBrowser1.Navigate(ComboBox1.Text);
Ejercicio Navegador CutreChrome para mvil Firemonkey

Crea un nuevo proyecto mobil en XE5/6:


(FileNewFireMonkey Mobile Application). En XE7: New
Multidevice application
Escoge la plantilla Header/Footer con encabezado y pie. Mobil
Samsung Galaxy S2
En el cuerpo, aade un componente WebBrowser alineado al
cliente.
En el encabezado, quita la etiqueta Label y aade de la paleta
adicional un componente ClearingEdit llamado Direccion y en su
propiedad text pon tu web de inicio favorita y aade un botn con
el texto: Ir ,nombre: btnIR y con el estilo lookup: donetoolbutton
En el footer aade dos botones para ir adelante y atrs alineados
a izquierda y derecha con apariencia stilelookup:
priortoolbuttonbordered y nexttoolbuttonbordered llamados:
btnAtras y btnAdelante y un label alineado al cliente y textAlign Center con el nombre de la aplicacin:
Cutre Chrome.

El cdigo:
Botones adelante y atras:
WebBrowser1.GoBack;yWebBrowser1.GoForward;
Botn para ir:
procedureTHeaderFooterForm.btnIrClick(Sender:TObject);
begin
WebBrowser1.URL:=Direccion.Text;
end;
Al teclear en direccin:
procedureTHeaderFooterForm.DireccionKeyDown(Sender:TObject;varKey:Word;
varKeyChar:Char;Shift:TShiftState);
begin
ifKey=vkReturnthen
begin
WebBrowser1.URL:=Direccion.Text;
btnIr.SetFocus;//poneelfocoparaquitarelteclado
end;

Mejoras:
En el control Edit, optimizar el Virtual Keyboard seleecionando vktURL como el tipo de
teclado virtual adecuado en la propiedad KeyboardType.
Establecer la propiedad KillFocusByReturn a True
Cambiar el Edit por un EditCombobox al que podamos aadir elementos a modo de historial al pulsar en Ir:
encontrado:=false;
fori:=0toDireccion.Items.count1do
begin
ifDireccion.Items[i]=Direccion.Textthenencontrado:=true;
end;
ifencontrado=falsethen
begin
//limitalalistaa10
ifDireccion.Items.count>10thenDireccion.Items.Delete(0);
Direccion.Items.Add(Direccion.Text);//aadiralalista...
end;

Compilar:
Compilar por emulardor: Para probar la emulacin de Android se debe
instalar las android SDK manager y escoger en el Target el emulador:
rxe5_android (muy lento)

Compilar en el mvil: El telfono o dispositivo android debemos


conectarlo al PC y activar las opciones del desarrollador y permitir el
modo depuracin USB. Entonces, al instalar el driver ABD en
Windows, nos buscar y mostrar nuestro dispositivo en la lista. Luego
activar el target para compilar en el mvil Android.

Guardar proyecto: CutreChrome.dproj


Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg9
Ejercicio Firemonkey 1. Calcular el rea de un triangulo con estilo
VersinparaFiremonkey:
Creaunnuevoproyecto.(FileNewFiremonkeydesktop
application).HDApplication.En XE7: New Multidevice application
EnlaetiquetasLabels,ponerelrtuloenlapropiedadText.
Ponerloscomponentesdelaimagen:
Enelevento:OnClickdelbotnButton1poner:

Edit3.Text:=FormatFloat('###.##',StrtoFloat(Edit1.Text)*
StrtoFloat(Edit2.Text)/2);

FormatFloat: Convierte un valor decimal de coma flotante en un texto con


el formato de nmero indicado.
AadiralForm1uncomponente:StyleBook1
PulsardobleclicsobreelcomponenteStyleBook1ycargar
(Load)delacarpeta:
Users\Public\Documents\RADStudio\12.0\Styleselestilo:
AquaGraphite.styleApplyandclose

CambialapropiedaddelformularioForm1.Stylebook:porStyleBook1
Probarlaaplicacin:
PulsaelbotnRunoeligedelmen:Runrunparacomprobarsu
funcionamiento.
Guardarelproyecto:Creaunacarpetaquesellame:Contador.
Escoge:FileSaveas...Paraguardarelarchivodecdigoenlacarpeta
conelnombre:Areas1.pas
Escoge:FileSaveprojectas...Paraguardaelproyectoenlacarpeta
conelnombreAreas.dpr

Ejercicio FireMonkey2. Uso de los componentes de FireMonkey
Variacin al ejercicio anterior de reas del tringulo:

Los componentes con valor


numrico como SpinBox y
NumberBox, utilizan su propiedad
Value y evitan tener que cambiar el
formato de nmero.

Crea un nuevo proyecto.


(FileNewFiremonkey
desktop application). HD
Application
Poner los componentes de la
imagen:
1 GropupBox, 2 RadioButtons, 2
SpinBox, 1 NumberBox, 1
Button, 4 Labels y un StyteBook

El tipo de Valor ValueType de


los cuadros numricos ser Float para permitir decimales (decimal de coma flotante).

Cambia la propiedad del formulario Form1. Stylebook: por StyleBook1. Resource: Transparent
Pulsa doble clic sobre el botn Button1 y en el evento: OnClick del botn Button1 aadir el cdigo en negrita:

procedureTForm1.Button1Click(Sender:TObject);
begin
ifRadioButton1.IsChecked=truethen//siestaactivadorea
NumberBox1.Value:=SpinBox1.Value*SpinBox2.Value/2
elseNumberBox1.Value:=Sqrt(Sqr(SpinBox1.Value)+Sqr(SpinBox2.Value));
end;
Llamaremos al mismo evento: OnChange en los dos RadioButton y al evento OnCreat del formulario Form1
para que se cambie el texto de las etiquetas al empezar el programa o al cambiar de selector:

procedureTForm4.RadioButton1Change(Sender:TObject);
begin
ifRadioButton1.IsCheckedthen
begin
Label1.Text:='Base:';
Label2.Text:='Altura:';
Label3.Text:='rea:';
end
else
begin
Label1.Text:='Catetoa:';
Label2.Text:='Catetob:';
Label3.Text:='Hipotenusa:';
end;
end;

Probarlaaplicacin:
PulsaRunparacomprobarsufuncionamiento
Guardarelproyecto:Creaunacarpetaquesellame:Contador.
Escoge:FileSaveas...Paraguardarelarchivodecdigoenla
carpetaconelnombre:triangulos1.pas
Escoge:FileSaveprojectas...Paraguardaelproyectoenlacarpetaconelnombretriangulos.dpr

Activar la versin para Windows 64-bit:

1. EnelpanelProjectManager,pulsaconelbotnDerechodelmousesobre
TargetPlatforms.
AddPlatform
Escoge64bitsWindows.
2. Pulsaconelbotnderechodelmousesobrelaplataforma64bitsyescoge:
Activate.
3. Compiladenuevolaaplicacinycompruebaquesemuestraenlacarpeta
Win64\Debuglaaplicacinexe.

Nota:SituFMRADStudiocorrebajox86(Win32)podrscompilaren64bitsperonopodrsejecutarlo.

Activar la plataforma Mac OsX y ejecutar en un Mac:

1. Escogedelmen:Tools>Options>EnvironmentOptions>Connection
ProfileManagerpage.ClickenAdd
2. Escribeelnombredelprofile:ConexionMac.PlataformaOsX
3. PonelnombredetuequipoMacenlaredosuIP
4. EnelpanelProjectManager,pulsaconelbotnDerechodelmousesobre
TargetPlatforms.AddPlatformEscoge:OSX.
5. PulsaconelbotnderechodelmousesobrelaplataformaOSXyescoge:
AssignRemoteProfile.
6. SeleccionaAddparaabrirlaventanadeconexin
conunequipomacporred.
7. Escribeelnombredelaconexin:ConexionMac

Entonces,elIDEestarconectadocontuMac.
SipulsasF9seejecutarlaaplicacinentuMac

Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg11

Ejercicio de conversin de variables. Convertidor de Euros. Para Delphi 7+


Ingredientes:
Empieza un proyecto nuevo
VCL en Delphi
Aade al formulario los
siguientes componentes de la
paleta Estandard:

2 botones (Button)

2 cuadros de texto (Edit )

1 etiqueta (Label)

Preparacin:
En el panel: Object Inspector (F11), pestaa de propiedades (Properties)
Edit 1 y Edit2: Cambiar su propiedad Text al valor: 0
Botones 1 y 2: Cambiar su propiedad Caption al texto de la figura superior.
Label 1: Cambiar la propiedad Caption al texto de la figura y la propiedad Font a
Negrita, tamao 12

Coccin:
Pulsar doble clic sobre el botn 1 para aadir al evento Onclic las siguientes lneas de comando:
(Lneasaaadirennegrita) Comentarios
procedure TForm1.Button1Click(Sender:
TObject); variablesautilizar:
var
nmero1ynmero2deltiponumricascondecimales
numero1,numero2:double;
begin
numero1:=strtofloat(edit1.text); Nmero1valeeltextodelEdit1convertido
numero2:=numero1/166.386; Nmero2=nmero2/166,386(ponerpuntodecimal)
edit2.text:=floattostr(numero2); EltextodelEdit2serelvalordelavariablenmero2
end; convertidaastring

Ejercicio Propuesto:
Pulsa doble clic sobre el botn 2 y aade el cdigo al botn2 para que multiplique el valor de Edit1 por
166,386
Variantes al programa:
Para evitar tener que crear variables que almacenen el valor temporalmente, podramos haber realizado la
conversin directamente del siguiente modo:
Edit2.text:=floattostr(strtofloat(edit1.text)/166.386)
Sin embargo, es ms seguro para su comprobacin en caso de error, dividir el cdigo en varias lneas.
Evitar errores al introducir una letra el lugar de un nmero en los edits:
Se puede controlar con un MaskEdit, usando la funcin Format, FormatFloat/FloatToStrF o evaluando si
es numrico antes de realizar operaciones matemticas: IsNan (Is Not a Number). Vanse todos en la ayuda.
Guarda el proyecto y su unidad (conversor1.pas) en una carpeta independiente, por ejemplo en
C:\Archivos de Programa\Borland\Delphi\Conversor con el nombre del proyecto: Conversor.dpr

Distribucin e instalacin del programa:


Crear un icono: Delphi 7: Elige del men: Tools Image Editor: New Icon File (*.ico). 32x32 16 colores
(Puedes utilizar tambin el programa Microangelo (www.microangelo.us)
Elige del men: Proyect Options - Solapa: Aplication
Rellena el ttulo al programa y Carga el Icono correspondiente (Load Icon) que previamente has guardado.
En la solapa VersionInfo: Rellenar la Versin 1.0 y el nombre de la compaa.
Vuelve a compilar el proyecto y sal del programa Delphi guardando todos los cambios.
Comprueba cmo ha cambiado el archivo de la aplicacin (conversor.exe). Es el nico archivo que
necesitas para el funcionamiento del programa, ya que el proyecto no incorpora ningn componente de
paletas adicionales.
Instalacin:
Utiliza el Programa InstallShield o InnoSetup para crear el programa de instalacin: Indicando en este,
dnde se encuentra el proyecto Conversor.dpr. Algunas versiones de Delphi suelen adjuntar la aplicacin
Installshield Express de (www.macrovision.com) o puedes bajar Innosetup de www.jrsoftware.org
Teora: Conceptos bsicos de programacin.
1.- Procedimientos y funciones:
Un Procedimiento (procedure) es una subrutina o subprograma que puede ser llamado desde varias
partes del programa principal. A diferencia de una funcin, ste no devuelve ningn valor de respuesta,
pero s puede recoger datos o parmetros del lugar desde el que se llam utilizando el Sender como
paso de parmetros.
o Funcin: Es un procedimiento o subrutina que adems devuelve un valor de respuesta (Result)
o Parmetro: Es una variable o un valor que es pasado a un procedimiento o funcin.
o Sender: Es un parmetro que informa a un procedimiento o funcin desde qu componente
(objeto) ha sido llamado. Se utiliza mucho para agrupar varios botones con un procedimiento
parecido (lneas de cdigo comunes).
Ejemplo de sender: Procedure TForm1.Button1Click(Sender: TObject);
En este ejemplo, asignando el mismo evento begin
a ambos botones, una ventana de mensaje if Sender = Button1 then showmessage(Has pulsado +
mostrar el texto de cada botn. button1.caption)
else if Sender = Button2 then showmessage(Has pulsado +
button2.caption);
end;

Ejemplo de funcin: Function EsPrimo (N: Integer): Boolean


La funcin recoge un parmetro de entrada y var; //----- Funcin Nmeros Primos----->
devuelve otro de salida. i: Integer; //Para contador del bucle
Se especifica en su declaracin el tipo y valor de begin
entrada (entre parntesis) y de retorno. En este EsPrimo := True;
For i := 2 to N - 1 do
caso el tipo es boolean.
if (N mod Test) = 0 then //mod resto de la division es
cero
Luego puedes ser llamada desde cualquier begin
procedure si se declara en la seccin pblica o EsPrimo := False;
privada. break; //salta fuera del bucle
end;
end;
end;
Llamada a la funcin:
If Esprimo(7) = true then showmessage(Es primo);

2.- Bucles y bifurcacin:


Bifurcacin:
If ... Then ... Else: IF edad >= 18 THEN label1.caption:=Mayor de edad
ELSE label1.caption:=Mayor de edad;
Equivale al SI condicional
No se aade ; de final de lnea antes
del Else. Si la condicin ocupa varias lneas es necesario aadir Begin End
Ejercicio Password:
Crea un nuevo proyecto. (File New - Application).
Aade un Button de la paleta Standard y cambia sus propiedades:
Enabled = false ; PasswordChar = * ; Caption = OK
Aade por encima un Edit de la paleta Standard
Pulsa doble clic en el Edit1 y escribe, dentro de su procedure, el cdigo:
If Edit1.text = danone then button1.enabled:=true;
Pulsa doble clic en el Button1 y escribe: Showmessage('Vale);
Comprueba y guarda con el nombre: Password case edad of
Case: 0..18: Label1.caption:=menor edad;
Bifurca las acciones dependiendo de diversos 18..60: Label1.caption:=mayor edad;
resultados de un parmetro del tipo ordinal. 60..99: Label1.caption:=anciano;
else Label1.caption:=no vale;
(Nmero o carcter ordenado alfab.) end;
Bucles:
Infinitos:
While: Repite la ejecucin infinitas veces hasta que se
cumpla la condicin. while Ch = ' ' do Ch := GetChar;

Bucles finitos (Contadores):


For I:=1 to 100 do
For ... To, For ... Downto: Begin
Ejecuta una accin un nmero determinado de veces. Label1. caption:=Paso nmero + I;
o To: Incrementa una vez el bucle Beep // tono sonoro
o Downto: Decrementa una vez el bucle. End;
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg13
Ejercicio Else If y variables. Mover un objeto y controlar su posicin.

Objetivo: Se trata de la estructura base para el movimiento de un objeto en un juego evaluando con un IF el
estado de la variable subir que como es lgica (booleriana) puede ser verdadera (true) o falsa (false).

Ingredientes:
7 Labels de la paleta Estandar
1 Image de la paleta Adicional
1 Timer (temporizador) de la paleta System

Preparacin:
En sus propiedades (Properties), los objetos tendrn el
nombre (Name) que se indica en la imagen de la izquierda.
Cambia las propiedades (Properties) de los elementos:
Label 1: Cambiar propiedad Caption: Altura
Label 2: Cambiar propiedad Caption: Choques
Label 3: Cambiar propiedad Caption: Toques
Timer1: Poner su estado Enabled: False y su Interval: 1
Labelaltura, Labeltoques y Labelchoques: poner caption a
cero.
Image1: Picture: Cargar el dibujo de una pelota. Strech: True

Coccin: procedure TForm1.FormCreate(Sender: TObject);


Pulsar doble clic sobre el fondo de la ventana begin
formulario y escribir dentro del procedure el subir:=false; //ponemos en falso la variable subir.
choques:=0; //ponemos a cero los contadores
texto en negrita del recuadro derecho
Toques:=0;
Esto sirve para inicianlizar las variables y end;
ponerlas a cero al crearse la ventana.
Estas variables anteriores deben estar var
declaradas al principio como pblicas, porque Form1: TForm1;
se utilizarn en varios procedimientos. Subir a subir:Boolean; //variable para controlar el sentido
choques:Integer; //variable para contar los choques
la seccin Var del cdigo y aadir el texto que
Toques:Integer; //variable parat contar los toques
se muestra en negrita cursiva del cuadro
implementation
Volver al formulario pulsando F12 y luego procedure TForm1.image1Click(Sender: TObject);
pulsar doble clic sobre la image1 y escribir begin
dentro lo que se muestra en el recuadro Timer1.Enabled:=True; //activamos el timer
if subir=true then subir:=false else subir:=True;
derecho
toques:=toques+1; //sumamos un toque
Cada vez que se da un clic en la imagen, la LabelToques.caption:=inttostr(toques);
pone en movimiento, cuenta un toque y end;
cambia el sentido de subida.
Pulsar doble clic sobre el Timer1 y escribir Procedure TForm1.Timer1Timer(Sender: TObject);
dentro del procedure lo que se muestra en begin
cursiva a la derecha de cuadro derecho if subir = True then image1.Top:=image1.top-1
else image1.Top:=image1.top+1;
labelaltura.caption:=inttostr(Form1.clientHeight-
Segn el estado de la variable subir, sumar o image1.top);
restar la posicin vertical de la imagen y esto if (image1.top<=0)
ocurrir cada dcima de segundo. or (image1.top>=Form1.clientHeight-image1.height)
then
Si toca arriba o abajo, se parar el timer y begin
contar un choque choques:=choques+1;
Labelchoques.caption:=inttostr(choques);
Timer1.Enabled:=False;
end;
end;

Comprueba pulsando F9 o el botn Run su funcionamiento. Si se bloquea escoge del men: Program
Reset.
Escoge del men: File Save all para guardar el proyecto y su unidad. Escoge tu carpeta de trabajo.
Guarda la unidad con el nombre: toques1.pas y luego guarda el proyecto con el nombre: Toques.pdr
Ejercicio Else If y variables. Adivina un nmero.
Ingredientes:
2 Labels
1 Edit
1 Button

Preparacin:
Creamos 2 variables en la seccin de
variables pblicas: Bueno e Intentos:
var
Form1: TForm1;
Bueno: integer;
Intentos: integer;

Inicializacin:
Al crearse el formulario se genera un nmero aleatorio del 1 al 100 y se guarda en la variable bueno:
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize; //baraja
bueno:=random(100); //crea un num aleatorio entre 0 y 100 y lo guarda en la variable
bueno
intentos:=0; //pone intentos a cero
end;
Acciones: Al pulsar el botn Vale, se crea una variable num y se evala si la variable num es igual o mayor a
la variable bueno:
procedure TForm1.Button1Click(Sender: TObject);
var
num:integer;
begin
intentos:=intentos+1;
If Edit1.text=' ' then showmessage('Escribe un nmero') // -> si no escriben nada
else
begin
num:=strtoint(Edit1.text); //-> Variable num guarda el dato del Edit1
if num>bueno then showmessage('Es ms bajo')
else if num<bueno then showmessage('Es ms alto')
else if num=bueno then acierto;
Edit1.text:=' '; //-> borra el nm del Edit1
end;
end;
Se crea un procedimiento manual llamado acierto sin parmetros:
procedure Tform1.acierto;
var
i:integer;
begin
Edit1.visible:=false;
Label2.Caption:='Acertaste, es el '+inttostr(bueno);
Label1.Caption:='Te ha costado ' + inttostr(intentos)+' intentos y has tardado '+ inttostr(60-
ProgressBar1.position)+' segundos';
for i:=1 to 100 do // Bucle finito: repite el bucle 100 veces
begin
with TButton.Create(self) do //se autocrea un botn que aparecer aleatoriamente en el form
begin
SetBounds (Random (panel1.Width-100), Random (Panel1.Height-50), 100, 50);
Parent := Panel1;
Caption := Label2.Caption;
end;
end;
Mejoras:
Procedure TForm1.Timer1Timer
Aadir una barra de progreso: progressbar1 begin
(paleta win32) Progressbar: Max: 60 Position: 60 ProgressBar1.Position:=ProgressBar1.Position-1;
Aadir un Temporizador: Timer (paleta system) if ProgressBar1.Position=0 then
begin
Interval: 1000 (Repetir el evento cada 1 segundo)
Showmessage('Se acab el tiempo');
En el evento del timer OnTimer aadir el cdigo de la Timer1.enabled:=false;
derecha para evaluar el tiempo tardado en acertar y close;
decrementar la barra de progreso.Guarda la unidad end;
(Adivina1.pas) y el proyecto (Adivina.DPR) end;
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg15
Ejercicio calculadora. Uso del parmetro sender y de las variables
Creamos un nuevo formulario. File New - Application

Ingredientes: (Componentes)
3 Labels: Valor 1 Valor 2 - Resultado
2 Edits: Edit1 Edit2
4 botones:
Button1: Sumar
Button2: Restar
Button3: Multiplicar
Button4: Dividir
1 Panel: Caption: 0

Acciones:
- Pulsar doble clic en el botn 1 para escribir la accin
dentro del procedure:
panel1.caption:=edit1.text + edit2.text; da error

- Escribe el cdigo correcto en negrita: procedure TForm1.Button1Click(Sender: TObject);


Comprueba que funciona el botn, begin
panel1.caption:=inttostr(strtoint(edit1.text) +
(pulsar Run F9) strtoint(edit2.text));
end;
- dem deberamos escribir los otros tres
botones, pero en lugar de ello vamos a crear dos variables pblicas para var
cada nmero. Busca la seccin Var al inicio de la unit1.pas y escribe el Form1: TForm1;
cdigo en negrita: numero1:double;
numero2:double;
- Ahora cambia el cdigo del botn 1 por este otro:
Comprueba que funciona el
procedure TForm1.Button1Click(Sender: TObject);
botn, (pulsar Run F9)
begin
numero1:=strtofloat(edit1.text); // convierte a decimal flotante el edit1
numero2:=strtofloat(edit2.text); // convierte a decamal flotante el edit2
Llamada al mismo panel1.caption:=floattostr(numero1+numero2);
procedure: end;
dem deberamos escribir los
otros tres botones, pero en lugar de ello vamos a utilizar el mismo procedure para todos los botones,
utilizando el parmetro sender y evaluando cul es el botn pulsado con la funcin IF ELSE IF
Cambia el cdigo por el que procedure TForm1.Button1Click(Sender: TObject);
se muestra. begin
Luego escogemos para los numero1:=strtofloat(edit1.text); // convierte a decimal flotante el edit1
otros tres botones el evento numero2:=strtofloat(edit2.text); // convierte a decimal flotante el edit1
On clic y le asignamos el if sender=button1 then
panel1.caption:=floattostr(numero1+numero2)
mismo procedure que para el else if sender=button2 then
botn 1: panel1.caption:=floattostr(numero1-numero2)
else if sender=button3 then
panel1.caption:=floattostr(numero1*numero2)
else if sender=button4 then
panel1.caption:=floattostr(numero1/numero2)
end;

De este modo, los tres botones realizan el mismo procedure pero


utilizamos el parmetro Sender con IF else if para evaluar qu botn se ha pulsado en cada caso.

Mejoras: Qu pasa si dividimos un nmero por cero? Devuelve un error el programa.


Escoge del men: Program Reset para desbloquear el programa.
En el caso de dividir deberamos evaluar que si numero2=0 entonces muestre un mensaje de que no se
puede realizar la operacin. Para ello, aadir la siguiente lnea:
If nmero2=0 then showmessage(No se puede dividir por cero);
(Sin olvidar poner un begin end cuando escribimos varias lneas de cdigo dentro de un IF)
Guarda este proyecto en tu carpeta con el nombre: Calculadora.DPR y su unidad pas: Calculadora1.PAS
Ejercicio While. Factorial en la calculadora.
While:Repitelaejecucininfinitasveceshastaquesecumplalacondicin.
Enmatemticas,factorialopermutacinmultiplicaunnmeroporelsiguienteinferiorhasta1.
Ejemplo:5!=5*4*3*2*1=120
Abreelproyectoanterior:CALCUALDORAyaadeelsiguientebotn:Button5.Aadeelcdigoquesemuestray
compruebasufuncionamiento:

procedureTForm1.Button5Click(Sender:TObject);
var
resultado:double;
begin
resultado:=strtofloat(edit1.text);
numero1:=resultado1;
whilenumero1>0do
begin
resultado:=resultado*numero1;
numero1:=numero11;
end;
panel1.caption:=floattostr(resultado);
end;

Alfinalizar,guardaesteproyectoentucarpetaconelnombre:CALCULADORA2

Ejercicio FOR. Exponencial en la calculadora.


For...To:Ejecutaunaaccinunnmerodeterminadodeveces.
Enmatemticas,exponencialmultiplicaunnmeroporsmismotantasvecescomodigaelexponente.
Ejemplo:5^3=5*5*5=625
Abreelproyecto:CALCUALDORA2yaadeelsiguientebotn:Button6.Aadeelcdigoquesemuestraycomprueba
sufuncionamiento:

procedureTForm1.Button6Click(Sender:TObject);
var
resultado:double;
x,veces:integer;
begin
resultado:=strtofloat(edit1.text);
numero1:=resultado;
veces:=strtoint(edit2.text);
forx:=1tovecesdo
begin
resultado:=resultado*numero1;
end;
panel1.caption:=floattostr(resultado);
end;

Guardaesteproyectoentucarpetaconelnombre:CALCULADORA3

Mejora en el aspecto de los componentes:

Botonesplanosconimgenes:
Sustituyelosbotonesdeltipobuttonporlosdeltipo
SpeedButtondelapaletaadicional.
PonsupropiedadFlat:True.

Cambiaeltextodelbotnporunaimagen
(propiedadGliph)diseadaportenPaint.

Aadirincrementadoresdevalor:
AadedoscomponentesUpDowndela
paletaWin32ycambialaspropiedadesque
seindicanenlafiguraparaincrementarlos
valoresdeleditconflechas.
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg17
Ejercicio 2. Lanzar un dado en un juego:
En este ejercicio al pulsar el botn Lanzar se activa
el timer y al pulsar el botn Parar desactiva el
timer y muestra el dato del timer. Por lo tanto, el programa
dispondr de tres eventos o acciones:
1. procedure botonLanzarClick(Sender: TObject);
2. procedure botonpararClick(Sender: TObject);
3. procedure Timer1Timer(Sender: TObject);

Necesitamos crear antes de los procedures una


variable X que es la que contendr el valor del dado. Ser del
tipo numrica entera (Integer) y la declararemos en el apartado VAR al principio del programa.

var Los comentarios:


MainForm:TMainForm;
Puedes apuntar comentarios en tus programas utilizando:
x:integer;//>variableparacontador
implementation // - La doble barra: Para una lnea
{ } - Las llaves para varias lneas

En los tres procedimientos siguientes, slo tendremos que escribir el texto en negrita El resto se escribe
automticamente al pulsar doble clic en el componente o sobre el evento adecuado del componente (F11)

procedureTMainForm.botonLanzarClick procedureTMainForm.botonpararClick
begin begin
timer1.enabled:=true; timer1.enabled:=false;
end; label1.caption:='hassacadoun'+inttostr(x);
end;

procedureTMainForm.Timer1Timer(Sender:TObject);
{poner interval del timer1 a 50
poner en el var general x: integer}
begin
ifx<6thenx:=x+1elsex:=1;{SiXesmenosque6suma1ysipasade6valdr1}
label1.caption:=inttostr(x); {Ponemosaltextodelaetiquetaelvalordex}
end;

Uso de una variable como Flag (bandera de permiso)


Utilizar el mismo botn para lanzar y parar:
Borra el botn 2, haciendo clic en l y pulsando Suprimir
Crea otra variable llamada lanzar del tipo integer, por defecto, esta variable valdr 0: Lanzar:integer;
La variable lanzar es un flag o
bandera que al comparar con ella, procedureTForm1.TMainForm.botonLanzarClick(Sender:TObject);
el mismo botn realizar una begin
iflanzar=0then //Silanzarvalecero...
accin u otra. Cambia el cdigo begin
del botn lanzar por este otro: timer1.enabled:=true; //Activaeltimer
(se aconseja escribir tambin los button1.caption:='Parar';//Enelbotn1pondrParar
comentarios) lanzar:=1; //ysubelabandera
end
else //Ysino...
Variantes y mejoras: begin
1.- Aade el componente timer1.enabled:=false; //Desactivaeltimer
Imagelist (W32) al que se le button1.caption:='Lanzar';//Enelbotn1pondrLanzar
lanzar:=0; //ybajalabandera
aaden (add) las imgenes bmp
end
de las 6 caras de un dado.(que
end;
previamente has dibujado con la
aplicacin: Tools - Image Editor
File - New - Bitmap)

2.- Aade un componente Image1 (additional) y aade al timer: imagelist1.GetBitmap(x, image1.picture);

Avanzado:
Utiliza el componente JVCL - JEDI en la paleta: JVVisual: JVDice
con sus propiedades: Autostop Interval: 800 y Rotate true
Ejercicio de Captura y pulsacin de botn de ratn:

Enloseventosdelratn(mouse):
Onmousedown,OnmouseupyOnmouseMove,
losparmetrosXyYsonautomticosynosdevuelvenla
informacindelaposicindelmouse.

Enloseventosdelratn(mouse)OnmousedownyOnmouseup,
tambinexisteelparmetroButtonquenosinformasielbotn
pulsadooliberadoeselizquierdom(mbleft)oelderecho
(mbright).

Crearunproyectonuevollamado:Mouse.dpryaadealformulario,loscomponentesquesemuestranenlafigura.
Conelformularioseleccionado,buscaenpetaaEvents,eleventoonMouseDownypulsadobleclicparacrearel
procedure.
Agregaelcdigosiguiente:
procedureTForm1.FormMouseDown(Sender:TObject;Button:TMouseButton;
Shift:TShiftState;X,Y:Integer);
begin
ifButton=mbLeftthen
begin
label1.Caption:='Izquierdo:'+inttostr(X); //guardaposicinXdelratn
label2.Caption:='Izquierdo:'+inttostr(Y); //guardaposicinYdelratn
end
elseifButton=mbRightthen
begin
label1.Caption:='derecho:'+inttostr(X);
label2.Caption:='derecho:'+inttostr(Y);
end;
end;
Comprueba(RunF9)yguardaelproyectoylaunidadentucarpetaalfinalizar.

Ejercicio de Captura y pulsacin de Teclado. Tecla

Paradetectarcundoelusuariopulsaunatecla,seemplealoseventos:onkeypressyonkeydown(enlapestaaEvents
delObjectInspector)
Enloseventosonkeypressyonkeydown.Losproceduresnos
informan,conlavariablekey,delcdigodelateclapulsada.
Ord(Char)devuelveelvalornumricoASCIIquelecorresponde
uncaracter
Crearunproyectonuevollamado:Tecla.dpryaadeal
formulario,treslabelsconloscaptions(rtulos)quesemuestran
enlafigura:
Conelformularioseleccionado,buscaenpetaaEvents,el
eventoonkeypressypulsadobleclicparaaadirelprocedure.
Agregaelcdigosiguiente:

procedureTForm1.FormKeyPress(Sender:TObject;varKey:Char);
begin
label1.caption:=key;
label2.caption:=IntToStr(Ord(key));//Ord(key)devuelveelnmeroordinaldelateclapulsada(1a256)
ifkey=#27thenclose;//Sipulsanlateckaescapeseterminaelprograma
end;

Comprueba(RunF9)yguardaelproyectoylaunidadentucarpetaalfinalizar.
Variante al ejercicio de la
calculadora: procedureTForm1.FormKeyPress(Sender:TObject;varKey:Char);
var
Capturarlatecladelaoperacinconel num:integer;
teclado: begin
Recuperaelproyectodelacalculadora casekeyof
#13,#61:operarClick(opeigual);{teclasintro}
Asignaalformulariolapropiedad #43:Button1Click(mas);
KeyPreview=True #45:Button1Click(menos);
Aadeelsiguienteprocedureal #42:Button1Click(por);
#47:Button1Click(div);
eleventoOnKeyPressdelformulario end;

Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg19


Encriptacin de caracteres por teclado

Crearunproyectonuevollamado:Tecla_encriptada.dpr,similaral
anteriorperoconlasvariacionesdelaimagen.
AadeelsiguienteprocedurealeleventoOnKeyDowndelformulario:

procedureTForm1.FormKeyDown(Sender:TObject;varKey:Word;
Shift:TShiftState);
var
codigo:byte;//variablenumricade256valores
begin
label2.Caption:=inttostr(key);
if(Key=VK_RETURN)thenLabel2.caption:='HaspulsadoEnter'; VirtualKeysCodes
if(Key=VK_ESCAPE)thenLabel2.caption:='HaspulsadoEsc'; VK_RETURN Enterkey
codigo:=key+spinedit1.Value;
labelEnc1.Caption:=inttostr(codigo); VK_SHIFT Shiftkey
labelEnc2.Caption:=chr(codigo); VK_CONTROL Ctrlkey
end; VK_LBUTTON Leftmouse
VK_RBUTTON Rightmouse
VK_CANCEL Control+Break
VK_BACK Backspacekey
VK_TAB Tabkey
VK_ESCAPE Esckey
VK_UP UpArrowkey
VK_RIGHT RightArrowkey
Encriptacin de caracteres de texto VK_DOWN DownArrowkey

Crearunproyectonuevollamado:Texto_encriptado.dpr,
similaralanteriorperoconlasvariacionesdelaimagen
Aadeelsiguienteprocedurealpulsarelbotn:

procedureTForm1.Button1Click(Sender:TObject);
var
original,encriptado:string; //variablesparaalmacenarlostextos
i:integer; //varnumericaenteraparaelvontadorfor
begin
original:=edit1.Text; //almacenaelvalordeledit1
fori:=1toLength(original)do //lohacelasvecesdelanchodeltexto
encriptado[i]:=chr(ord(original[i])+spinedit1.Value); //conviertedecharanmeroylesumaeldelspin
edit2.Text:=encriptado; //muestraelresultado
end;
Ejercicio 3. Crear un contador de tiempo. Practicar con tipos de variables.

Variables pblicas y privadas: Crearemos dos variables para almacenar dos datos: la hora de inicio y la
hora final. Si estas variables van a ser utilizadas en todo el programa, se crea al principio, en el apartado var
(pblicas), si no se crea el apartado var dentro del procedure (privadas).
ejemplo:
var
Form1:TForm1;
horainicio:double; //noexisteeltipotime,seeligeeltiponumricodoble.Permitedecimalesdobleprecisin
horafin:double;
I: Integer; (numrico entero)
S: string; (identificador del tipo cadena de texto)
otros tipos de variables:
Integer ShortintSmallIntLongint Byte Word
Cardinal BooleanByteBoolWordBoolLongBoolChar

Prctica:
Crear una nueva aplicacin llamada CRONO. Aade al formulario (ventana) los siguientes componentes:
3 botones
3 paneles de color blanco como se muestra en la figura:
Tipodecomponente:TButton
Name:button1
Caption:Empezar
Tipodecomponente:TButton
Name:button2
Caption:Parar
Tipodecomponente:TPanel
Name:Panel2
Caption:Horafin
Tipodecomponente:TPanel
Name:Panel1
Caption:Horainicio
Tipodecomponente:TPanel
Name:Panel3
Tipodecomponente:
Caption:Crono
Tbutton
Name:button3 var
Aadir las siguientes variables al inicio de la unidad: Form1: TForm1;
horainicio: double;
Aadir las lneas de cdigo a los procedures: horafin: double;

procedureTForm1.Button1Click(Sender:TObject);
begin
horainicio:=time; Nivel avanzado
panel1.Caption:='Horadeinicio:'+ Cmo crear un archivo INI que guarde la hora de
TimeToStr(Time); entrada.
end;
- Es necesario aadir INIFILES a la seccin USES
de la unidad.
procedureTForm1.Button2Click(Sender:TObject); procedure TForm1.Button1Click(Sender: TObject);
begin var
horafin:=time; datosini:TIniFile;
panel2.Caption:='Horadeparo:'+TimeToStr(Time); HORAENTRADA:STRING;
panel3.caption:='Crono:'+TimeToStr(horainicio begin
horafin); HORAENTRADA:=TIMETOSTR(TIME);
end; datosini:= TIniFile.Create('DATOS.INI');
-->crea el archivo datos.ini
datosini.WriteString('Eduardo', 'Entrada',
procedureTForm1.Button3Click(Sender:TObject); HORAENTRADA); -->aade a la seccin
begin [Eduardo] entrada=12:15
close; DATOSINI.FREE; --> cierra el archivo datos.ini
end;
end;

Variantes y mejoras: Aade el componente: XPManifest (Win32): permite a los botones tener tema-estilo
visual de Windows XP.
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg21
Ventanas de Mensajes y cuadros de dilogo directos.
Ventanasdemensaje:
ModoDelphi: Showmessage('Mensaje);
MessageDlg(Mensaje',mtInformation,[mbOk],0)
ModoWindows: Application.MessageBox(Mensaje,'Textoventana',MB_OK);
Ventanadepregunta:
Application.MessageBox('Pregunta','Textoventana',MB_YESNO)
MessageDlg(Mensaje',mtConfirmation,[mbYes,mbNo],0)Devuelve:mrYesomrNo
InputBox('Nombre_ventana','Texto_Dato','Respuesta_predeterminada');DevuelveVarString
InputQuery('Identificate!','Pontunombre,porfavor...',Nombre);DevuelveVarBolean
Otrosmensajes:
ShowMessageFmt(constMsg:string;Params:arrayofconst);
CreateMessageDialog(constMsg:string;DlgType:TMsgDlgType;Buttons:TMsgDlgButtons)

Ejercicios-ejemplo: Crea en un formulario nuevo 5 botones y asigna a cada uno de ellos el siguiente cdigo:
procedureTForm1.Button1Click(Sender:TObject);
var
Dato:string;
begin
Dato:=InputBox('Nombreventana','Nombre:','Antonio');
showmessage('Hola,'+Dato);
end;

procedureTForm1.Button2Click(Sender:TObject);
var
Nombre:string;
PulsoOk:boolean;
begin
PulsoOk:=InputQuery('Identificate!','Pontunombre,porfavor...',Nombre);
ifPulsoOk=truethenShowMessage('Envantadodeconocerte,'+Nombre)elseShowMessage('Hasdepulsar
Ok...');
end;

procedureTForm1.Button3Click(Sender:TObject);
begin
if(Application.MessageBox('Erestonto?','Tontera',MB_YESNO)=IDYES)thenshowmessage('Losaba')
elseshowmessage('Respuestaincorrecta')
end;

procedureTForm1.Button4Click(Sender:TObject);
begin
Application.MessageBox('EsteesunmensajeconbotnAceptar','Informacin',MB_OK);
end;
procedureTForm1.Button5Click(Sender:TObject);
var
Nombre:string;
PulsoOk:boolean;
pregunta:pchar;
begin
PulsoOk:=false;
whilePulsoOk=falsedo
begin
PulsoOk:=InputQuery('Identificate!','Pontunombre,porfavor...',Nombre);
ifPulsoOK=falsethenShowMessage('HasdepulsarOk...');
end;
Pregunta:=Pchar('Hoye'+Nombre+',erestonto?');
whileApplication.MessageBox(Pregunta,'Tontera',MB_YESNO)=IDNOdo
begin
MessageDlg('Respuestaincorrecta',mtError,[mbOk],0);
end;
MessageDlg('Respuestacorrecta',mtInformation,[mbOk],0);
end;
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg23
Ejercicio 5. Prcticas con controles de lista y eleccin.
1.- Crear el formulario Helados.frm con
los nombres y controles que se indican en
la figura.
Control:Combobox
Name:Producto Control:ListBox
Name:Sabor

2.- Crear la variable pblica:


precio: integer;

3.- Crear un segundo formulario llamado


Envio: (File New Form) Name: Envio
y mostrarlo al hacer clic en el botn
enviar: envio.showmodal;
Guarda el proyecto con el nombre:
Helados1.pas y Helados.dpr

Al hacer clic en el botn caloras:


procedureTHelados.Button1Click
varcalorias,calorias1:integer;
begin
Control:RadioGroup Controles: Chexbox ifsabor.itemindex=1then
Name:Tamano begin
Panel1
ShowMessage('eligeunsabor');
calorias:=0;
Textbox end
Name:Nombre
else
begin
Button2Click(Sender);
calorias:=precio*10;
casesabor.itemindexof
0:calorias1:=10;
1:calorias1:=50;
BitBtn1
2:calorias1:=100;
3:calorias1:=150;
4:calorias1:=200;
5:calorias1:=250;
end;
Al enviar el pedido:
calorias:=calorias+calorias1;
procedureTenvio.BitBtn1Click(Sender:TObject);
panel1.caption:=inttostr(calorias)+'Caloras';
begin
end;
ifnombre.text=''then
end;
ShowMessage('Hagaelfavorderellenarsusdatos,gracias')
else Al hacer clic en el botn Ver Precio:
begin procedureTHelados.Button2Click(Sender:TObject);
ShowMessage('Seor'+nombre.text+',supedidohasido begin
enviadoa'+poblacion.text+',enbrevesminutosrecibira precio:=0;
elproducto.Gracias'); ifproducto.text='Helado'thenprecio:=200;
end ifproducto.text='Batido'thenprecio:=150;
end; ifproducto.text='Refresco'thenprecio:=100;
Al cancelar el pedido: ifnueces.State=cbCheckedthenprecio:=precio+50;
procedureTenvio.BitBtn2Click(Sender:TObject); ifalmendras.State=cbCheckedthen
begin precio:=precio+50;
ShowMessage('Supedidohasidocancelado'); ifpasas.State=cbCheckedthenprecio:=precio+50;
close; casetamano.itemindexof
end; 0:precio:=precio+100;
Llamada extena al enviar el pedido: ShellExecute 1:precio:=precio+50;
(Manejador, Operacin, NombreFichero, Parmetros, 2:precio:=precio;
Carpeta, Mostrar) end;
ShellExecute(GetDesktopWindow(), nil, pChar('mailto:'+ panel1.caption:=inttostr(precio)+'Pts';
E_MAIL), nil, nil, SW_SHOWNORMAL); end;
Ejercicio 4. Visor de imgenes.
Cmocrearunprogramavisordeimgenes*.pcx;*.cur;*.gif;*.ani;*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf.
Nota:VersionesanterioresdeDelphislopermitenformatosdeimagen;*.bmp;*.ico;*.wmf
Paso1.Ponerloscomponentesyestablecerlaspropiedades.
CrearNuevoproyectoconunformulario.BuscalapaletadecomponentesWin3.1Enlaventanaprincipaldel
formulario,aadiremosloscomponentesdelafiguraymodificaremoslassiguientespropiedades:

Componente: DirectoryListBox Componente: FileListBox


Componente: Drivecombobox
(en la paleta System) (en la paleta System)
Name:DriveComboBox1
Name:DirectoryListBox1 Name:FileListBox1
Dirlist: DirectoryListBox1
Filelist: FileListBox1 Mask: *.bmp;*.ico;*.wmf
(nombre de la lista de directorios)

Compo: Panel
Name: Panel1

Compo: Label

Name: Label1

Compo: Image1
Name: Image1

Compo: Bevel
Name: Bevel1
Style:bsLowered

Name: ImageForm
Caption: Visor Componente: Button Componente: CheckBox
Name: Salir Name: StretchCheck
Caption: Salir Checked: False
Caption: Ajustar
Paso2.Escribirloscdigosdeloseventos
Alhacerclicenunaunidaddedisco(Drivecombobox)secambianlosdirectorios(DirectoryListbox)porquelehemos
dichoqueDirlist:DirectoryListBox1,lomismoocurrealcambiardedirectorio,secambialalistadearchivos
(Componente:FileListBox)yenlalistadearchivossloaparecernlosarchivosdeltipoqueseponganenlamscara
(Mask:*.bmp;*.ico;*.wmf).
Lapartemsdifcildecdigoestalhacerclicenunarchivodelalista:
procedureTForm1.FileListBox1Click(Sender:TObject);
var
FileExt:string[4]; {creamoslavariableFileExtqueserdetresletrasmselpunto}
begin
FileExt:=UpperCase(ExtractFileExt(FileListBox1.Filename)); {detectalaextensindelarchivoenmaysc}
if(FileExt='.BMP')or(FileExt='.JPG')or(FileExt='.GIF)or(FileExt='.WMF)then {SiesBMPoJPGoGIF}
begin {empezar}
Image1.Picture.LoadFromFile(FileListBox1.Filename); {Cargaelarchivoenlaimagen}
Label1.Caption:=ExtractFilename(FileListBox1.Filename); {Cambiaeltextodelaetiqueta}
end; {terminar}
end;
CdigoalpulsarelbotndeSalir:(SalirClick): close;
Cdigoalpulsarenajustarimagen(StretchCheck): Image1.Stretch:=StretchCheck.Checked;
Paso3.Ejecutarycomprobar.
PulsaenelbotnRunoenelmen:Run,compruebayyaest.
GuardaelproyectoentucarpetaconelnombreVisor.
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg25

Mejorasalvisordeimgenes

1.- Uso de las librerias Jedi - JVCL

Si tienes instaladas las libreras gratuitas JEDI-VCL


(http://jvcl.sourceforge.net), sustituye los componentes anteriores por
los de la ficha: JVList, combos, trees: TjvFileListBox, TjvDriveList,
TjvDirectoryListBox, ms potentes y compatibles con sistema XP-Vista.
En JVFilelistbox: Activa Filetype: ftHidden (para ver imgenes ocultas) y
Showgliphs a true (Ver iconos).
Imagen mejorada:
Sustituye Image1 por JvSpecialImage1 (Paleta: JVimages, animators) y
aade junto a la casilla de ajustar la de Reflejo (Flip) y un deslizador
para el brillo (Brightess) y otros controles de la imagen como en la figura

2.UsararchivosINI.
ParagrabaryleerdatosdeconfiguracindelprogramautilizalosTinifiles:
AadirINIFILESalaseccinUSESdelaunidad.
GrabacindelarchivoINI:
procedure onclose
var
datosini:TIniFile;
begin
datosini:=TIniFile.Create('DATOS.INI');//>creaelarchivodatos.ini
datosini.WriteInteger('Formato','Posicionizquierda',form1.left);
datosini.WriteString('Formato','nombre',form1.caption);//guardadatodeltipotextostring
DATOSINI.FREE;>cierraelarchivodatos.ini
end;

LecturadelarchivoINI:
Procedureoncreate
var
datosini:TIniFile;
begin
datosini:=TIniFile.Create('DATOS.INI');form1.left:=datosini.readinteger('Formato','Posicionizquierda',100);

Ejemplo. Como grabar y leer todos los caption del formulario segn el idioma escogido:
Buscaremos todos los componentes de nuestro formulario usando la clase: TCOMPONENT que me
devuelve el nombre del componente segn el nmero de rden de creacin en el formulario. Por lo tanto:
Components[3] es una variable array o matriz (conjunto de variables ordenadas) que me devuelve el
nombre del componente nmero 3
Component is TLABEL: Evalua si el componete es de la clase o tipo Tlabel

{Alcargarelformularioleeelarchivodeidioma.lngquelehadichoenelarchivodatosiniyque
anteslohaguardadoelusuarioalcambiarlaconfiguracindeidiomaenelarchivoDatos.ini}
var
Ini:TIniFile;
component:tcomponent;
i:integer;
dire:string;
begin
Dire:=Application.GetNamePath;
Ini:=TIniFile.Create(dire+'\langs\'+Configidioma+'.lng');//direeslarutapordefecto
//>Rutaparaios:TIniFile.Create(GetHomePath+PathDelim+'Documents'+PathDelim+'ex.ini');
fori:=0toComponentCount1do//>Agrupaporcomponenteseccion[CAPTIONS]
begin
Component:=Components[i];
if(ComponentisTLABEL)and((ComponentasTLABEL).Caption<>'')then(componentas
TLABEL).Caption:=Ini.ReadString('CAPTIONS',(componentasTLABEL).name,(componentas
TLABEL).Caption)
end;
end;
Ejercicio 6 . Reproductor multimedia
Componente:Opendialog
Paleta:Dialogs
Name:Abrirdialogo
Filter:AVI|*.avi|WAV|*.wav|MIDI|*.mid

Componente: Mainmenu

Paleta: Standard
Componente: Mediaplayer Name: MainMenu1
Name: Player Carpeta: System
Display: VideoPanel
AuotoOpen: False

Componente: Panel
Name: Videopanel Formulario
Name:Form1
Caption:Reproductormultimedia
Evento: Abrir1click

Procedure Form1.Abrir1Click(Sender: TObject);


begin
with Abrirdialogo do
if Execute and (FileName <> '') then
begin
Player.Close; Libreraaadidaenlamain:Mplayer
Player.Filename := FileName; uses
Player.Open; SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
end; Controls, Forms, Dialogs, ExtCtrls, Menus, Mplayer;
end;

Ejerciciopropuesto1:AadealproyectoVisordeimgenes,delejercicioanterior,laposibilidaddeverarchivosde
vdeoymsicaademsdeimgenes;aadiendoelcomponentemediaplayer.
Ejerciciopropuesto2:SitienesinstaladaslaslibrerasgratuitasJVCL.Puedescrearuncapturadordevdeofcilmente
conelcomponente:JvAVICapture1(Paleta:JVimages,animators).
Ejercicico 7 Dibujar: Controles de los botones del mouse y variable Flag

Creamos una variable de estado lgica y
Name:Form1 pblica(Tipo Flag o permiso) llamada Pinta:
Eventos: public
Onmousedown:FormMouseDown var
Onmouseup:FormMouseUp ColorDialog1
Form1: TForm1;
OnmouseMove:FormMouseMove Pinta: Boolean;

procedureTForm1.FormMouseDown
begin
Pinta := True; // Permiso para pintar
Canvas.MoveTo(X, Y); //Fija el origen
Panel1 end;
Button1 Button2
procedureTForm1.FormMouseUp
begin
Pinta := False; //Quita permiso para pintar
end;

procedureTForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);
begin
If Pinta=True then Canvas.LineTo(X, Y); // Si la variable Pinta es True entonces linea desde el CP al puntoXY
end;
procedureTForm1.Button1Click
begin
If Colordialog1.execute then Form1.Canvas.Pen.Color := colordialog1.color; //Abre ventana color y asigna
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg27
EjercicioArrastrarysoltar.Propiedadesdelosformulariosydelmouse.
1. Crear un proyecto nuevo llamado: CARAS.DPR. Aadir al formulario los ingredientes que se muestran:

Poner el formulario transparente:


1. En las propiedades del formulario, poner un color que no vayas a usar, como por ejemplo, el oliva.
2. Cambiar las propiedades del formulario: TransparenteColor=True y TransparentColorValue=el oliva.
Adems quitar el borde de la ventana (BorderStyle=bsNone) y poner siempre encima: (StayOnTop).
3. Aadir otra imgen o botn para salir cuyo cdigo sea: Close;
4. Compilas y corre el programa (F9) observars que slo se muestras las imgenes sobre el escritorio.

Para arrastrar las imgenes sobre la cara:


En los eventos del ratn (mouse), los parmetros X y Y son automticos y nos devuelven la informacin
de la posicin del mouse.
Al mover el mouse, deberemos detectar si el botn izquierdo el mouse est apretado o no. Para ello
crearemos una variable de permiso (flag) del tipo booleriana, llamada: Apretado
1. Creamos las variables pblicas:
var
Form1: TForm1;
Xini,Yini :integer; // Guardar la posicin inicial del ratn al apretar
Apretado: boolean; // Variable de permiso (flag) para arrastrar o mover la imgen

2. Seleccionamos la imagen 2 y en sus eventos, escribiremos el cdigo al apretar, al soltar al mover el


mouse:

Procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: .


begin
if Button = mbLeft then
begin
Xini := X; //guarda posicin X del raton
Yini := Y; //guarda posicin Y del raton
Apretado:= true; //da permiso para arrastrar
end
end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y:


begin
Apretado:= false; //quita el permiso para arrastrar
Screen.Cursor := crdefault;
end;

procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);


begin
Screen.Cursor := CrHandPoint;
if Apretado = true then
begin
if sender=image1 then
begin
image1.Top := image1.Top + Y - Yini; //mueve pos esquina imagen menos pos del ratn
image1.Left := image1.Left + X - Xini
end
else if sender=image2 then
begin
image2.Top := image2.Top + Y - Yini; //mueve pos esquina imagen menos pos del ratn
image2.Left := image2.Left + X - Xini
end
end;
end;
Asigna a cada imgen los mismos 3 eventos o podemos aprovechar los mismos procedures, para las otras
imgenes, aprovechando el parmetro: Sender

Delphi 7: Juego Stress: Cargar archivo de recursos (res). Formulario semi-transparente


Busca en la carpeta delphi7\Demos\Swat de el archivo de recursos: extrares.res. brelo con el editor de imgenes de
delphi: Tools Image Editor. Observa los iconos e imgenes cargadas. (puedes cambiar la imagen Live por una rotura de
cristal)
Crea un Proyecto nuevo en una carpeta nueva, llamado Stress.dpr.
En el formulario, nicamente pondremos una imgen o botn para
salir. Pero utilizaremos la propiedad AlphaBlend a 100 para variar
la transparencia del formulario.

var
Form1: TForm1;
Live : TBitmap;

implementation

{$R *.DFM}
{$R extrares.res} // <- aqu se incluye el recurso

procedure TForm1.FormCreate(Sender: TObject);


begin
Screen.Cursors[5] := LoadCursor(HInstance, 'Malet'); //carga el cursor n 5 del recurso Malet
Screen.Cursors[6] := LoadCursor(HInstance, 'MaletDown'); //carga el cursor n 6 del recurso MaletDown
Screen.Cursor := TCursor(5); // Al pulsar el mouse aparece el cursor 5 (martillo)
Live := TBitmap.Create; // Crea una imgen imagen Bitmap: Live
Live.LoadFromResourceName(HInstance, 'Live'); // Carga la imagen Bitmap Live del recurso: Live
Live.Transparent:=true;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


begin
Screen.Cursor := 6; // Al pulsar el mouse aparece el cursor 6 (martillo bajado)
Canvas.Draw(x-50, y-35, Live); //Al pulsar el mouse Dibuja la imagen Live en los pixels de canvas
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Screen.Cursor := 5;
end
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg29
Animacin. Protector de pantalla (Uso del estamento CASE)
Ingredientes:
- Shape (PaletaAdditional):Name:Bola;Shape:stCircle
- Timer (paletasystem):Timer1Interval:20
- Botones:2(Empezaryparar)
Formulario:Silodeseas,puedesasignarcolortransparente.
Variables:
Mover:integer;
Acciones:
EnelButton1:Empezar:Timer1.enabled=true;
EnelButton2:Parar:Timer1.enabled=false;
Case:
procedureTForm1.FormCreate(Sender:TObject);//Alcrearseelformulario Bifurca las acciones
dependiendo de diversos
begin resultados de un parmetro del
mover:=1;//>importante:Lavariable:Mover,debetenercualquiervalor tipo ordinal
end;
procedureTForm1.Timer1Timer(Sender:TObject);//Eneltimer1
begin
caseMoverof
1: //Muevelabolaalaizquierdayhaciaarriba
begin
Bola.left:=Bola.Left20;
Bola.Top:=Bola.Top20;
//Sielgrficoalcanzaelbordeizquierdodelformulario,semuevealaderechayhaciaarriba.
IfBola.Left<=0ThenMover:=2
//Sielgrficoalcanzaelbordesuperiordelformulario,semuevealaizquierdayhaciaabajo.
ElseIfBola.Top<=0ThenMover:=4;
End;
2: //Muevelabolaladerechayhaciaarriba
begin
Bola.left:=Bola.Left+20;
Bola.Top:=Bola.Top20;
//Sielgrficoalcanzabordederechodelformulario,semuevealaizquierdayhaciaarriba.Se
determinaelbordederechodelformulariorestandoelanchodelgrficodelanchodelformulario.
IfBola.Left>=(Form1.WidthBola.Width)ThenMover:=1
//Sielgrficoalcanzaelbordesuperiordelformulario,semuevealaderechayhaciaabajo.
ElseIfBola.Top<=0ThenMover:=3;
end;
3: //Muevelabolaaladerechayhaciaabajo
begin
Bola.left:=Bola.Left+20;
Bola.Top:=Bola.Top+20;
//Sielgrficoalcanzaelbordederechodelformulario,semuevealaizquierdayhaciaabajo.
IfBola.Left>=(Form1.WidthBola.Width)ThenMover:=4
//Sielgrficoalcanzaelbordeinferiordelformulario,semuevealaderechayhaciaarriba.Se
determinaelbordeinferiordelformulariorestandolaalturadelgrficodelaalturadelformulariomenos680
twipsdebidoalaalturadelabarradettulolabarrademens.
ElseIfBola.Top>=(Form1.HeightBola.Height)ThenMover:=2;
End;
4: //Muevelabolaalaizquierdayhaciaabajo
begin
Bola.left:=Bola.Left20;
Bola.Top:=Bola.Top+20;
//Sielgrficoalcanzaelbordeizquierdodelformulario,semuevealaderechayhaciaabajo.
IfBola.Left<=0ThenMover:=3
//Sielgrficoalcanzaelbordeinferiordelformulario,semuevealaizquierdayhaciaarriba.
ElseIfBola.Top>=(Form1.HeightBola.Height)ThenMover:=1;
End;

Variantes y mejoras:
Esteprotectordepantallapuedeconvertirseenunjuegodehabilidad(mezcladoconelanterior)sialpulsardobleclic
sobreelobjeto(quepuedeserunaimagen)cuentalosgolpesyasuvezseaceleraelobjeto.
Animacin. (Juego Ping)
var b:=1;
Form1:TForm1; end;
p1x,p1y,p2x,p2y,p3x,p3y:real;//posic.delos
recuadros if((trunc(p1y)<trunc(p2y)rectangle1.Height))
b:byte; and((trunc(p1y)>trunc(p2y)rectangle1.Height
modowin:boolean; 5))and(p1x>p2xrectangle1.Width/1.3)and(p1x<
mx,my:integer;//posic.delmouse p2x+(rectangle2.Widthrectangle1.Width)+
rectangle1.Width/1.3)then
procedureTForm1.ButtonPausaClick(Sender:TObject); begin
begin ifb=0then//sihaycolisinconsegundapala
Timer1.Enabled:=False; bajando....puntua
Timer2.Enabled:=False; begin
Timer3.Enabled:=False; label4.Text:=inttostr(strtoint(label4.text)+1);
Timer4.Enabled:=False; end;
buttonSalir.Visible:=True; b:=1;
buttonIniciar.Visible:=True; end;
end;
ifp1y>form1.Heightthen//tocafondopierde
procedureTForm1.ButtonIniciarClick(Sender:TObject); begin
begin b:=1;//poneenmodosubir
Timer1.Enabled:=True; p1y:=form1.Height63;
Timer2.Enabled:=True; p1x:=form1.Width/2;
Timer3.Enabled:=True; ifstrtoint(label4.Text)>strtoint(label2.Text)
Timer4.Enabled:=True; then
buttonSalir.Visible:=False; label2.Text:=label4.Text;//fijalamxima
buttonIniciar.Visible:=False; puntuacinyponepuntosacero.
{$IFDEFMSWINDOWS} label4.Text:='0';
modowin:=true;//sieswindows end;
{$ELSE}
modowin:=false;//sinoeswindows ifb=1then//siestaenmodosubir
{$ENDIF} begin
p1y:=p1y5;//restaposicinvertical
end; ifmodowin=falsethen//siestajugandoenandroid
controlaconelsensor
procedureTForm1.FormCreate(Sender:TObject); begin
begin if(rectangle1.Position.X+20*
Timer1.Enabled:=False; motionsensor1.Sensor.AccelerationY<form1.Width)and
Timer2.Enabled:=False; (rectangle1.Position.X+20*
Timer3.Enabled:=False; motionsensor1.Sensor.AccelerationY>0)then
Timer4.Enabled:=False; p1x:=rectangle1.Position.X+20*
p1x:=form1.Width/2;//situaalcentroinferior motionsensor1.Sensor.AccelerationY;
p1y:=form1.Height20; end
end; else//siestajugandoenwindows
begin
procedureTForm1.FormMouseMove if(mxp1x)>Rectangle1.Widththenp1x:=
begin rectangle1.Position.X+5//mousealaderecha
mx:=round(x); elseif(mxp1x)<5thenp1x:=
my:=round(y); rectangle1.Position.X5;////mousealaizda
end; end;
end;
procedureTForm1.Timer1Timer(Sender:TObject);
begin ifb=0then//siestaenmodobajar
rectangle1.Position.X:=p1x;//muevelosobjetos begin
rectangle1.Position.Y:=p1Y; p1y:=p1y+5;//sumaposicinvertical
rectangle2.Position.X:=p2X; ifmodowin=falsethen
rectangle2.Position.Y:=P2Y; begin
rectangle3.Position.X:=p3X; if(rectangle1.Position.X+20*
rectangle3.Position.Y:=P3Y; motionsensor1.Sensor.AccelerationY<form1.Width)and
Application.ProcessMessages;//procesaperoesperaa (rectangle1.Position.X+20*
queseacabelatareaanterior motionsensor1.Sensor.AccelerationY>0)then
end; p1x:=rectangle1.Position.X+20*
motionsensor1.Sensor.AccelerationY;
procedureTForm1.Timer2Timer(Sender:TObject); end
var else//siestajugandoenwindows
a:integer; begin
begin if(mxp1x)>Rectangle1.Widththenp1x:=
ifp1y<0then rectangle1.Position.X+5//mousealaderecha
begin elseif(mxp1x)<5thenp1x:=
b:=0;//modobajar rectangle1.Position.X5;////mousealaizda
p1y:=p1y+15; end;
end; end;
if((trunc(p1y)<trunc(p3y)rectangle1.Height)) end;
and((trunc(p1y)>trunc(p3y)rectangle1.Height
5))and(p1x>p3xrectangle1.Width/1.3)and(p1x< procedureTForm1.Timer3Timer(Sender:TObject);//mueve
p3x+(rectangle3.Widthrectangle1.Width)+ lapala1aleatoriamente
rectangle1.Width/1.3)then begin
begin p2y:=form1.Height/1.3;
ifb=0then//sihaycolisinconprimerapala p2x:=rectangle2.Position.X10;
bajando....puntua ifrectangle2.Position.X<150then
begin begin
label4.Text:=inttostr(strtoint(label4.text)+1); p2x:=form1.Width;
end; timer3.Interval:=Random(150)+10;
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg31
end;
end;

procedureTForm1.Timer4Timer(Sender:TObject);//mueve
lapala2aleatoriamente
begin
p3y:=form1.Height/1.3;
p3x:=rectangle3.Position.X+10;
ifrectangle3.Position.X>form1.Width+150then
begin
p3x:=150;
timer4.Interval:=Random(150)+10;
end;
end;
Delphi.Ejercicio5.Movimientosycontadores.Juego

En la figura se muestran los componentes y sus propiedades principales.

Comp:Panel
Name:Panel1
Color:Azul
Onclick:flecha1Click Comp:Label
Name:Label1
Caption: Enciende la luz
Comp:Image
Name:Flecha1
Picture:Arrow1r.bmp
Onclick:flecha1Click
Comp:Image
Comp:Timer Name:Bombilla
Name:Timer1 Picture:
Interval:10 Images\buttons\bulboff.bmp
OnTimer:Timer1Timer

BitBtn1

Comp:Image
Name:Bombilla1
PictureImages\buttons\bulboff.bmp
Comp:Timer
Name:Timer2 Comp:Image
Interval:10 Name:Bombilla2
OnTimer: Picture:\Images\buttons\
Comp:Label Timer2Timer
Name:Label2
Caption:0 Comp:Panel3 Comp:Panel2
taRightJustify Align:alLeft Align:alBottom
Bevelouter:bvLowered
Caption:Aciertos
Preparacin: Alignment:taLeftJustify
var
MainForm: TMainForm;
subir:integer; // => Variable pblica para controlar el sentido subir ser numrica entera

Acciones:
El timer1 se encarga de desplazar la flecha hacia la derecha y comprueba si su posicin est cerca de
la bombilla:
procedure TMainForm.Timer1Timer(Sender: Tobject); {solo funciona si el timer1 est activado}
begin
if (flecha1.left=460{bombilla.left})and (flecha1.top<bombilla.top+10) and (flecha1.top>bombilla.top-10)
then
begin
bombilla.picture:=bombilla2.picture; {si flecha toca bombilla cambia picture a bombilla2}
puntos.caption:=inttostr(strtoint(puntos.caption)+1); {suma un punto y convierte en cadena}
end;
if flecha1.left<500 then
flecha1.left:=flecha1.left+5 {avanza de izquierda a derecha 5 pixels a cada pulso del timer}
else
begin
timer1.enabled:=false; {descativa el temporizador timer1}
flecha1.left:=10; {si la flecha pasa de largo empieza de nuevo en posic. izquierda a 10}
end
end;
Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg33
El timer2 se encarga de desplazar arriba y abajo la bombilla, (segn si la variable subir est a 0 o 1):
procedureTMainForm.Timer2Timer(Sender:TObject);
begin
ifsubir=0then {sinoestactivadosubir}
begin
ifbombilla.top<200then {sinopasade200deprofundidadquesigabajando}
begin
bombilla.top:=bombilla.top+1;
bombilla.picture:=bombilla1.picture;{porsiestencendida,queseapage}
end
else {sipasade200defondo...}
subir:=1 {queseactivesubir}
end
else {siestactivadasubir..}
begin
ifbombilla.top>0then {ysiannoestarriba...}
bombilla.top:=bombilla.top1 {quesigasubiendo}
else {siyahallegadoarriba...}
subir:=0 {quesedescativesubir}
end
end;

Al empezar el programa, la variable subir debe de valer algo (cero por ejemplo)
procedureTMainForm.FormCreate(Sender:TObject);
begin
subir:=0; {empiezaconsubirdesactivado}
end;

Al hacer clic sobre la flecha se activa el timer (o tambin se puede hacer sobre un botn)
procedureTMainForm.flecha1Click(Sender:TObject);
begin
timer1.enabled:=true; {alhacerclicconelratnqueseactiveeltimer1}
end;

Variantes y mejoras:

Conexin a Internet.
1.- Crea un botn que nos conecte con la pgina web de soporte del programa:
Aade la siguiente lnea de cdigo:

ShellExecute(GetDesktopWindow(),nil, pChar('www.ofimega.es/oficalc/index.htm'), nil, nil, SW_SHOWNORMAL);

2.- Crea un botn que nos abra un archivo web de ayuda:


Crea el archivo web: 'instrucciones.htm' (con Microsoft Word o Dreamweaver), explicando el funcionamiento del
programa. Este archivo debe guardarse en el mismo directorio o carpeta que el ejecutable (.exe).
Aade el componente webbrowser de la paleta Internet.
Asignar propiedad visible= false
Aade las siguientes lneas de cdigo:
var
dire:string;
begin
dire:=ExtractFilePath(ParamStr(0));//Detectalarutadelprograma
WebBrowser1.visible:=true;
WebBrowser1.Navigate('file://'+dire+'instrucciones.htm')
end;

Cmo ejecutar un programa externo:


var
dire:string;
begin
dire:=ExtractFilePath(ParamStr(0));
ShellExecute(Form1.Handle,nil,PChar(dire+'programa.exe'),'','',SW_SHOWNORMAL)
end;
Ejercicio 7. Control de direccin y velocidad de un objeto
Completa este programa esqueleto para disear un juego de aterrizaje lunar de una nave espacial:

Panel1
Name:Empezar
Name:Inicio
Name: Salir
Name:Parar Shape1
stCircle

Timer1
Pamel2.Bottom Interval=50

Panel3.Bottom
Shape2
Tscrollbar
Label1 Componente: vertical
Tbiagauge Name:Barrav
Name:Nivelh Max:10
Min:10

Tscrollbar
Horizontal
Name:Barrah
progressbar progressbar
Name:Nivelvynivelh Name:Energa
MaxMin:+1010 0100

Procedures:

Proceduresdelosbotones: Proceduredelasbarrasde Proceduredeltimer


EmpezarClick desplazamiento: Timer1Timer
timer1.enabled:=True; barravChange Shape1.Left:=Shape1.Left+barrah.position;
PararClick nivelv.value:=barrav.position; Shape1.Top:=Shape1.top+barrav.position;
timer1.enabled:=False; energia.progress:=energia.progress
InicioClick 1;
shape1.top:=124; barrahChange
shape1.left:=184; nivelh.value:=barrah.position;
SalirClick
Close;

Variantes:
El fondo de la ventana ser de color negro y se aadirn shapes de estrellas blancas
El objeto ser el dibujo de una nave en un picture box.
(En el programa esqueleto el objeto es un shape de forma circular.)
Se aadirn asteroides que resten puntos y/o desven la nave de su ruta.
Finalizar el juego al coincidir el objeto con las coordenadas de la base lunar.
Puedes sustituir las barras de direccin por botones Updown de la paleta Win32 o
sustituirlos por ArcDial y TrackBar el en Firemonkey

Varianteparaquenosesalgalanavedeloslmitesdelaventanaaincluirenelprocedimientodeltimer:
IfShape1.Left<0thenShape1.Left:=299;
IfShape1.Left>300thenShape1.Left:=1;>Idemparacontrolarribayabajoconlapropiedadtop

Estilos para XE Rad Studio:


Si usas XE: Escoge del men: Project Options: Application
Appearance y activa un estilo como: Aqua Graphite

Guarda el proyecto con el nombre: Aterriza.dpr y la unidad Aterriza1.pas en la carpeta: Aterriza


Ofimegaacadmies ManualEjerciciosProgramacinRadStudioDelphi Impago16 Pg35
Variante FireMonkey XE5: Simulador Dron
Crea nuevo proyecto. (XE3: FileNewFiremonkey desktop application XE7: New Multidevice application)
Poner los componentes de la imagen:
Cambia la propiedad del formulario Form1. Stylebook: por StyleBook1. Resource: Transparent

procedure TForm4.ScrollVChange(Sender: TObject); procedure TForm4.DialVChange(Sender: TObject);


begin begin
if sender= ScrollV then if sender=TrackV then
TrackV.Value:=ScrollV.Value ScrollV.Value:=TrackV.Value
else else
TrackH.Value:=ScrollH.Value; ScrollH.Value:=TrackH.Value;
ProgressF.Value:=ProgressF.Value-1; ProgressF.Value:=ProgressF.Value-1;
end; end;

procedure TForm4.Timer1Timer(Sender: TObject); procedure TForm4.ComprobarBordes();


begin begin
Nave1.Position.X:=Nave1.Position.X+ScrollH.Value; if Nave1.Position.X>PlotGrid1.width then
Nave1.Position.Y:=Nave1.Position.Y+ScrollV.Value; Nave1.Position.X:=0;
ProgressT.value:=ProgressT.value-1; //--> consumo if Nave1.Position.X<0 then
de tiempo Nave1.Position.X:=PlotGrid1.width;
Nave1.rotationangle:=ScrollH.Value*3; //--> inclinacin end;
de nave
ComprobarBordes(); //comprueba si se sale
//ComprobarAterrizaje(); //comprueba si aterriza bien
end;

procedure TForm4.IgnitionClick(Sender: TObject);


begin
Timer1.Enabled:=Ignition.IsPressed;
ScrollV.Value:=-1;
end;

Notas:
Hemos creado un procedimiento independiente para comprobar si se sale del borde, por lo tanto hay que
declararlo en la lista de declaracin de procedures: procedure ComprobarBordes();
La accin para el evento ScrollHChange es la misma que para ScrollVChange
La accin para el evento DialHChange es la misma que para DialVChange

Guarda el proyecto con el nombre: Dron.dpr y la unidad Dron1.pas en la carpeta: Dron


Bloc de notas. Editor de textos.
UsodeloscuadrosdedilogoAbrirGuardarimprimir...

Ingredientes
1textomemo(memo1)
1cuadroabrir(opendialog1)
1cuadroguardar(savedialog1)
1menu(mainmenu1)

procedureTForm1.Nuevo1Click(Sender:TObject); procedureTForm1.Salir1Click(Sender:TObject);
begin begin
Memo1.Clear; Close;
OpenDialog1.Filename:=''; end;
Caption:='TextDemo[Untitled]';
end; procedureTForm1.FormCloseQuery(Sender:TObject;var
CanClose:Boolean);
procedureTForm1.Abrir1Click(Sender:TObject); var
begin MsgResult:Word;
withOpenDialog1do begin
ifExecutethen ifMemo1.Modifiedthen
begin MsgResult:=MessageDlg(Format('Archivo%s
Memo1.Lines.LoadFromFile(FileName); modificado.Guardar?',
Caption:='TextDemo'+ExtractFilename(FileName); [OpenDialog1.Filename]),mtWarning,mbYesNoCancel,
end; 0);
end; caseMsgResultof
mrYes:
procedureTForm1.Guardar1Click(Sender:TObject); begin
begin Guardarcomo1Click(Sender);
ifOpenDialog1.Filename<>''then CanClose:=True;
begin end;
Memo1.Lines.SaveToFile(OpenDialog1.Filename); mrNo:CanClose:=True;
end mrCancel:CanClose:=False;
elseGuardarcomo1Click(Sender); end;
end;

procedureTForm1.Guardarcomo1Click(Sender:TObject);
begin
withSaveDialog1do
ifExecutethen
begin
Memo1.Lines.SaveToFile(Filename);
Caption:='TextDemo'+ExtractFilename(FileName);
OpenDialog1.Filename:=Filename;
end;
end;
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg37

USO DE COMPONENTES DE TEXTO. RICHEDIT y ActionList


VamosagenerarunpequeoprocesadordetextosutilizandolaplantillaSDIyelcomponenteRichedit.
1. Elijedelmenprincipal:FileNewOther
2. Escoge de Delphi Projects: SDI Application. Indicar la carpeta para el
proyecto: Crear una nueva carpeta llamada Editor. El asistente nos
generarunformularioconloscomponentesbsicos.Unmen,unabarra
de herramientas y una barra de estado. Aade al formulario un objeto
Richedit(PaletaWin32)alineadoalcliente.
CambiasupropiedadAlign:alClienteysuborraeltextodelapropiedad
Lines
Laplantillanoshageneradounformularioconunabarradeherramientasyun
menquecontienenllamadasalasmismasacciones,porejemplo,laaccinde
Abrirpuedeserllamadadesdeelbotndeabrirodesdeelmen:Archivo
Abrir.Cadaobjetodeambas,hacereferenciaaunaaccinqueest
centralizadaenlalistadeacciones:ActionList1yesllamadodesdeeleventoAction.


Paracompletarelevento
Abrir,pulsamosdobleclick
sobreAccinlist1y
seleccionamoslaaccin:
FileOpen1.
Ensuspropiedades:cambia
suspropiedadesCaptiony
Hintcomoenlafigura.

EneleventoOnExecute,cambiaelcdigo:OpenDialog>Execute();por:
if OpenDialog.Execute() Then
RichEdit1.Lines.LoadFromFile(OpenDialog.FileName);
DelmismomodoseleccionalaAccinFileSave1ycambiaelcdigopor:
if SaveDialog.Execute() Then
RichEdit1.Lines.SaveToFile(SaveDialog.FileName);

Enambosobjetos,cambiarlapropiedadfilter,parapoderespecificaretipode
documentoalabriroguardar,comoenlafiguraylaspropiedades:Filterindex:3
DefaultExt:*.rtf
Otrasacciones:
AccionesCortar,copiarypegar:Estasaccionesfuncionansincdigoescritoporqueestsasociadasaunacombinacin
deltecladoquesedesignaenlapropiedad:ShortCut:Ctrl+X,Ctrl+CyCtrl+V.
AccinNuevo:FileNew1FileNew1Execute:aadeelcdigo:RichEdit1.Lines.Clear();
AcccinSalir:FileExit1FileExit1Execute.Compruebaelcdigo:Close();Application.Terminate();
AcccinAcrecade(Crditos):HelpAbout1HelpAbout1Execute.Compruebaelcdigo:
AboutBox>ShowModal();
Problemasymejoras:
Nombredearchivoalguardar:
AlescogerGuardarlaaplicacinnonosdeberasolicitarelnombresiyasehaguardadoorecuperadoantes:
Creamosunavariablepblicaqueguardarelnombredelarchivo:nombrearchivo: String ;
CambiamoselcdigodelprocedimientoFileSave1Execute:
ifSender=FileSave1then
begin
ifnombrearchivo!=''thenRichEdit1.Lines.SaveToFile(nombrearchivo);
RichEdit1.Modified:=False;
end
else
ifSaveDialog.Execute()then
begin
RichEdit1.Lines.SaveToFile(SaveDialog.FileName);
Nombrearchivo:=SaveDialog.FileName;
end;

AadimoselcdigoalAbrir:nombrearchivo:=OpenDialog.FileName;
Preguntaralcerraronuevo:
Tantosicreamosunarchivonuevoosalimosdelprograma,laaplicacinnosdeberapeguntarsideseamosconservaro
guardareldocumentoeditado.ParaelloutilizamoslapropiedadModifieddelcomponenteRichedit.
FileNew1Execute
begin
if RichEdit1.Modified=True then
if MessageDlg("Guardar documento anterior?",
mtInformation, TMsgDlgButtons() << mbYes << mbNo << mbCancel, 0)= mrYes) then
FileSave1Execute(Sender);
end
RichEdit1.Lines.Clear();
RichEdit1.Modified:=False;
end
AlcerrarelformularioocurreanteseleventoFormCloseQuerydondeseconsultaantesdecerrarlavariableCanClose:
FormCloseQuery(Sender, CanClose)
{
if (RichEdit1.Modified=True) then
if (MessageDlg("Guardar documento?", mtInformation, TMsgDlgButtons() << mbYes << mbNo << mbCancel, 0)= mrYes)
then FileSave1Execute(Sender);
CanClose:=True;
end
Imprimir:
AadeunobjetoPrintDialog1delapaletaDialogs.
AadeunanuevaaccinalalistaActionList1paraimprimir,conlas
propiedadesdelaimagenalqueleaadiremoslasiguienteaccinenel
eventoOnExecute:
if PrintDialog1.Execute() then RichEdit1.Print(nombrearchivo);
AadeunelementoenlaseccinfiledelMainMenuyunnuevobotnenlaToolBar1demodoquesuaccinActionse
vinculea:Print.
ParagenerarlaaccinConfigurarImpresora,puedescrearunaStandardActiondeltipo:FilePrintSetup.Luegopuedes
aadirelelementoenelmenparaabrirelcuadrodedilogo:Configurarimpresora:

Ejecutayprueba(Run).Sitodoescorrecto,Guardatodo(FileSaveAll):Unit:Editor1Proyecto:Editor
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg39
Ejercicio de aplicacin Delphi. Procesador de textos. Ventanas madre e hija

Una ventana Madre (MDI) contendr varias ventanas hijas (Child). Esta es la ventana Madre:

Mainmenu1

GroupIndex:0

OpenFileDialog

Ventana:
Name:Madre (GroupIndex:9)
FormStyle:fsMDIForm Cascada:Cascade;
Mosaico:Tile;
Salir:(GroupIndex:9)
Organizariconos:
ArrangeIcons;

Archivonuevo: Archivosalir(madre) Proceduresventana:


procedureTMadre.Nuevo procedureTMadre.Salir1 Cascadaclick:
THija.Create(Self); Close: Cascade;
end; end; Mosaicoclick:
Archivoabrir: Archivosalir(hija){groupindex:0} Tile:
procedureTMadre.Abrir1; procedureTHija.Salir1 Organizarclick:
ifOpenFileDialog.Executethen MadreSalir1(Sender); ArrangeIcons;
withTHija.Create(Self)do end;
Open(OpenFileDialog.FileName);

AquaparecelaventanaHija:

Archivo:(GroupIndex:0)Mismoquemadre
Editar:(GroupIndex:1)
Texto:(GroupIndex:1)




Aqu estn los procedures de la ventana Hija:
procedureTHija.SetFont procedureTHija.AlinearClick
begin begin
FontDialog1.Font:=Memo1.Font; Left1.Checked:=False;
ifFontDialog1.Executethen Right1.Checked:=False;
Memo1.Font:=FontDialog1.Font; Center1.Checked:=False;
SetEditRect; withSenderasTMenuItemdoChecked:=True;
end; withMemo1do
ifLeft1.Checkedthen
Alignment:=taLeftJustify procedureTHija.Abrir1Click
procedureTHija.Open(constAFilename: begin
string); elseifRight1.Checkedthen
Alignment:=taRightJustify madre.Abri1(Sender);
begin end;
Filename:=AFilename; elseifCenter1.Checkedthen
Alignment:=taCenter;
Memo1.Lines.LoadFromFile(FileName); procedureHija.Salir1Click;
Memo1.SelStart:=0; end;
begin
Caption:=ExtractFileName(FileName); madre.Salir1Click(Sender);
Position:=poScreenCenter; end;
Memo1.Modified:=False;
end;

procedureTHija.FormClose(alcerrarlaventanahija)
begin
procedureTHija.Imprimir1Click; Action:=caFree;(paraquepuedasercerradaporlamadre)
var end;
ifPrintDialog.Executethen
memo1.Print(FileName); procedureTHija.FormCloseQuery(accinantesdecerrar)
end; var
DialogValue:Integer;
procedureTHija.Impresora1Click(Sender:TObject); FName:string;
begin begin
PrinterSetupDialog1.Execute; ifMemo1.Modifiedthen
end; begin
Confirma.showmodal;>Muestraventanaconfirma
ProcedureGuardar FName:=Caption;
if(Filename='')orIsReadOnly(Filename)then Confirma.Label2.Caption:='Grabar'+Fname;
GuardarcomoClick(Sender) caseConfirma.Modalresultof
else mrOK:Save1Click(Self);
begin mrCancel:CanClose:=False;
Memo1.Lines.SaveToFile(Filename); end;
Memo1.Modified:=False; end;
procedureTHija.Guardarcomo1Click(Sender:TObject); end;
begin
SaveFileDialog.Filename:=Filename;
ifSaveFileDialog.Executethen
procedureTHija.Nuevo1Click
begin
begin
Filename:=SaveFileDialog.Filename;
Modifica.Caption:='Otrodocumentonuevo';
Caption:=ExtractFileName(Filename);
madre.Nuevo(Sender);
Modifica.Caption:='';{retiramensaje}
end;
Save1Click(Sender);

end;
procedureTHija.Cerrar1Click
end;
begin
procedureTHija.Save1Click(Sender:TObject);
Close;
begin
end;
ifPathName=DefaultFileNamethen
Guardarcomo1Click(Sender)
else procedureTHija.NegritaClick(Sender:TObject);
begin begin
Editor.Lines.SaveToFile(PathName); ifNegrita.DownthenMEMO1.Font.Style:=MEMO1.Font.Style
Editor.Modified:=False; +[fsBold]
end; elseMEMO1.Font.Style:=MEMO1.Font.Style[fsBold];
end; end;
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg41
ActionListyActionManager:ProcesadordetextosutilizandoelcomponenteActionList
Escoge:ArchivoNuevoproyectoVCL(oVCLFormsapplication)
Cambialapropiedad:Form1.caption=Editordetextos
Aadircomponentesalformulario:
AadiremosuncomponenteRichEditdelapaletawin32.
Unavezsobreelformulariocambiarlapropiedadalignaclient.
PulsadobleclicenelcomponeteStatusBardelapaletawin32yeste
seaadirabajodelformulariocomobarradeestado.
Paracrearunpanelenlabarradeestado:
EnlapropiedadSimpleText>escribir:Sinttulo.txt.
EnlapropiedadPanelsabrirelcuadrodePanels
ClicenelbotnNewparaaadirunpanelalabarradeestado
statusbar1.Cierraelcuadro.
Aadirmenybarradeherramientas:
Delapaletaestandarescogeelcomponente:Mainmen1
DelapaletaWin32escogeelcomponente:ToolBar
AgruparaccionesmedianteActionlist:
ParaagruparlasaccionesdelmenydelabarradeherramientasDelphiproporcionaunactionmanagerpara
centralizaramboscdigoseimgenes.
Enlapaletaadicional,hagadobleclicenelcomponente:ActionManageroenlapaletaestandar:actionlist.Paraaadirlo
alformulario.Comoesuncomponentenovisual,sepuedeponerencualquiersitio.
Paraverloscaptionsdecomponetesnovisualesescoga:ToolsEnvironmentOptions,clicenDesignerpage,y
seleccionar:Showcomponentcaptions,OK..
Menu Comando Herramientas? Descripcin
Archivo Nuevo S Createsanewfile.
Archivo Abrir S Opensanexistingfileforediting.
Archivo Guardar S Savesthecurrentfiletodisk.
Archivo Guardar No Savesafileusinganewname(alsoletsyousaveanew
como fileusingaspecifiedname).
Archivo Salir S Quitstheeditorprogram.
Edicin Cortar S Deletestextandstoresitintheclipboard.
Edicin Copiar S Copiestextandstoresitintheclipboard.
Edicin Pegar S Insertstextfromtheclipboard.
Ayuda Contenido No DisplaystheHelpcontentsscreenfromwhichyoucan
accessHelptopics.
Ayuda Indice No DisplaystheHelpindexscreen.
Ayuda Acerca.. No Displaysinformationabouttheapplicationinabox.
DobleclicenActionlistparaabrirlo
EnEditingForm1.ActionManager1pulsarelbotn:NewAction.Ensus
propiedadesescribir:
Caption=&New
Category=Archivo
Hint=Creaunarchivonuevo
ImageIndex=6(imagen6deImageList)
Name=FileNew
Pulsarelbotn:NewAction.Ensuspropiedadesescribir:
Caption=&Guardar Variante:ActionManager
Category=Archivo
Hint=Guardaelarchivo SimilaraActionlist,tenemoselcomponente:
ImageIndex=8(imagen8deImageList) ActionManagerenlapaletaAdicional.Vaen
Name=FileSave combinacinconActionmainmenyActiontoolbar.
Pulsarelbotn:NewAction.Ensuspropiedadesescribir: PermitelaaparienciaOfficeXPypermite
Caption=&Indice personalizarlasbarrasdeherramientasyelmen
Category=Ayuda entiemporeal,conelcomponete:CustomizeDlg.
Hint=Indiceayuda
Name=HelpIndex
Pulsarelbotn:NewAction.Ensuspropiedadesescribir:
Caption=&Acerca
Category=Ayuda
Hint=AcercadeName=HelpAbout
Aadiraccionesestandaralacionlist(open,saveas,exit,cut,copy,paste,help)
Pulsarelbotnderechodelmouseaescogerdelmen
contextual:aadirNewestndarAction:Aadirlasacciones:
TEditCut,TEditCopy,yTEditPaste.SecrearlacategoraEdit

EnlacategoraarchivooFileaade:TFileOpen,TFileSaveAs,
andTFileExit.

EnlacategoraHelpaadeTHelpContents.

Guardaelproyecto:FileSaveAll

Aadirimagenesalimagelist
Truco:Abreelarcivo(Archivoabrir):C:\Archivosdeprograma\Borland\DelphiX\Source\Vcl\ActnRes.pas.
Apareceunejemploconlasimgenesestndaryalistas.
TambinpuedesPulsarAddybuscarlasimgenesen:C:\Archivosdeprograma\Archivoscomunes\Borland
Shared\Images\Buttons


Edit|Cut 0
Edit|Copy 1
Edit|Paste 2
File|New 6
File|Open 7
File|Save 8

File|SaveAs 30

File|Exit 43

Help|Contents 40





Aadirunmen:
Delapaletaestandarescogeelcomponente:Mainmen1ypulsa
dobleclic,paraaadirloalformulario.

Pulsaluegodobleclicsobreelcomponentedelformulariomainmenu1
paraeditarlo.

Enlapropiedad:imagelistescoge:imagelist1

Puedesusarelbotnderechodelmousesobreelmenparaaadir
elementosalmendesdelaplantilla:Insertfromtemplate.Oaadir
loselementosmanualmenteusandoelbotnderechodelmouse
sobreelmenyescogerInsert.

Aadirunabarradeherramientas:
- DelapaletaWin32escogeelcomponente:ToolBarypulsadobleclic,paraaadirloalformulario.
- Enlapropiedad:imagelistescoge:imagelist1
- Pulsaelbotnderechodelmouseparaaadirbotones
alabarradeherramientas
- EnlapropiedaddecadabotndeAction:Buscala
actionlistdeseada.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg43
Cdigos de ejemplo tpicos de eventos en Procesadores de texto y ventanas madre-hija:

Trabajarconventanas Abrirventanahija.
procedureTFrameForm.OpenChild(Sender:TObject);

var
Salir.Cerrarventana.
EditForm:TEditForm;
begin
begin
Close;
ifOpenFileDialog.Executethen
end;
begin
Preguntaparacerrar.
EditForm:=TEditForm.Create(Self);
procedureTForm1.FormClose(Sender:TObject;var
EditForm.Open(OpenFileDialog.Filename);
Action:TCloseAction);
EditForm.Show;
begin
end;
ifMessageDlg('Salirdelprograma?',
end;
mtConfirmation,
[mbYes,mbNo],0)=mrYesthen
Action:=caFree Trabajarcontextos
else
Action:=caNone; Abrirtextoenuncomponentememo.
end; procedureTForm1.FileOpenClick(Sender:TObject);
Eventoalcerrarhija(onclose) begin
procedureTHija.FormClose(Sender:TObject;var withOpenDialog1do
Action:TCloseAction); ifExecutethen
begin begin
Action:=caFree;//CloseActionPermitido Memo1.Lines.LoadFromFile(FileName);
end; Caption:='TextDemo'+
AbrirventanaAcercade...AboutClick ExtractFilename(FileName);
begin end;
AboutBox.ShowModal; end;
end; Guardartextomemo.
Ponernombredelarchivoaunaventana. procedureTForm1.Save1Click(Sender:TObject);
Ventana.Caption:=ExtractFileName(FileName); begin
Ventanamosaico. ifOpenDialog1.Filename<>''then
procedureTFrameForm.Tile1Click(Sender:TObject); begin
begin Memo1.Lines.SaveToFile(OpenDialog1.Filename);
Tile; end
end; elseSaveAs1Click(Sender);
Ventanacascada. end;
procedureTFrameForm.Cascade1Click(Sender: Guardarcomo...textomemo.
TObject); procedureTForm1.SaveAs1Click(Sender:TObject);
begin begin
Cascade; withSaveDialog1do
end; ifExecutethen
Ventanaorganizar. begin
procedureTFrameForm.ArrangeIcons1Click(Sender: Memo1.Lines.SaveToFile(Filename);
TObject); Caption:='TextDemo'+
begin ExtractFilename(FileName);
ArrangeIcons; OpenDialog1.Filename:=Filename;
end; end;
Nuevaventanahija.(desdelamadre) end;
procedureTPrincipal.Nuevo1Click(Sender:TObject); DilogoBuscartexto.
var procedureTForm1.Find(Sender:TObject);
Hija:THija; begin
begin withSenderasTFindDialogdo
Hija:=THija.Create(Application); ifnotSearchMemo(Memo1,FindText,Options)
Hija.Show; then
end; ShowMessage('Cannotfind"'+FindText+'".');
Nuevaventanahija.(desdelahija) end;
procedureTHijaNew1Click(Sender:TObject); DilogoReemplazartexto.
begin var
Ventana.Caption:='nuevo';{retiramensaje} Found:Boolean;
PrincipalForm.Nuevo1Click(Sender); begin
end; withReplaceDialog1do
begin ConfirmChange(Caption,FromFileName.Text,
ifAnsiCompareText(Memo1.SelText,FindText)=0 ToFileName.Text);
then end;
Memo1.SelText:=ReplaceText; end;
Found:=SearchMemo(Memo1,FindText,Options); Borrararchivos.
whileFoundand(frReplaceAllinOptions)do procedureTFMForm.Delete1Click(Sender:TObject);
begin begin
withFileListdo
ifMessageDlg('Delete'+FileName+'?',
mtConfirmation,
Trabajarconarchivos. [mbYes,mbNo],0)=idYesthen
ifDeleteFile(FileName)thenUpdate;
Detectardirectorio. end;
procedureTFMForm.DirectoryOutlineChange(Sender:
TObject); Llamadasaprocedimientos
begin
FileList.Directory:=DirectoryOutline.Directory; Enelmen:ArchivoMoveryCopiarllamanal
DirectoryPanel.Caption:= mismoeventoFilechange
DirectoryOutline.Directory;
end; procedureTFMForm.FileChange(Sender:TObject);
Detectarlistadearchivos. begin
procedureTFMForm.FileListChange(Sender:TObject); withChangeDlgdo
var begin
TheFileName:string; ifSender=Move1thenCaption:='Mover'
begin elseif(Sender=Copy1)or(Sender=copiara)or
withFileListdo (Sender=Copiara1)thenCaption:='Copiar'
begin elseifSender=Rename1thenCaption:=
ifItemIndex>=0then 'Renombrar'
begin elseExit;
TheFileName:=FileName; CurrentDir.Caption:=Statusbar.panels[2].text;
FilePanel.Caption:=Format('%s,%dbytes', FromFileName.Text:=FileList.FileName;
[TheFileName,GetFileSize(TheFileName)]); ToFileName.Text:='';
end if(ShowModal<>mrCancel)and(ToFileName.Text
elseFilePanel.Caption:=''; <>'')thenConfirmChange(Caption,
end; FromFileName.Text,ToFileName.Text);
end; {Llamaalprocedimientoconfirmchangepasandole
Ejecutararchivo. tresvariablesdetexto}
procedureTFMForm.Open1Click(Sender:TObject); end;
begin end;
withFileListdo
ExecuteFile(FileName,'',Directory,SW_SHOW); ProcedureTFMForm.ConfirmChange(constACaption,
end; FromFile,ToFile:string);
begin
Copiar,renombrar,moverarchivos. ifMessageDlg(Format('%s%sto%s?',[ACaption,
procedureTFMForm.FileChange(Sender:TObject); FromFile,ToFile]),
begin mtConfirmation,[mbYes,mbNo],0)=mrYesthen
withChangeFormdo begin
begin ifACaption='Mover'then
ifSender=Move1thenCaption:='Move' MoveFile(FromFile,ToFile)
elseifSender=Copy1thenCaption:='Copy' elseifACaption='Copiar'then
elseifSender=Rename1thenCaption:='Rename' CopyFile(FromFile,ToFile)
elseExit; elseifACaption='Renombrar'then
CurrentDir.Caption:=FileList.Directory; RenameFile(FromFile,ToFile);
FromFileName.Text:=FileList.FileName; FileList.Update;
ToFileName.Text:=''; end;
if(ShowModal<>idCancel)and(ToFileName.Text end;
<>'')then
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg45

Ejercicio de controles.

Resumen de controles ms usuales. (Vlido para Visual basic & Delphi)


Introduceloscontrolesquesemuestranenla
figuraycambialassiguientespropiedades
entreotrasparaquequedecomoenla2
figura:
Label8:Nombre:VerAscii
Backcolor:Blanco
BorderStyle:1Fixedsingle
Command1(button1):Caption:&Salir
Label1:Nombre:Carcter
Label2:Nombre:ASCII
Backcolor:blanco
BorderStyle:1Fixedsingle
Label5:Nombre:rojo
Caption:Rojo
Alignment:2Center
Frame1(groupbox):Nombre:colores
caption:colores
Hscroll3: Hscroll2: Hscroll1: Hscroll5:

Name:ColorVerde Name:ColorRojo Name:Barracodigo Name:TamCaracter

Max:255 Max:255 Max:255 Max:80

Min:0 Min:0 Min:32 Min:6


Cambiarlabel2(ASCII)portext1(ASCII)

PrivateSubForm_Load()

VerAscii.FontName="TimesNewRoman"

//'tipodeletra

EndSub


PrivateSubTamCaracter_Change()

VerAscii.FontSize=TamCaracter.Value

'tamao

Label4.Caption="Tamao"+

Str(TamCaracter.Value)

EndSub






PrivateSub(Procedure)Colorrojo_Change()
Nota:Idemcolorverdeycolorazul
VerAscii.ForeColor=RGB(Colorrojo.Value,Colorverde.Value,ColorAzul.Value)

Rojo.Caption="Rojo"+Str(Colorrojo.Value)

EndSub(end;)


PrivateSub(Procedure)Barracodigo_Change()

ASCII.Text=Chr(Barracodigo.Value)

VerAscii.Caption=Chr(Barracodigo.Value)

Label3.Caption="ValorAscii"+Str(Barracodigo.Value)

EndSub(end;)


PrivateSub(Procedure)ASCII_Change()
VerAscii.Caption=Chr(Barracodigo.Value)
IfASCII.Text<>""ThenBarracodigo.Value=Asc(ASCII.Text)
EndSub(end;)
Ejercicio animacin. Flappy.
Acadaimpulsodeltimerlaimagenseintercambiaconlasotrasdosyavanza.Lasotrasdosimgenesdebenestarocultas
yeltimeractivado(enabled).Ajustamoslapropiedadintervaldeltimer1a100o200.
Eltrucoresideenutilizarunavariableamododepermisoobanderaflagquepuedeserdeltipoinetegeromejorboolean
(2estados).
PascalDelphi:
procedureTForm1.Timer1Timer(Sender:TObject);
var
Flag:boolean;//variableflag
begin
Imagen.Left:=Imagen.Left+10;//muevealaderecha
IfFlag=trueThen
begin
Imagen.Picture:=Imagen1.Picture;
Imagen.Top:=Imagen.top+10;
Flag:=false;
end
VisualBasic:PrivateSubTimer1_Timer() else
StaticFlagAsInteger begin
Imagen.MoveImagen1.Left+20,Imagen.Top5 Imagen.Picture:=Imagen2.Picture;
IfFlag=1Then Imagen.Top:=Imagen.top10;
Imagen.Picture=Imagen1.Picture Flag:=true;
Flag=0 end;
Else end;
Imagen.Picture=Imagen2.Picture C++Builder:void__fastcallForm1::Timer1Timer
Flag=1 {
EndIf booleanFlag=True;//variableflag
EndSub Imagen>Left=Imagen>Left+10;
if(Flag==true)
{
Guardaelproyectoconelnombre:Flappy Imagen>Picture=Imagen1>Picture;
Imagen>Top=Imagen>Top+10;
Flag=false;
}
else
{
Imagen>Picture=Imagen2>Picture;
Ejercicio . Visor de imgenes Imagen>Top=Imagen>Top10;
Flag=true;
}}
;

Dirlistbox
Name:Dir1

Filelistbox
Name:File1

Image
Name:Open
Label:Label1

Command1Salir
Name:Command1
Caption:&Salir PrivateSubForm_Load()
Drive1.Drive=App.Path
Dir1.Path=App.Path
EndSub
PrivateSubFile1_DblClick()
'en(C:\),Pathtieneunabarra(\)alfinal
'encualquierotronivel,nohaybarra(\)final.
IfRight(file1.Path,1)<>"\"Then PrivateSubDrive1_Change()
label1.Caption=file1.Path&"\"&file1.filename Dir1.Path=Drive1.Drive
Else Drivelistbox
EndSub
PrivateSubDir1_Change()
label1.Caption=file1.Path&file1.filename Name:Drive1
EndIf file1.Path=Dir1.Path
Form1.open.Picture=LoadPicture(label1.Caption) EndSub
EndSub
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg47
Bases de Datos con Delphi - Teora
Delphi y C++ Builder tienen mtodos de acceso a bases de datos que se basan en TDataSet. que, como su
nombre lo indica, es un "set de datos". El set de datos abstracto no especifica el origen de la base de datos .
Esto lo hace flexible e independiente.
Los componentes Table y Query son los componentes ms comnmente usados para acceso bsico a
bases de datos (pero no los nicos). Estos componentes representan una tabla y una consulta SQL,
respectivamente.
Conectores:
BDE: Libreras para acceder a tablas de dBase con el motor DataBaseEngine (obsoleto)
ODBC: Controlador creado por Microsoft para accesar a datos, integrado en Windows.
LiveBindings. (Versiones Xe). Acceso desde controles de FireMonkey y dispositivos mviles.
Driver o libreras de acceso a datos:
DbExpress: Sustituto del BDE que ha quedado obsoleto.
ADO: ActiveX Data Objects. Permite acceder a datos, sin necesidad de conocer la base de datos.
XML Client Dataset: Acceso a tablas de datos XML Necesita MIDAS.dll
FireDac. (Versiones Xe) Acceso directo a bases de datos
Componentes No Visuales de Acceso a Datos:
Conexin: Configura el driver y el modo de cacceso a la base de datos.
Database: Es la representacin de una base de datos o conjunto de tablas.
Table (Tabla): Representa una tabla entera. TTable contiene informacin acerca del tipo de tabla, del ndice,
as como filtros. TTable tiene entre sus mtodos, First, Next, Last, etc.
Query (Consulta): Se comporta como una tabla, pero al mismo tiempo es un comando de SQL.
Porqu SQL?: La respuesta es sencilla: COMPATIBILIDAD. La especificacin SQL-92 es soportada por
todos los lenguajes generales.
DataSource: Es el "origen de los datos". Un componente intermedio que permite tener varias
representaciones de los mismos datos
UpdateSQL: Permite editar un query SQL. Todos los queries tienen un Edit, Insert y Delete. TStoredProc:
Permite ejecutar un comando SQL sin esperar ninguna respuesta, como un procedimiento.
Componentes Visuales de Acceso a Datos
Los componentes de este tipo son llamados "Data-aware", y tienen el prefijo "DB". De este modo, un
componente de edicin "Edit" en su versin "Data Aware" es llamado "DBEdit". ComboBox se convierte en
"DBComboBox".
DBgrid es una tabla de datos y DBControlGrid equivale a formularios contnuos.
Ademas, existe un componente llamado "DBNavigator", que es una serie de botones "mapeados" a los
comandos Next, Prior, Last, Edit, Delete, etc., de cualquier DataSource.
Ejercicio 8. Bases de datos. Agenda de telfonos.
Tabla de datos DBF - Modo DBE: (obsoleto)
En Delphi escoge: Tools Database Desktop para crear el archivo que contendr los datos Data Base File
Escoge del men: File New Table: Dbase for Windows.
Crear la estructura de la derecha y guardar como Agenda.dbf
En el formulario principal de Delphi, aadir los componentes Table1 (Paleta BDE) y Datasource1( Paleta Data
Access)
En la Table1: La propiedad TableName es el nombre del archivo de datos: Agenda.dbf ; Name es el nombre de la
Tabla: Table1 y Databasename es la ruta donde se encuentra el archivo de datos

Tabla de datos XML - Modo ClientDataset


- En el formulario principal de Delphi, aadir los
componentes ClientDataset y un Datasource
(Paleta Data Access).
- Pulsar el botn derecho sobre el componente
ClientDataset y escoger de Fields editor New
field.
- Crear los campos de la imagen derecha: Nombre
Apellidos Telefono Email etcdel tipo
String y ancho de unos 50 a 100 caracteres.
- Una vez finalizado, cierra la lista de campos y
pulsa el botn derecho sobre el ClientDataset y escoge:
Create Dataset y luego: Save to MyBasexml table. Guarda
la tabla con el nombre: Agenda.xml
- Llmale al clientdataset con el nombre: Tabla1
- A la Datasource1 le pones en su propiedad Dataset: el
nombre Tabla1.
- Aadir al formulario los componentes DbNavigator y un
DBGrid de la paleta de Datacontrols y asignales la
Datasource1 Asegrate que la Tabla1 esta en Active=True.
Ya puedes probar la aplicacin (Run F9)

Comprueba que que permite aadir y borra datos en la tabla,


pero estos se pierden al volver a ejecutar la aplicacin.
Cierra prueba y uelve al diseo y selecciona la tabla1 asigna la propiedad a la Tabla1: filename: Agenda.xml
(tambin pedes asignarla en tiempo de ejecucin)
Aade los otros componetes de la imagen: Un men y un cuadro para buscar dentro de un panel alineado al Top.
El men consta de los tems: Archivo -> Salir y Ver -> Siempre visible y transparente
Guarda el proyecto: Save Project asCrea una carpeta llamada Agenda y guarda la unidad como: Agenda1.pas y
el proyecto como Agenda.dpr

Label1 Edit1 Panel1 DBNavigator1
EventoOnChange: Datasource:Datasource1
Edit1change


Dbgrid1
Datasource:Datasource1
Table1oClientdataset
Datasource1 TableName:Agenda.dbf
Dataset:Table1o OFilename:Agenda.xml
Mainmenu Active:True
Clientdataset 1
StatusBar:

Name:


Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg49
- Vuelve a ejecutar el proyecto y comprueba que ahora s se quedan guardados los datos en el archivo
Agenda.XML.
- Para buscar el nombre:
Es necesario indexar la tabla por el campo a buscar: Para ello escoge de la tabla1: IndexDef y crea un nuevo
ndice para el campo nombre y otro para el campo apellidos. Luego asigna el indexname: Apellidos a la tabla.
Pulsa doble clic en el cuadro Edit1 para abrir el evento Edit1Change:
Escribe el cdigo:

Edit1Change
Tabla1.setRangeStart;
Tabla1.FieldByName('Apellidos').AsString:=Edit1.Text;
Tabla1.Applyrange;


Procedures:

CreateForm(asignalatableentiempodeejecucin)
Table1.tablename:=Agenda.dbf//paraDBF
oTabla1.filename:=Agenda.xml//paraXML visibleClick:
ifvisible.CheckedthenForm1.FormStyle:=
Application.OnHint:=muestrahints; fsStayOnTop
elseForm1.FormStyle:=fsNormal;

end;
Edit1Change
Tabla1.SetrangeStart; Tranparenteclick:
Tabla1.FieldByName('Apellidos').AsString:=Edit1.Text; iftranparente.Checkedthen
Tabla1.Applyrange; Form1 alphablend:=true;
//=>Mostrarinfomacinenbarradeestado:

Salir1Click Proceduremuestrahints
Close;
Barraestado.Caption:=Application.Hint;

Variantesalejercicio:
Ordenarlatabla:
SitienesinstaladosloscomponentesJVCLpuedescambiareldbgridporunJVultimdbgridquetepermiteordernarla
tablaalpulsarenelencabezadodelcampo.
Crearaccesoconpassword.
AadeunaventanatipoPaswordquepidalaclaveantesdeentrar:
FileNewOther(DelphifilesoDialogs)Passworddialog
En(ProjectOptionsAutocreateforms):Cambiarelordenparaquesemuestre
primerolaventanadePasswordantesquelaprincipal(main).
Silarespuestaescorrecta,habilitarelbotnOKquemostrarlaventanaprincipalForm1.
Opcin1:Aadirlaunit1delaventanaprincipalalalistadeusesdelpasswordyllamarlaconform1.show
Opcin2:



PasswordChange:

IfPassword.text=ofimegathenOkbtn.enabled:=true;
Okbtnclick:
//>Opcin1
Application.CreateForm(Tform1,form1);

//>Opcin2:
form1.Show;//>muestralaventanaform1
hide;//>ocultalaventanaatual

Acceso login usuario Acceso a tablas Access con Firedac

Crear la Tabla: Entra en Access y crea una base de datos con una tabla
llamada Acceso que contenga los campos de la imagen:

Componentes: Crea en Delphi un nuevo proyecto y aade los


componentes de la imagen.
En FDConeccion1 pulsa doble clic y especifica el driver: MsAcces y
la ruta donde has guardado la base de datos que debe ser la misma
del ejecutable. Luego cambia Conected: True

El DataSource1 asignar su dataset a: Table1


El Table1: Asigna su Tablename = acceso y Active=True

Complementos: Para realizar las pruebas y comparaciones puedes aadir al formulario un DBNavigator y un DBGRid
ambos conectados con el Datasource1

Mtodo de bsqueda de usuario por el ndice: Mtodo de bsqueda secuencial:


procedureTForm1.BitBtn1Click(Sender:TObject); procedureTForm1.BitBtn1Click(Sender:TObject);
var var
encontrado:string; encontrado:Boolean;
begin opciones:TLocateOptions;
Table1.IndexFieldNames:='Usuario'; begin
Table1.SetKey; opciones:=[LOCaseInsensitive];
Table1.FieldByName('Usuario').AsString:= encontrado:=FDTable2.Locate('Usuario',
EUsuario.Text; EUsuario.Text,opciones);
ifTable1.GotoKeythen ifencontrado=falsethen
begin showmessage('Usuarioincorrectooinexistente')
ShowMessage('Encontradoa'+TUsuario.Value); else
ifTClave.value=Eclave.Textthen begin
ShowMessage('Clavecorrecta') showmessage('Muybien!hasencontradoa'+
elseShowMessage('ClaveIncorrecta'); FDTable2Usuario.value+'ysuclaveesla'
end +FDTable2Clave.value);
else end;
ShowMessage('Usuarionoencontrado'); end;
end;

Mtodo para crear nuevo usuario:

procedure TForm1.BNuevoUsuClick(Sender: TObject);


var
encontrado: Boolean;
opciones:TLocateOptions; else
begin begin
opciones:= [LOCaseInsensitive]; TableAcceso.Append;
if NUsuario.Text='' then showmessage('No puede estar vacio') else TableAccesoUsuario.value:=NUsuario.text;
begin TableAccesoClave.value:=NClave1.Text;
if NClave1.Text=NClave2.Text then end;
begin end
encontrado:= TableAcceso.Locate('Usuario', NUsuario.Text, else
opciones); begin
if encontrado=true then showmessage('No coinciden las claves');
showmessage('Ya existe un uauario con el mismo nombre') end;
end;
end;

Ejercicio nivel de acceso.


Seleccionar el tipo de acceso segn el nivel de permiso:
Una vez encontrado el usuario y contrasea leer el permiso y si es nivel 0 muestre un label en la ventana con la
infomacin: Modo Usuario + nombre pero si es el nivel de permiso 1 muestre: Has entrado como adminitrador +
nombre.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg51
Aplicacin tetst de preguntas y respuestas TestWin Acceso a tablas Access con Firedac
Utilizaelapartadoanteriorparainiciarsesinenla
aplicacinenmodousuariooadministrador.
Enelformulariopondremosunaimagenalineadaal
topcomoencabezadodeventanayunpagecontrol,
alineadoalClient,alqueleaadiremostrespestaas
otabsSheetsconlosnombres:sesin,frontaly
trasera.

Accesoadatos.
DesdeAccesscreamoslabasededatosTestwincon3tablas:Acceso,
PreguntasyTemasylossiguientescampos:
Acceso:UsuarioClavePermiso
Temas:IDTema
Preguntas:Tema,Dificultatd,T1,R1,R2,R3$4,Sol,Comen,
Imagen

PginaSesin
Enelformulario,aadimoslosobjetos
dedatosdelaimagen.

Cadadatasourceenlazaconsu respectivaTFDtableyenellas,
cadaTablenameconlastablasdela basededatos.

Pestaadeacceso:
Aadimosdosgropubox
Destinadoainiciarsesindeusuarioocrear
nuevousuario.
Encadaunodeellosinsertamosdoscuadros
detexto(edits)ydosbotones(buttons)como
enlafigura.
Elsegundogroupbox,seestablecevisible=
false.
AlpulsarelbotnBNuevodelprimer
groupbox1semostrarelsegundoyocultar
elprimero:
procedureTForm1.BNuevoClick();
begin
GroupBox2.Visible:=True;
GroupBox1.Visible:=False;
end;

Opcional:PuedesaadiralformulariounDBGridyunDBNavigatorno
visulesyvinculadosalatabladeAccesoparacrearycomprobaralos
usuarios.

AadimosunnuevoGroupBox3quecontendrunLookupComboBox procedureTForm1.BAccesoClick(Sender:TObject);
llamadoFiltrotema,parala var
encontrado:Boolean;
seleccindeltemayun
opciones:TLocateOptions;
LabelUsuarioqueinformar begin
delnombredelusuario. opciones:=[LOCaseInsensitive];
encontrado:=TableAcceso.Locate('Usuario',
EUsuario.Text,opciones);
ifencontrado=falsethen
showmessage('Usuarioincorrectooinexistente')
else
begin

GroupBox1.Visible:=False;
AlpulsarelbotnparaaccederBacceso,compuebaconlafuncin GroupBox2.Visible:=False;
Locatesielusuarioexisteenlatabla.Encasoafirmativo,muestrael GroupBox3.Visible:=True;
GroupBox3paraescogereltema.Unavezescogidoeltema,alpulsarel LabelUsuario.caption:=
botndeIniciar,activaremoslasegundapginadelpagecontrol: TableAccesoUsuario.value;
end;
procedureTForm1.BInicioTemaClickPagecontrol.ActivePageIndex:=1;

Pginatrasera
Eslapginadeadministracindepreguntasyseaccedeaellaconprivilegiosdeadmninistrador.Enellapodemoscreary
modificarpreguntas.Aadimosloscontrolesconlosnombresquesemuestranenlaimagen:



Paracargarlaimagen:Aadirantesunelementodedilogo:OpenPictureDialog
o Alpulsarelelbotnpegar:DBIma1.PasteFromClipboard;
o AlpulsarenelbotnAbrir:ifOpenPictureDialog1.Execute()then
dbIma1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
ParaModificarTemas:AlpulsarelBotnModificarTemas:GroupboxTemas.visible:=true;

Pginafrontal
Enlapestaafrontal,aadirloscontrolesconlosnombresquesemuestranenlaimagen:

Creamoslasvariablespblicas:
aciertos,preguntas:integer;//>numricasenteras
media:single; //>decimalesdeprecisinsencilla

Aadimosloseventossiguientes:
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg53

Alpulsar(OnClick)enelbotnBsiguiente:
R1.font.color:=clblack; //<cambiocolores>
R2.font.color:=clblack; Ifletra='A'THENR1.font.color:=clred
R3.font.color:=clblack; elseifletra='B'THENR2.font.color:=clred
R4.font.color:=clblack; elseifletra='C'THENR3.font.color:=clred
labelcorrecto.visible:=false; elseifletra='D'THENR4.font.color:=clred;
labelincorrecto.visible:=false; end;
DBTextcomen.visible:=false; DBTextcomen.visible:=true;
Labelpregunta.caption:='Preguntanmero'+inttostr(preguntas+1) labelsiguiente.Caption:='Pulsasiguientepregunta';
+'de'+inttostr(TablePreguntas.RecordCount); labelsiguiente.visible:=true;
labelsiguiente.caption:='Hazclicsobreelcrculodelarespuesta labelelige.visible:=false;
correcta...'; Bsiguiente.enabled:=true;
labelelige.visible:=true; preguntas:=preguntas+1;
RadioRespuestas.itemindex:=1; labelpreguntas.caption:=inttostr(preguntas);
Bsiguiente.enabled:=false; media:=round(aciertos*10/preguntas);
//StatusBar1.Panels[0].Text:='Ndepregunta:' labelmedia.caption:=floattostr(media);
+inttostr(TablePreguntas.recno); progreso.progress:=preguntas;
RadioRespuestas.Enabled:=True; progreso2.progress:=aciertos;
RadioRespuestas.Hint:='Elige'; Ifletra='A'THENR1.color:=clwhite
TablePreguntas.Next; elseifletra='B'THENR2.color:=clwhite
StatusBar1.Panels[0].Text:='Ndepregunta:' elseifletra='C'THENR3.color:=clwhite
+inttostr(TablePreguntas.recno); elseifletra='D'THENR4.color:=clwhite;
imagenBien.picture.loadfromfile('DRAC.BMP'); if(preguntas=TablePreguntas.RecordCount)then//finde
StatusBar1.Panels[0].Text:='Ndepregunta:' preguntas
+inttostr(TablePreguntas.recno); begin
ifaciertos=preguntasthenLabelsiguiente.Caption:='Enhora
buena,hasobtenidolamximapuntuacin!!'+Labelmedia.caption
Alpulsar(OnClick)en RadioRespuestas:
else
var Labelsiguiente.Caption:='Findepreguntasdeltema.Hasobtenido
letra:string; un'+Labelmedia.caption;
begin MessageDlg(Labelsiguiente.Caption,mtInformation,[mbOk],0);
Binicio.Enabled:=true; Bsiguiente.enabled:=false;
ifBsiguiente.enabled=falsethen BInicio.Enabled:=true;
begin end;
caseRadioRespuestas.itemindexof Labeltotal.caption:=inttostr(TablePreguntas.RecordCount);
0:letra:='A'; end;
1:letra:='B';
2:letra:='C';
Alpulsar(OnClick)en elbotnBInicio:
3:letra:='D';
end; TablePreguntas.First;
RadioRespuestas.Enabled:=false; RadioRespuestas.Enabled:=true;
RadioRespuestas.Hint:=''; Bsiguiente.Enabled:=false;
ifletra=TablePreguntasSOL.valuethen progreso.progress:=0;
begin progreso2.progress:=0;
labelcorrecto.caption:='!Correcto!,esla progreso.MaxValue:=TablePreguntas.RecordCount;
'+TablePreguntasSOL.value; progreso2.MaxValue:=TablePreguntas.RecordCount;
labelcorrecto.visible:=true; aciertos:=0;
labelincorrecto.visible:=false; preguntas:=0;
aciertos:=aciertos+1; Labelmedia.Caption:='0';
labelaciertos.caption:=inttostr(aciertos); labelaciertos.Caption:='0';
imagenBien.picture.loadfromfile('DRACBIEN.BMP'); Labelpreguntas.Caption:='0';
//<cambiocolores> Labelsiguiente.visible:=true;
Ifletra='A'THENR1.font.color:=clblue Labelsiguiente.Caption:='Iniciodeltema'+filtro.text+'.Clicsobre
elseifletra='B'THENR2.font.color:=clblue elcrculodelarespuestacorrecta...';
elseifletra='C'THENR3.font.color:=clblue RadioRespuestas.itemindex:=1;
elseifletra='D'THENR4.font.color:=clblue; StatusBar1.Panels[0].Text:='Ndepregunta:'
end +inttostr(Table1.recno);
else R1.font.color:=clblack;
begin R2.font.color:=clblack;
labelincorrecto.caption:='Incorrecto,lasolucinnoerala'+ R3.font.color:=clblack;
letra+'sinola'+TablePreguntasSOL.value; R4.font.color:=clblack;
labelcorrecto.visible:=false; DBTextcomen.Visible:=false;
labelincorrecto.visible:=true; Labelincorrecto.Visible:=false;
imagenBien.picture.loadfromfile('DRACMAL.BMP'); Labelcorrecto.Visible:=false;
letra:=TablePreguntasSOL.value; imagenBien.picture.loadfromfile('DRAC.BMP');
Labelpregunta.caption:='Pregunta:';

Grfico de datos (probado en versiones Delphi 7 y Delphi XE7)


Ingredientes:
Crear una tabla:
a. DBF con Delphi 7: Escogedelmen:ToolsDatabasedesktopconloscampos:Nombre
(decarcterotexto)yValor(numricoentero)guardarlatabladedatosconelnombre:
Datos.dbfLuegoAadirloscomponentesTableydatasourcealformularioyasignaralatableeltablename:Datos.dbfy
alDatasourceeldataset:table1
b. XML con XE7: EnelformularioprincipaldeDelphi,aadirloscomponentes
ClientDatasetyunDatasource(PaletaDataAccess).Pulsarelbotnderecho
sobreelcomponenteClientDatasetyescogerdeFieldseditorNewfield.con
loscampos:Nombre(decarcterotexto)yValor(numricoentero).Botn
derechosobreelcomponenteClientDatasetyescogerCreatedatasetSaveto
mybasexmltabledatos.xml

Formulario: EnlapaletaDataControls,aadiralformulariounDbgrid,yensupropiedaddatasource:ponerdatasource1.
Aadir el grfico:
Delphi7:DelapaletaDatacontrols,aadiruncomponente:DBChart.
DelphiXE7:Delapaleta:TeeChartLit,aadirunTDBChart
Pulsardobleclicyenlasolapaseriesponercomoenlafigura.
EnlasolapaChart,Aadirlaserie1(Add)tipoBarcomoenfigura.
EnlapestaaDatasource:SeleccionarDatasetyelegirelDatasetdenuestratabladedatos.

Aadir un botn para calcular


Aadirunbotnalformularioparacalcularlasumadevalores.Alpulsarsegeneraelevento:
Coccin:

procedureTForm1.calcula1Click(Sender:TObject); ifTable1.RecordCount<1thenshowmessage('Introduzca
var valoresenlatablaparacalcular')else
suma,xmax,xmin,media:single; begin
antes:single; media:=suma/Table1.RecordCount;
begin table1.refresh;
suma:=0; table1.Edit;
dessuma:=0; table1.First;
varsuma:=0; table1.DisableControls;//>ojo
table1.First; whilenottable1.eofdo
antes:=table1valor.value; begin
whilenottable1.eofdo table2.edit;
begin table2porciento.Value:=roundto((table2valor.value/sum
xmax:=max(table1valor.value,antes); a)*100,2);
suma:=suma+table2valor.value; table2.Next;
table1.Next; end;
antes:=table1valor.value;
end;

Ejercicio propuesto1: AadiruncampocalculadoalatablaDecilycuartil.Enelevento:OnCalcFieldsdelatabla


escribir: Table1Decil.value:=table1porciento.Value/10;
Table1Cuartil.value:=table1porciento.Value/25;
Ejercicio propuesto2: 2:AadiruncomponenteWebBrowser:EnelForm1.Oncreate:
dire:=ExtractFilePath(ParamStr(0));WebBrowser1.Navigate('file://'+dire+'estadistica.htm');
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg55
PROGRAMA DE RECETAS DE COCINA PARA DELPHI. (Uso de Datos y los TabsSheets)
PreparaunacarpetallamadaRecetas.
ParaDBFMDB:CrearunarchivoDBF(DataBaseFile)oMDB(Access)conlaestructuradelaimagen,conunndice
indexadoporelcampoTituloyguardalatablaconelnombre:RECETASenlacarpetaRecetas.
ParaXML:
Aadeelcomponente
ClientDatasetyconel
botnderechoagregalos
camposdelaimagen.
CreaelDatasetygurardala
Databaseconelnombre:
RECETAS.XMLenlacarpeta
Recetas
Crealosndicesella
propiedad:Indexdef

Aadirunnuevoformulariosloparadatos(Mdulodedatos)delmen:NewFormDatamodule.LlamadoDM
AadiraldatamoduleDM,loscomponetes:Table1(oClientDatasetconelnombreTable1)yel
componeteDatasource1cambiandosupropiedadDataset:Table1
Asignaralatable1lapropiedad(TableNameoFileName)nombredel
archivoRecetasdbforecetas.xmlsegnlabasededatos.
EnmodoDBF:aadiralaTable1todosloscampos(botnderecho)
Enelformularioprincipal(FileProjectmanajerForm1)asignarla
propiedadName:Receta.
Modificarelformulariocomoenlafigurainferior:
Enlaadir:
- UnaToolbaryunaStatusbar(Win32)
- Unpanelalineadoaladerechaconun
Splitter(Additional)asuizquierda.
- UnPagecontrol (win32)ala
izquierdaalineadoalcliente.
SobreelPagecontrol1,pulsarelbotn
derechodelmouseyescoger:New
pageycrear9solapas(TabSheets).
Asignaralapropiedadcaptiondecada
TabSheetlosnombresquese
muestran:
Entrantes,Vegetales,Pastas,carnes,
etc
Encadapestaa,aadirlos
componentes:3dbedits,1
DBcomboboxy2dbmemoscomoenla
figuraizquierda.
Enelpanelderechoaadirun
componenteDBgridAlignalcliente.
AsignarlaspropiedadesparacadacomponenteDB,elDatasource:Datasource1yelDatafiledelcampoquele
corresponda.
Enlabarradeherramientastoolbarconelbotnderechocrear3nuevosbotonesyaadirunDBNavigator.


CODIGOFUENTEdelprogramaderecetas:
var
Receta:TReceta;//>nombredelaventanaoformulario
varfiltro:string;//>variabledetexto procedure
TReceta.TabSheet9Enter(Sender
procedureTReceta.PageControlChange(Sender:TObject); begin
contar('recetas');
begin
DM.table1.filtered:=true;
procedure
Edit1.text:=''; TReceta.PageControl1Enter(Sender
DM.Table1.CancelRange; begin
ifPageControl1.activepage=tabsheet1thenFiltro:='''Entrantes''';; contar('Recetas');
ifPageControl1.activepage=tabsheet2thenFiltro:='''Vegetales''';
ifPageControl1.activepage=tabsheet3thenFiltro:='''Carnes'''; procedure TReceta.contar(Sender:string);
ifPageControl1.activepage=tabsheet4thenFiltro:='''Pescados'''; begin
ifPageControl1.activepage=tabsheet5thenFiltro:='''Mariscos'''; Receta.StatusBar1.panels[1].text:=sender+ ':
ifPageControl1.activepage=tabsheet6thenFiltro:='''Varios'''; ' + inttostr(dm.Table1.RecordCount);
ifPageControl1.activepage=tabsheet7thenFiltro:='''Postres'''; end;
ifPageControl1.activepage=tabsheet8thenFiltro:='''Pastas''';
ifPageControl1.activepage=tabsheet9then
Begin
DM.table1.filtered:=False; procedure TReceta.Edit1Change(Sender
Filtro:='''Completo'''; Var
Campobusca: string;
end;
begin
DM.table1.filter:='Tipo='+Filtro;
Campobusca := 'TITULO';
Panellistado.caption:='Listado'+filtro;
DM.table1.SetRangeStart;
contar('Recetas'); DM.Table1.FieldByName(Campobusca).AsString:=Edit1.Tex
end; t;
DM.Table1.ApplyRange;
procedurecontar(Sender:TObject);
begin
Receta.StatusBar1.panels[1].text:=inttostr(dm.Table1.RecordCount);
end;

procedureTReceta.SpeedButton1Click(Sender:TObject);
begin
ifMessageDlg('Nuevareceta?',mtConfirmation,[mbYes,mbNo],0)=id_Yesthen
begin
DM.table1.insert;
ifPageControl1.activepage=tabsheet1thenDM.Table1TIPO.value:='Entrantes';
ifPageControl1.activepage=tabsheet2thenDM.Table1tipo.value:='Vegetales';
ifPageControl1.activepage=tabsheet3thenDM.Table1tipo.value:='Carnes';
ifPageControl1.activepage=tabsheet4thenDM.Table1tipo.value:='Pescados';
ifPageControl1.activepage=tabsheet5thenDM.Table1tipo.value:='Mariscos';
ifPageControl1.activepage=tabsheet6thenDM.Table1tipo.value:='Varios';
ifPageControl1.activepage=tabsheet7thenDM.Table1tipo.value:='Postres';
ifPageControl1.activepage=tabsheet8thenDM.Table1tipo.value:='Pastas';
DM.Table1TITULO.value:='';
end;
end;

procedureTReceta.SpeedButton2Click(Sender:TObject);
begin
ifMessageDlg('Borrarreceta?',mtConfirmation,[mbYes,mbNo],0)=id_YesthenDM.table1.delete;
end;

Impresin:
Imprimirelformulario(ventana):Aadircomponente:PrintdialogdelapaletaDialogsyenelbotnimprimirescribirel
cdigo:ifPrintDialog1.executethenprint;
Imprimirinformededatos:UtilizareldiseadordeinformesRavereportoQreportexplicadosenelsiguientetema.

Guardaelproyectoconelnombre:Recetas(tambinlaventana/unidadrecetas1ylaventana/datamoduledm)
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg57
INFORMES de impresin de datos (reports)
a) Crear un informe con RaveReports

Aadir al programa de rectas, los componetes:


RVDataSetConnection y RvProject
Con las propiedades de la figura->
En el botn para imprimir, aadir:
DM.TABLE1.refresh;
RvProject1.execute;
Pulsa doble clic sobre el objeto RvProject para abrir el
programa generador de informes: Rave Report.

Pulsa el botn: New data Object, escoge: Direct data View


Puedes aadir las regiones, bandas y componentes Datatext de la figura, y que
se encuentran en la paleta: Report.
Recuerda especificar la propiedad Datafield a cada DataText.

Guarda al finalizar el informe con el nombre: Project1.rav en la misma carpeta


donde tienes tu proyecto de Delphi.
b) Crear un Informe con FastReport .
Incorporado desde la versin XE7. Tan sencillo como soltar en el formulario el componente fxreport1 y un
DataReport. Pulsar doble clic encima del Fxreport1 para disear el informe. Elegir del men: Report Data
para escoger el dataset de datos.

Truco: Cambiar el formulario de vista previa a espaol: Busca en la carpeta: Rave5\Lib los formularios:
RPFormPreview.FRM y RPFormSetup.FRM y brelos desde Delphi.
Opcional: Puedes aadir tambin un componente: RVSystem al formulario de recetas y que enlazar
con la propiedad Engine del objeto RaveReport. Este componente te permitir especificar los
parmetros de impresin y vista previa deseados.

c) Crear un Informe con QReport.


Otra opcin es instalar el paquete Qreport. En Delphi 7 con la opcin: Component Install Packages
Add y buscar en la carpeta: DELPHI\BIN: DCLQRT70.BPL o descargar de http://www.quickreport.co.uk/
Crea un formulario nuevo (New form) y sueltas en el el componente de la paleta Qreport: QuickRep
Dentro de este, pon dos QRBand y cambia el tipo de banda a: Page header y Detail respectivamente.
Suelta en estas bandas los objetos: QRLabel y QrDBText.
Para ejcutarlo escribe el cdigo:

if(Application.MessageBox('Imprimir esta receta?', 'Imprimir registro - Print', MB_YESNO) = IDYES)


then Informe.QuickReport1.Print; //-> Informe.QuickReport1.Preview //-> para vista previa

Truco: Para cambiar la ventana a espaol, abre el formulario: QRPrev.DFM en la carpeta: DELPHI\LIB
LENGUAJE SQL EN DELPHI
Manipulacin de Datos mediante lenguaje SQL: SELECT, INSERT, UPDATE, DELETE

SELECT: Extrae datos de una o ms tablas indicando los campos (o columnas) separados por comas.
El asterisco (*) sustituye a todos los campos

Sintaxis (frmula): Ejemplo:


SELECT {Campo1 AS NombreCampo1, SELECT * FROM CLIENTES
Campo2, ...CampoN } WHERE CIUDAD = "MEXICO" AND ESTADO = "DF"
FROM {Tabla/Vista}
[ WHERE {Condicin} ]
[ LEFT JOIN OtraTabla ] SELECT
FACTURAS.FACNO,
FACTURAS.NOMBRECLIENTE,
FROM: Especifica la tabla o tablas (separadas por FACTURAS.CIUDAD
comas) de la cual se extraen los datos. ARTI.NUMARTI,
JOIN: Junta varias tablas a travs del campo indice, que ARTI.DESCRIPCION,
existe en las dos tablas. ARTI.PRECIO,
FROMFACTURASLEFTJOINARTIONFACTURAS.FACNO
WHERE: Filtra los registros que cumplan el criterio de =ARTI.FACNO
condicin. Estos pueden utilizar los operdadores de
WHERE FACTURA FACNO = 1
comparacin ( =, <, > ... ) o predicados adicionales IN,
ANY, ALL, EXISTS.
SELECT * FROM PARTS WHERE PART NO > 543
ORDER BY: La clusula Order by especifica el rden de exctraccin.
SELECT * FROM PARTS ORDER BY PART NAME ASC
GROUP BY: Especifica cmo se agrupan las filas o registros.
UNION: Combina el resultado de dos o ms SELECTS para convertirla en una sola tabla. (JOIN)

INSERT: Aade un registro a la tabla APPEND Inserta el registro al final de la tabla:


Insert permite aadir datos al mismo tiempo mediante
dos mtodos: INSERT INTO FACTURAS
1.- Aade una fila (registro) a la tabla asignando ( FACNO, NOMBRECLIENTE, CIUDAD, ESTADO )
valores a dos columnas: VALUES ( 99, 'Winston Churchill', 'Londres', 'La Mera Capital' )

2.- Especifica valores a insertar mediante el INSERT INTO FACTURARENGLON


estado SELECT: ( FACNO, NOMBRECLIENTE, CIUDAD, ESTADO )
este INSERT se combina con otro SELECT para SELECT 99, ITEMNO, DESCRIPTION, PRECIO_USD FROM
copiar los renglones de la factura nmero dos y FACTURARENGLON WHERE FACNO = 2
ponerlos en la factura nmero 99.

UPDATE: Modifica datos de la tabla. Ej: UPDATE GOODS SET CITY = 'SANTA CRUZ' WHERE GOODS.CITY = 'SCOTTS
VALLEY'
DELETE: Borra datos de la tabla. Ej: DELETE FROM GOODS WHERE PART_NO = 'AA0093'

Funciones agregadas a SQL


SUM(), Total SUM( Field * 10 )
AVG(), Promedio de valores no nulos SUM( Field ) * 10
MIN(), mnimo valor SUM( Field1 + Field2 )
MAX(), mximo valor
COUNT(), cuenta el n de valores segn un criterio.
De fecha: Pemite extraer de una fecha: YEAR, MONTH, DAY, HOUR, MINUTE y SECOND

Substitucin de variables:
En Delphi, cuando se aade una palabra precedida por un signo de dos puntos (:), la palabra es
automticamente convertida en un parmetro, el cual es agregado a la propiedad: Params
SELECT * FROM "CLIENTS.DBF" CLIENTES WHERE Last_Name LIKE :Apellido
LIKE: devuelve todos los registros que se parezcan a la cadena. La lnea que asigna el parmetro aade un
signo de porcentaje (%) al final:
qryClientes.ParamByName('Apellido').AsString := dlgConsulta.edtApellido.Text+'%';
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg59
Ejercicio de consulta de datos con SQL
Crea una aplicacin nueva en Delphi. File New Aplication.
De la pestaa Data Access y DBE, inserta los componentes: Query y DataSource que representan las
partes "no visuales" del acceso a base de datos.
Ahora, vaya al TQuery y cambie la propiedad "Databasename" a Dbdemos, que es un alias local que apunta
al directorio de Demos de Delphi.
Selecciona el Datasource. En la propiedad Dataset, selecciona: Query1
Selecciona el Query1, haz doble-click en su propiedad: SQL Escribe lo siguiente:
SELECT * from animals where upper(NAME) like :nombre order by NAME
Obseva que :nombre es un parmetro. En la propiedad Params pulsa doble clic y pon su Datatype a string
A continuacin, vaya a la propiedad "RequestLive" de su Query y pngala en "True". Esto es importante
porque SQL siempre devuelve resultados "Read-Only", o "muertos" (dead) a menos que especifiquemos que
nuestro query debe ser "vivo" (live)
Haz doble-click en el query1. A continuacin vers una ventana vaca. Haz click con el boton derecho del
mouse y selecciona: "Add Fields". Nos aparece la lista de las "columnas" (campos) disponibles. As que
simplemente presiona {Enter} para aceptar el aadir todos los campos.
Arrastra" desde la lista de campos del query1, hasta el formulario. Cuando "sueltes" cada campo, Delphi
crear un componente TLabel y un DbEdit, listos para recibir los datos adecuados. Conecta todos los
DBedits con la propiedad Datasource al Datasource1. A asignar su datafield al campo correspondiente.
Para ver los datos vamos a abrir el query1 (active = true).

Groupbox

Edit1

Dbedit

Completamos el formulario con los objetos begin


que se muestran en la figura. query1.active:=false;
En la propiedad Params del Query 1 le Query1.Params[0].Value := UpperCase(edit1.Text)+'%';
aadimos el valor: % para que por defecto query1.active:=true;
aparezcan todos. end;
En el botn Filtrar, aadimos el
cdigo:
En el botn Todos, escribimos:
query1.active:=false;
Query1.Params[0].Value := '%';
query1.active:=true;
Notas:
Upper en el SQL y Uppercase en el procedure, convierten ambos a
maysculas para que no haya distincin entre maysculas y minsculas.
El botn de radio: Edicin, cambia la propiedad del query1: RequestLive a
true.
Los botones aadir y borrar aadir el cdigo: Query1.Append; y
Query1.Delete; respectivamente.
Para consultar por rea, aadir otro query2 con este campo como parmetro
en el SQL. Con el mismo datasource, cambiar de uno a otro, segn se active
uno u otro botn de radio.
Programa facturacin Pasos bsicos.
1. Crear las tablas:
2. Crear un nuevo form (New Form) Datamodule1, con el nombre: DM.
3. Insertar el el DM las tablas para Facturas y artculos: Table_facturas y table_articulos, asignarles los
indexnames creados y aadir dos datasources: Datasource_facturas y Datasource_articulos.
4. Aadir: All fileds al la table facturas y artculos.

5. Seleccionar todos
los campos de
tablefacturas y
soltar sobre el
form principal
llamado:
Facturacin

6. Crear un DBgrid
con Align al
bottom y asignarle
la datasource de
articulos.
Luego aadir
todos los
campos al
dBGrid de
artculos.

7. Para
relacionar
facturas con
artculos
debemos
volver al DM y
elegir en
mastersource
de artculos el
Datasource
de facturas.
Luego, en el
MasterFields, relacionar los campos NUM_Fact de cada tabla. Activar ambas tablas (active=true) para ver el
funcionamiento.
8. Aadir en el form principal un DBNavigator para las facturas.
9. Crear el campos calculados:
Asignar a un campo existente un calculado: Para el importe: En la table_articulos poner en el evento:
onCalcfileds: Table_articulosimporte.Value:=Table_articuloscant.Value*Table_articulosprecio.Value;
Luego poner en el campo Importe su propiedad: FieldKind: fkCalculated

Crear un campo
calculado nuevo:
llamado PVP (como
referencia):
En la table_articulos
anadir un New
field del tipo: Flota y
calculado.

Aadir al evento: On
CalcFileds: Table_articulosPVP.Value:=Table_articulosprecio.Value*(1+Table_facturasiva.Value/100);

10. Crear un botn: Calcular para calcular la base imponible.


Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg61
Procedure TForm1.Calcular1Click(Sender: TObject);
var
baseimpo:double; //>variabletemporaldebaseimponible
num_rec:pointer; //>punteroderegistro
begin
withdmdo
begin
table_articulos.disablecontrols; //>evitacambiarregistroelusuario
num_rec:=table_articulos.GetBookmark; //>cogenumderegistro
table_articulos.first; //>sitaelpunteroderegistrosalprincipiodelatabla
whilenottable_articulos.eofdo {mientrasnollegealEndOfFile...(finaldelatabla)hazelbucle}
begin
baseimpo:=baseimpo+table_articulosimporte.AsFloat; {sumalacantidadanterior}
table_articulos.next; {saltaalsiguientecampo}
end; {repiteelbucle}
table_articulos.enablecontrols;
table_facturas.Edit;
Table_facturasBASE_IMPO.Value:=baseimpo;
Table_facturasIMP_IVA.Value:=baseimpo*table_facturasiva.value/100; //>importedelIVA
Table_facturasTOTAL.Value:=baseimpo*(1+table_facturasiva.value/100); //>Totalfactura
table_facturas.post;
table_articulos.GotoBookmark(num_rec); //>vuelvealregistroqueestaba
end;
end;

Clculo automtico: Por ltimo, para calcular automtico, aadir al evento del la table_articulos: AfterPost:
Table_articulosAfterPost: Form1. Calcular1Click(nil); // llama al procedure sin sender

Mejoras:
Aadir el componente DBCombobox al % de IVA con los items: 0,7,12,16. En el campo IVA del DataModule
cambiar su DefaultExpression = 16.
Para autoincrementar el nmero de factura: Como no existe del tipo Autonumerico en Dbase, no vale con cambiar
el Autogeneratevalue a AutoInc sino escribir el cdigo:
Var pblica en el Data module: Numero:single:
Table_facturasBeforeInsert: Table_facturas.last;
Numero:=Table_facturasNUM_FACT.value;
Table_facturasAfterInsert: Table_facturasNUM_FACT.value:=numero+1;

Control de registros de una base de datos.Navegator manual.

Aadir al formulario los botones: Adelante , atrs primero ltimo, aadir y


borrar.

procedureTForm1.primeroClick(Sender:TObject);
begin
withtable1do
begin
ifsender=primerothenfirst
elseifsender=anteriorthenprior
elseifsender=siguientethennext
elseifsender=ultimothenlast
elseifsender=nuevathen
begin
if(Application.MessageBox('Crearnuevoregistro?','Agregarregistro',MB_YESNO)=IDYES)then
begin
table1.append;//>Inserta
table1.Post;//>Guarda
end;
end
elseifsender=borrarthen
begin
if(Application.MessageBox('Confirmaquedeseaeliminaresteregistro?','Confirmareliminacinderegistro',
MB_YESNO)=IDYES)thendelete;
end;
Table1.Refresh;
StatusBar1.panels[1].text:='Totalregistros:'+inttostr(Table1.RecordCount);
end; Table_facturasFECHA_FACT.value:=date;
NivelAvanzado.ControldeBasededatos.Relacionardostablas(facturacin)

Cmo crear una consulta (Query) SQL para relacionar dos tablas por un campo en comn: VaselenguajeSQL
Pasos previos para el ejercicio: enestemanual
CrearundirectorioC:\FACTU(osimilar)
UtilizarlaherramientaDataBaseDesktopparacrearpreviamentelastablasdebasesdedatos:FACTURA.DBFy
ARTI.DBFcuyocamposmnimossean:
ARTI."REFER",
FACTURA."NUM_FACT", ARTI."DESCRIPCIO",

FACTURA."FECHA_FAC", ARTI."CANT",

FACTURA."COD_CLIENT",
ARTI."DESC",
FACTURA."IVA", ARTI."PRECIO",

ARTI."NUM_FACT",

EstaaccinesautomticaconFileNewDataBaseForm.
EsconvenienteusarundatamoduleparalasDatasourcesylasquerys.
Relacionamoslasfacturasconsusartculosporelcamponum_factcomnalosdos.
Recordarque: Query1NUM_FACT: TFloatField; Name:Table1
Query1 Query2
Ejercicio. Facturacin DataBaseName:c:\factu
TableName:FACTURA.DBF
Table2
DataBaseName:c:\factu
TableName:ARTI.DBF

DataSource2
DataSource1 DataSet:Query2
DataSet:Table1

Campos
Calculados

Nota:Enestaaplicacinesposibleaadirymodificardatosenfactura,peronoenartculos.Paraello OnFormcreate:
esnecesariocrearunbotnparaaadirartculo,queutilizalatable2. Query1.Open;
LasconsultasSQLnopermitenmodificacionesenlatablarelacionadasinotenemosRequestLivea
Query2.Open;
true.Poresotrabajaremosdirectamentesobrelastablasenpginasiguiente.

Lneas SQL para la Query1. : Lneas SQL para la Query2:


Select Select
FACTURA."NUM_FACT", ARTI."REFER",
FACTURA."NUM_PRES", ARTI."DESCRIPCIO",
FACTURA."FECHA_FAC", ARTI."CANT",
FACTURA."COD_CLIENT", ARTI."DESC",
FACTURA."BASE_IMPON", ARTI."PRECIO",
FACTURA."IVA", ARTI."IMPORTE",
FACTURA."TOT_FACT" ARTI."PVP"
From"C:\FACTU\FACTURA.DBF" From"C:\FACTU\ARTI.DBF"AsARTI
AsFACTURA Where"C:\PRG\FACTU\ARTI.DBF"."NUM_FACT"=:"NUM_FACT"
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg63
Mtodo 2: En esta otra ventana se utilizan directamente tres tablas: Facturas Artculos y Clientes.
Botonesdenuevoyborrarartculos:
procedure TFormfactu.nuevoClick -> table2.insert; Table1:Facturas
procedure TFormfactu.borraartClick -> table2.delete; Table2:Artculos
Table3:Clientes
Table4:Empresa
Aadirfactura

Botncalcular

Para realizar la unin necesitamos un campo ndice comn


(NUM_FACT) para las dos tablas, y en la tabla de artculos, la
propiedad master fields (campo ndice maestro) se realiza la
unin de la figura.

Pulsar el botn Add y en Joined Fields (campos de unin)


aparecer:
NUM_FACT->NUM_FACT

Procedureparaaadirunanuevafactura:
AntesDeestosprocedurescrearla
Variablenumero:DOUBLE(deltipoflotante)
1saberculeslaltimafactura

procedureTFormfactu.Table1BeforeInsert
begin
table1.last;
numero:=table1num_fact.value;
Cmoborrarlaltimafactura end;

procedureTFormfactu.EliminarClick
2sumar1alnmerodelaltimafacturay
begin
ponrseloalanueva,tambinprepararlafecha
table1.last;
delafacturaconeldadehoy:
numero:=table1num_fact.value;

ifMessageDlg('Eliminarlafactura'+floattostr(numero)+
procedureTFormfactu.Table1AfterInsert
'?',mtInformation,[mbYes,mbNo],0)=mrYes
begin
thentable1.delete;
table1num_fact.value:=numero+1;
end;
table1fecha_fac.value:=date;
table1iva.value:=16;
estado.caption:='Aadidalafacturanum.'+
procedureTFormfactu.Table1AfterDelete; floattostr(numero);
begin end;
ShowMessage('Eliminadalafacturanum.'+
floattostr(numero));
end;
Ejercicio Facturacin. Cmo crear un campo calculado para el IMPORTE:

Supongamos que tenemos una tabla cuya Table Name sea Articulos.dbf y que posee entre otro el campo CANT (cantidad) y
el campo PRECIO:
Pulsa doble clic encima de la tabla para activar el Fields Editor.
Pulsa el botn derecho encima y elige aadir campos (coge todos). De esta manera se declaran en la unidad PAS todos
los campos y sus tipos.
A continuacin elige New Field. Nuevo campo cuyo nombre ser IMPORT, del tipo FLOAT y CALCULATED.
Termina con OK.
Pulsa doble clic en el evento ONCALCFIELDS de la tabla. Debemos introducir una frmula para el campo.
Presta atencin al nombre que tiene los campos en el apartado TYPE de la unidad PAS y escribe el valor:
Table2IMPORT.VALUE:=Table2CANT.VALUE*Table2PRECIO.VALUE;
Para probar su funcionamiento, puedes crear 3 componentes DBEDIT para la cantidad, precio e importe. Recuerda
poner en la propiedad Paswordchart #0 para obligar a que sea un dato numrico.
Tambin es posible crear campos calculados uniendo campos de texto. Ejemplo:
CustomersCityStateZip.Value := CustomersCity.Value + ', ' + CustomersState.Value + ' ' + CustomersZip.Value;
Campo calculado importe (En la tabla 2 On calcfields)
procedure TFormfactu.Table2CalcFields(DataSet: TDataSet);
begin
table2importe.value:=table2cant.value*table2precio.value;
table2pvp.value:= table2importe.value*(1+table1iva.value/100);
end;

Cmocalcularlabaseimponible:Labaseimponiblenoesuncampocalculado,pueseselresultadodelasumadevarios
camposdevariosregistrosmientrasuncampocalculadoseobtienedeoperarconcamposdeunmismoregistro.

Mtodo 1. Base imponible (suma de varios registros) como consulta SQL


Para ello se debe crear una consulta SQL e incluir las siguientes lneas de comando Strings. (Este mtodo no es
aconsejado en este ejercicio pues las consultas SQL no permiten modificaciones sin RequestLive a true)

SELECT BASE_IMPON FROM FACTURAS


SUM(IMPORTE) FROM ARTICULOS WHERE NUM_FACT=:NUMERO

Mtodo2:BaseimponibleconunbucleWhilequesumeconsecutivamenteyunoaunocadaregistroyloalmacene
enunavariablenumrica.
Comoestemtodoesmslento(peromsflexible)esaconsejablecrearunbotnllamado"Calcular"cuyo
procedimientoalhacerclicseaelsiguiente.
LavisualizacindelabaseimponibledebeserenuncomponenteLabelnoEditpuesesmsfcilyademsnodebe
sermodificable.
procedureTFormfactu.CalcularClick(Sender:TObject);
var
baseimpo:Real;{crealavariablenumricarealdondesealmacenarelresultadodelasuma}
impiva:Real;
begin
baseimpo:=0.0;
impiva:=0.0;
table2.disablecontrols;
table2.first; {sitaelpunteroderegistrosalprincipiodelatabla}
whilenottable2.eofdo {mientrasnollegealEndOfFile...(finaldelatabla)hazelbucle}
begin
baseimpo:=baseimpo+table2importe.AsFloat; {sumalacantidadanteriormsladeestecampo}
table2.next; {saltaalsiguientecampo}
end; {repiteelbucle}
table2.enablecontrols;
impiva:=baseimpo*table1iva.value;
labelbaseimpo.Caption:=Floattostr(baseimpo);
end;
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg65
FichaListadodefacturas.Crearunfiltroentredosfechas.

ChekBox:Filtrar








procedureTFormfactu.FiltrarClick(Sender:TObject);
Crearuncomponentetablayun begin

datasource: iffiltrar.checked=truethen

Aadir2componentesdeltipo begin
DateTimePickers:
Propiedadesdelatabla: table1.active:=false;
Names:InicioyFin
Name:Consulfactu consulfactu.active:=true;

Tablename:Factura.dbf consulfactu.IndexFieldNames:='Fecha_fac';

withconsulfactudo

PropiedadesdelDatasource: begin

Dataset: Consulfactu SetRangeStart;{inicioindice}

FieldByName('Fecha_fac').AsString:=
datetostr(inicio.date);
SetRangeEnd;{finalindice}
FieldByName('Fecha_fac').AsString:=datetostr(fin.date);
ApplyRange;{estableceelrangoalDataset}
end;
Impresindelafactura: end
1. CrearunanuevaventanaQuikReport1 else
begin
2. Aadirlosapartados:QrBand,QrSubdetaillyGroupFooterBand1
{nohayqueponerfiltrar.checked:=false;}
3. Aadirloscomponentes:QRLabelparaetiquetasottulosyQRDbtextparaloscampos
consulfactu.CancelRange;
4. Aplicarunfiltroparaquesloseimprimaunafactura
consulfactu.active:=false;
QrBand.Tipo:Qtdetaill
table1 active:=true;

AlpulsarelbotnImprimir:

procedure
TFormfactu.SpeedButton2Click(Sender:TObject);
var
textofiltro:string;
begin
QrSubdetaill
textofiltro:='num_fact='+floattostr(table1num_fa
ct.value);
table1.filter:=textofiltro;
table1.filtered:=true;
quickreport1.preview;
table1.filtered:=false;
end;


GroupFooterBand1


Porltimo:CrearelprogramadeInstalacin:

ParaelloutilizarelprogramaanexoInstallShieldyseguirlospasosparacreareldiscodeinstalacindelprograma.

RecuerdaquetambindebesaadiralosarchivosdeinstalacinelcontroldeBasededatosDBE

Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg67
Cdigofuentebasedeejemploparaprogramadefacturacin:
unitfactu1;

interface
usesWindows,SysUtils,Classes,Graphics,Forms,Controls,StdCtrls,Buttons,ComCtrls,ExtCtrls,Menus,DBTables,DB,
DBGrids,Mask,DBCtrls,dialogs,math,Grids;

var end;
Formfactu:TFormfactu; table2.last;
numero:double; table2.delete;
baseimpo:Real; end;
table1.enablecontrols;
usesempresa1,CLIENTES,Imprime1,Acerca; table2.enablecontrols;
end;
procedureTFormfactu.FormCreate(Sender:TObject);
begin procedureTFormfactu.nuevoClick(Sender:TObject);
table1.open; begin
table2.open; table2.insert;
table3.open; end;
table4.open;
table1.last; procedureTFormfactu.borraartClick(Sender:TObject);
begin
procedureTFormfactu.Table1AfterInsert table2.delete;
begin end;
table1num_fact.value:=numero+1;
table1fecha_fac.value:=date; procedureTFormfactu.Table2CalcFields
table1iva.value:=16; begin
estado.caption:='Aadidalafacturanum.'+ table2importe.value:=table2cant.value*table2precio.v
floattostr(numero); alue;
end; table2pvp.value:=
table2importe.value*(1+table1iva.value/100);
procedureTFormfactu.Table1BeforeInsert end;
begin
table1.last; procedureTFormfactu.calcula1Click(Sender:TObject);
numero:=table1num_fact.value; var
end; impiva:Real;
totfact:Real;
procedureTFormfactu.Table1AfterDelete toteuros:Real;
begin begin
estado.caption:='Eliminadalafacturanum.'+ baseimpo:=0.0;
floattostr(numero); impiva:=0.0;
ShowMessage('Eliminadalafacturanum.'+ totfact:=0.0;
floattostr(numero)); toteuros:=0.0;
end; table2.disablecontrols;
table2.open;
procedureTFormfactu.EliminarClick(Sender table2.first;
begin whilenottable2.eofdo
table1.last; begin
numero:=table1num_fact.value; baseimpo:=baseimpo+table2importe.AsFloat;
table2.disablecontrols; table2.next;
table1.disablecontrols; end;
ifMessageDlg('Eliminarlafacturan'+ {TFormfactu.Table1CalcFields;}
floattostr(numero)+'?',mtInformation,[mbYes, {table1base_impon.value:=baseimpo;}
mbNo],0)=mrYes table2.enablecontrols;
then impiva:=baseimpo*table1iva.value/100;
begin labelbaseimpo.caption:=Floattostr(baseimpo);
table1.delete; labelimpiva.caption:=Floattostr(impiva);
table2.first; totfact:=baseimpo+impiva;
whilenottable2.eofdo {iftotfact>0thentoteuros:=totfact/table1euro.value;}
begin labeltotal.caption:=Floattostr(totfact);
table2.delete; labeleuros.caption:=Floattostr(toteuros);
table2.next; end;
Filtros y bsquedas en tablas
Bsquedas blandas desde un edit o Dbcombo.
{elEditsellamabuscaylavariableCampobusca:String;}
procedureTFichero.buscaChange(Sender:TObject);
begin
Campobusca:='Apellidos';
table1.SetRangeStart;
Table1.FieldByName(Campobusca).AsString:=busca.Text;
Table1.ApplyRange;
end;
Bsquedas duras
Table1.Open; // abrir la tabla
Table1.SetKey; // Ponemos el DataSet en situacin dsSetKey
Table1.FieldByName('Autor').AsString := 'Borges';// Damos valor al campo
Table1.GotoNearest; // Nos posicionamos en ese valor o el ms cercano
showmessage(table1.FieldbyName('Autor').AsString);
Table1.close;

procedureTForm1.Button1Click(Sender:TObject);
var
temp:integer;
opcion:TLocateOptions;
begin
Table1.Locate('NOMBRE',Edit1.Text,[]);
end;

LosparmetrosdelmtodoLocate(),son;
Locate("Columnadebsqueda","Datoabuscar",[loCaseInsensitive,loPartialKey]);
cuandoopcin=loCaseInsensitiveignoradiferenciaentremaysculasyminsculas
cuandoopcin=loPartialKeyresultadoparcial,ejemplosisebusca"ju"seposesionaenelprimerrenglndonde
esecampoempiececon"ju",ejemploJuan,juvenal,etc.

Contar el nmero de registros:
Se puede utilizar este ejemplo en el ejercicio anterior para calcular el nmero de facturas totales.
numero.caption:=IntToStr(table1.recordcount)+' fichas';

FILTROS EN TABLAS DELPHI


Existendosmanerasdeponerfiltrosocondicionesparaunatabla,ellasson:
1.Interna,EnelcomponenteTable,modificarlaspropiedades:propiedadFilter=condicinypropiedadFiltered=
true
Ejemplosparalatabladeclientes:
ClaveCliente<3,Ciudad<>Tarragona,ClaveCliente>2andCiudad=Tarragona

2,Externa,eselusuarioquienconstruyeelfiltroocondicin,usandouncomponenteEditparaelfiltroyunbotn
deordenes(OK)paraqueseejecuteydesplieguelatablafiltrada,elcdigoendichobotnes;
onclickbutton1()
Table1.Filter=Edit1.Text;
Table1.Filtered=true;
Ejmplo:
procedure TForm1.botonfiltroClick(Sender: TObject);
begin
if botonfiltro.Down=true then
begin
CalcularClick(Sender);
table1.Filter:='PROVINCIA
='+StaticTextaProv.Caption;
table1.Filtered:=true;
end
else table1.Filtered:=false;
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg69

BasedatostipoclienteservidorDelphi:InterbaseFirebirdMysql
EnlugardeusartablaslocalestipoBDomdb,utilizaremosunabasededatosdeltiposervidorcomo
Interbase(osuequivalentegratuitaFirebird):
1. InstalarInterbaseoFirebirdenelPC:https://downloads.embarcadero.com/free/interbase
2. CrearlabasededatosconIBconsoleoconIBExpert
Herramientas visuales de Interbase: IBConsole:
El primer paso para utilizar IBConsole es registrar el servidor Interbase y conectar a servidores locales y
remotos.
Pararegistrarunservidor:seleccionardelmenServer|Register...oCreateloquemostrarlaventana
paraconectarseaunservidorlocaloremoto.
Indicarsielservidoreslocaloremoto.Pordefectoeslocal.Enelcasoquesearemoto,indicarelnombredel
servidoryelprotocoloderedautilizar.SiesTCP/IPsepuedeindicarladireccinIPenlugardelnombre.
Sisequiereregistrarelservidor...
oIndicarunnombredealias.Enelcasodeservidorlocal,elnombreesautomtico.
oIndicarunadescripcinparaelservidor.
oIndicarquelainformacindealiasdebeseralmacenada.
Sisequiereconectaralservidor...
oIndicarelnombredeusuario(SYSDBA)
oIndicarlaclave(masterkey)
LaprimeravezqueentrasaInterbase,elsistematiene
predefinidounusuario
llamadoSYSDBAquetienetodoslosderechosdeaccesoen
Interbase.El
passworddeesteusuarioesinicialmentemasterkey

Paracrearunabasededatos:
Indicarunnombredearchivo.GDB.Seleccionardelmen
Database|CreateDatabaseEscribeelnombreAGENDA
(puedesponerleextensinGDBoIB).Escogeellugardonde
guardar.PulsaOK.
Paraconectarconlabasededatos:
Pulsaelbotnderechosobrelatablayescoge:Connect.
Tepediruserycontra.Rellenarcomoenlafigura:

Paracreardeunatabla
VamosacrearunatabladesdeInteractiveSQL:
EscogedelmendeIBConsole:ToolsInteractiveSQL.
CopiaestecdigoenInteractiveSQLyescogedelmen:
QueryExecute
createtabletelefonos
(nombrevarchar(24)notnullprimarykey,
direccionvarchar(24)notnull,
telefonovarchar(24)notnull)
Sintaxiscreatetable:Enprimerlugarindicamoselnombredelatablayluego,entreparntesisy
separadosporcomas,loscamposquelacomponen.Paracadacampoindicamossunombre,tipode
datoeimposiciones.Todosloscampostienenlasmismasimposicionessalvoelcamponombreque,
ademsdelaimposicinnotnull,tienelaimposicinprimarykey.
Seleccionarloscampos:
EscogedelmendeInteractiveSQL:QueryWizardaadetodosloscamposyescribeunalias.Se
generarunaconsultacomoesta:
selectA."NOMBRE",A."DIRECCION",A."TELEFONO"from"TELEFONOS"A
Escogedelmen:QueryExecute.Semostrarlatabla.
Insertardatosenlatabla:

Insertintotelefonos(nombre,direccion,telefono)
values('Ofimega','CalleBarcelona','977350471')

Recuerdaqueelcamponombrenosepuededuplicarporserprimarykey.
Modificardatos:
Cambiamoseltelefonoconelsiguientecdigo:
Updatetelefonossettelefono=977351777

IBExpert
Esunaherramientagratuitaquesedescargadesdelapginadefirebirdyesuninterfazgraficopara
manipularbasesdedatosytablasdeinternaseyfirebird.
1. Descargarversinpersonaldesde:http://ibexpert.net/ibe/index.php?n=Main.DownloadFree
2. Registrarteparaqueteenvenelpasswordynombredeusuario.
Introducirlosalejecutarelprograma.
3. Crearlabasededatos:
Escogedelmen:DatabaseCreatedatabase
Introduceelnombredeusuario,password,versindelabasededatosy
lugardondeseguarda.Verfigura
4. Conectarlabasededatos.Pulsasobreelnombredelabasededatosdela
listayescoge:Conect.
5. Crearlatabla:PulsaelbotnderchodelmousesobreelelementoTablesy
escoge:Newtable
Escribeelnombredeloscampos,sutipoytamaoenlapestaa:Fields:

6. EscribeelnombredelatablaTELEFONOSenellugarindicadoporlaflechadelaimagen.
7. Rellenardatos:SeleccionalapestaaDatayescribealgunasfilas.

ConexinInterbaseconDelphi:
Enunaaplicacinnueva,aadimosalformulariounDatasource,unDBGridyun
DBNavigatorLuegorelacionamoselDBnavigatoryelDBgribconelDatasource.
DelapaletadecomponentesInternase,aadirunIBDatabaseyunIBtransaction.
ElcomponenteIBdatabasesellamarIBdatabase1yenelcomponenteIBtransactioncambialapropiedad
DefaultdatabaseporIBDatabase1.
EnelcomponenteIBDatabase1cambialapropiedadDatabasepor:
C:\...\AGENDA.GDBAGENDA.IB.SilabaseesdeFirebird:AGENDA.FDB
CambialapropiedadConected=true.TesolicitarenUsernameyelPassword.
Ponereldelaimagenderecha:
Metodo1.ModoDBE:
AadiruncomponenteIBTableycambiarlaspropiedadescomoenlaimagen
derecha.
Metodo2.Sintabla:
AadiruncomponenteIBdatasetqueproveeuneditorSQL.CambiasupropiedadDatabasepornuestraDatabase1ysu
propiedadSelectSQLpor:Select*fromtelefonos.
EsaconsejablecrearundatamodulellamadaDMconexionconloscomponentes:IBDatabase,IBtransactiony
IBdataset.Compila(F9)yguardaelproyectoconelnombre:Agenda.

Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg71


Conexin con Mysql
Vamosahacerunasencillaaplicacinquepermitalaconexinymanipulacindedatos
enunaDBMySQLmedianteODBComediantedriverdirectoporejemploZeosDBO.
UtilizandoXamppoWampp,ydesdephpMyAdmin,debesdebeshabercreadoantesla
basededatosMysqlentupcusando:localhostcomoservidordeprueba.
Mtodo1:MedianteODBC:
Esuncontroladordelsistemaoperativoquepermitelaconexinadatosdecualquier
aplicacin.MySQLposeeunpuenteODBC(MyODBC)quepuedeserbajadodelsitioen
formagratuitayvieneconuninstaladordefcilejecucin.Graciasaestedriver
podremosaccederdesdeunclienteWindows,conMSAccessporejemplo,aunservidor
remotoMySQL
Instalarmyodbc:
DescargamosdelapginadeMYSQLhttp://dev.mysql.com/downloadselconectorODBCparaWindows.
UnavezinstaladoelconectorODBCdebemoscrearunnuevoorigendedatosparalaconexin:
ParacrearunOrigendedatosODBC:
DesdeelmenIniciodeWindows:ConfiguracinPaneldeControlHerramientasadministrativasOrgenesde
datos(ODBC)

PulsaenAgregar
IndicaeldriverdeMysqlODBC


Usarcomoconexinlocal:
- Server:Localhost
- User:root
Sincontrasea
Puedesescogerlabasededatos









EntraenDelphiyaadeuncomponenteADOtable.ycambiamos
supropiedadconexinstring.
EnlapropiedaddelADOtable,TableName,indicalaelnombre
delatabla:clientes.

2.CrearelformularioenDelphiparausarODBC.
Enunformulariovacocolocalossiguientescomponentes:
Unpanelconlaalineacin(Align)enTop.
Dentrodelpanelun:DBNavigator
Unbotn:Name:Control,Caption:Abrir
UnbotnTbitBtn:Name:Cerrar,Kind:bkClose,Caption:Cerrar
UnDBGridconalineacin(Align)AllClient
DelapestaaADOodbGo,seleccionaunAdoTableymodifica
lassiguientespropiedades
o Connectionstring:GeneramoslaconexinconeldriverODBCala
conexinquehemoscreadoantes:ConexionMysqlypulsamos
Probraconexin.Debeserexitosa.Enelcatlogoinicialescogela
basededatos.(Edu)Pulsaaceptar.Semostrarlacadena:
Provider=MSDASQL.1;PersistSecurityInfo=False;UserID=root;Data
Source=telefonos
o TableName:telefonos
DelapestaaDataAccessseleccioneelcomponenteDataSource.
AsocieelDataSetconlaTabla
ActualicelosDataSourcedelDBNavigatoryDBGridconelTDataSource.

Paracomprobarquetodoestcorrecto,modificalapropiedadActivedelTTableaTrueyversenelDBGridla
estructuradelaagendacreadaanteriormente.

Paraquelamismaseafuncionaldebesescribir
algodecdigo:

ClicaenelformularioelbotnAbriryeneleditor
decdigoescribelosiguiente:

procedureTForm1.ControlClick(Sender:TObject);
begin procedureTForm1.CerrarClick(Sender:TObject);
IfControl.Caption='Abrir'then begin
begin Tabla.Close;
Control.Caption:='Cerrar'; Halt(0);
Tabla.Open; end;
end
Else
begin
Control.Caption:='Abrir';
Tabla.Close;
end;
end;

Compilaelformularioyejecutalaaplicacin.

Mtodo2:UsarcomponentesZeos
Esunconjuntodecomponentesdedistribucingratuitayposibilitanlaconectividadcondistintasbasesdedatos:
MySQL,PostgresSQL,etc.
InstalacindeZeos:DescargaelpaquetedesdeelsitiodeZeosLibydescomprimeelarchivo.zipCopiadentrodela
carpetaArchivosdeprogramas\BorlandEmbarcadero\Source\Zeoslacarpetadelospakagesconlaversinde
delphiquecorresponda.EjecutaZComponentDesign.dpk
CopialaDLLcorrespondienteasuversindeMySQLqueseencuentraenlacarpetaArchivosde
programas\Borland\Source\Zeos\lib\mysqlalacarpetadeWINDOWS\SYSTEM32
DentrodeDelphi(enenvironementoptions)agregaeldirectorioZeos\packages\delphi7\buildalaopcinLibraryPath
DesdeDelphi,abrelacarpeta:\...\Zeos\packages\delphi7ycompilaelgrupoZEOSDBO.BPGoindividualmente
ZCore.bpl,ZParseSql.bpl,ZPlain.bplyZDbc.bpl
Instalaelcomponente:ZComponentDesign.bplAparecerla
paletadecomponentes:ZeossAccess
CrearelformularioenDelphiparausarZeos.
Comoenelejemploanterior,inicieunnuevoproyectoenDelphiagregandoalformulariotodosloscomponentesdel
ejemploODBCmenoslaTtable.(Panel,DBNavigator,botnAbriryCerrar,DBGrid)

AgregueunZconnectionmodificandolassiguientespropiedades:
Database:agenda
HostName:localhostoelnombredelequipo/direccinIP
User:root(encasodeponerotronombreproveerlaclaveenlapropiedad
Password)
Protocol:EscogerMySQL.

AgregueunZTableymodifiquelassiguientespropiedades:
Connection:ZConnection1
TableName:myagenda
ParaconectardirectoaunPCservidorremoto:
EsnecesariodetectarlaIPdelservidor(medianteunawebcomohttp://www.hcidata.info)elnombredelabasede
datosysupasswordparaagregarloalcontroladorODBC

MedianteaccesoFireDAc
ParaDelphiXE7ysuperioresdiponesaccesodirectouniversalDAC:
DesdelapaletaFireDACinsertarloscomponentesdelafigura
EnFDconectionpulsadobleclicyespecificaeldriver:MySql

Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg73


ConexinconSQLIteoMysqlenXE7
Mtodo1:UsarDBExpressactualizado
LasltimasversionesdeRADstudioincorporaneldriverMYSQLenla
SQLConexiondelDBExpressodeFireDAC.Noobstantesedeberincororar
laslibreraslibmysql.dllqueyalollevaelXamppenxampp\mysql\liby
dbxmys.dllalpath.

ElaccesoalasbasesdedatosMySQLoSQLiteylascreacindelastablases
posiblehacerlomuyfcilmentedesdelapestaaDataExplorer.
Crearunanuevaconexinyconelbotnderechoencimaseleccionar:Newtable.
Aadirloscamposdetexto:Nombreytelfonodeancho50caracteresyguardarlatablaconelnombreAgenda.

Arrastrarlatablacreadasobreelformulario.Aparecernloscomponentes:
AgendatableymSqlConection
Activalascasillas:
Conectedyactive.

AadeunoscomponentesDBGrid,DBNavigatoryDatasourcealformulario

Mtodo2:UsarZeos
1. DescargarlalibreragratuitaZeosDBOVersion714.
2. InstalarelpakageparaXE7
3. Aadirloscomponentesdelaimagenalformulario:
4. EnZconectionasignarladatabaseyectivarconected.
5. EnZtable:AsignaralaTablename:agendayactivar.
6. EnDatasource:Ponereldataset:Ztable1
7. EnelDBGridyelDBNavigaorasignarelDatasource1
8. Probar(Run)

Mtodo3:UsarFireDAC

ParaDelphiXE7ysuperioresdiponesaccesodirectouniversalDAC:
DesdelapaletaFireDACinsertarloscomponentesdelafigura
EnFDconectionpulsadobleclicyespecificaeldriver:MySql

Multi-Device / FireMonkey desde XE5 a XE10


Configurar un dispositivo ANDROID
Las aplicaciones se prueden probar en un emulador
Android o en un dipositivo fsico Android:
Mtodo 1:
Para probar la emulacin de Android se debe instalar las
android SDK manager
XE ya incorpora un SDK manager que se puede escificar
o actualizar desde: Tools Options Environement
SDK Manager.
Aadir las rutas para las SDK path. Normalmente, SDK
en:
C:\Users\Public\Documents\RAD
Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-
20130522\sdk
Y las NDK en:
C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\android-ndk-r8e
Desde el SDK manager, escoge del men:
Tools Manage Avds.
Android Virtual Devices para crear diversos emuladores Android. (Estos emuladores son pesados).

Mtodo 2:

Otro modo de probar las aplicaciones es


directamente sobre el dispositivo android conectado.
Para ello, bajarse el ABD driver universal USB (9
Mb) de la pgina: http://adbdriver.com/downloads/e
instalar en el PC con el dispositivo conectado. Luego
instalar el APK instaler (instalador de paquetes APK
para Android) en tu dispositivo desde la Play Store de
Google.

El telfono o dispositivo android debemos conectarlo


al PC y activar las opciones del desarrollador y permitir el modo depuracin USB. Entonces, al instalar el
driver ABD nos aparecer el dispositivo en la lista.

Con esto nos aparecer el dispositivo en el target de Android SDK. Pulsar doble
clic sobre l.

Antes de probar con el dispositivo se recomienda probar en las primeras fases


de la aplicacin, en una ventana Win32 pulsando doble clic en el target de
Windows.

En realidad la aplicacin queda instalada.


Otra manera manual de instalarla y probarla en el dispoitivo sera coger el
archivo APK generado de la carpeta de nuestro proyecto: Android\Release\BIN y luego copiarlo al dispositivo e
instalarlo con el APK installer

En el modo de emulacin se puede arrancar antes el emulador del SDK para que tarde menos. Accediendo a
las Android tools o SDK manager y en el manager AVD virtual devide arrancar (Start) el AVD deseado.

Configurar para subir a al PlayStore:


1. Activar en el Project manager el modo de Build: Release (versin final).
2. En project - Options: En pestaa Uses permisions: Activar o desactivar las funciones deseadas para el
dipositivo (Acceso a cmaras o localizacin)
3. En project - Options: En pestaa Provisioning: Crear un certificado
4. En project Deployment pulsar el botn de la barra: Deploy.
5. Crear una cuenta de desarrollador de Google previo abono de 25 $.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg75
Aplicacin para Win 32 win 64 e IOS - Mac

Para probar la emulacin para IOS crearemos una aplicacin bsica para FireMonkey;
Escoge: New > FireMonkey Desctopt Application o File > New > Other > Delphi Projects > FireMonkey HD
Application.
Aade, de la paleta Estandar, estos tres elementos al formulario:
- Tedit Edit1
- TButton que diga Hola.
- TLabel que diga: Introduzca
su nombre

Pulsa doble clic sobre el botn


Button1 para escibir en el
procedure:
procedure
TForm1.Button1Click(Sender:
TObject);
begin
ShowMessage('Hola,'+Edit1.Text);
end;

Probar la aplicacin:
Pulsa el botn Run o elige del men: Run run para comprobar su funcionamiento.

Guardar el proyecto: Crea una carpeta que se llame: HolaFM.


Escoge: File Save as... Para guardar el archivo de cdigo en la carpeta con el nombre: HolaFM1.pas
Escoge: File Save project as... Para guarda el proyecto en la carpeta con el nombre HolaFM.dpr

Activar la versin para Windows 64-bit:


1 En el panel Project Manager, pulsa con el botn
Derecho del mouse sobre Target Platforms.
Add Platform
Escoge 64 bits Windows.

2 Pulsa con el botn derecho del mouse sobre la


plataforma 64 bits y escoge: Activate.

3 Compila de nuevo la aplicacin y comprueba que


se muestra en la carpeta Win64\Debug la aplicacin
exe.

Nota: Si tu FM RAD Studio corre bajo x86 (Win32) podrs compilar en 64 bits
pero no podrs ejecutarlo.

Configurar para Mac OsX y ejecutar en un Mac:


1 En el panel Project Manager, pulsa con el botn Derecho del mouse sobre
Target Platforms. Add PlatformEscoge: OSX.

2 Pulsa con el botn derecho del mouse sobre


la plataforma OSX y escoge: Assign Remote
Profile.

3 Selecciona Add
para abrir la ventana de conexin con un equipo
mac por red.

4 Escribe el nombre de la conexin:


ConexionMac

Pon el nombre de tu equipo Mac en la red o su


IP

Entonces, el IDE estar conectado con tu Mac.


Si pulsas F9 se ejecutar la aplicacin en tu Mac.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg77
Multi-Device / FireMonkey - Grfica con el componente PlotGrid.
Para probar el uso del componente PlotGrid rejilla grfica y los gestos del mouse:
Escoge: New > Multi-Device / FireMonkey Application (segn version)
Inserta en el formulario un panel y lo alineas al Top.
Inserta en el formulario el component Tplotgrid con name: PG1 y o alineas al cliente.
Pon en el panel tres Labels y dos Spinbox con nombres: Editm y Editn
Cambia sus valores max/min para que adopte valores entre -100 y +100
Pon en el panel un Button1 con la propiedad text: Dibujar grfica.
Pulsa doble clic en el botn Button1 de Dibujar grfica y aade al cdigo On clic:Button1Click:
begin
PG1.Repaint;
end;
En el el componente de rejilla grfica plotgrid PG1 selecciona el evento onPaint: PG1.paint
Escribe el cdigo siguiente:
procedureTForm1.PG1Paint(Sender:TObject;Canvas:TCanvas;constARect:TRectF);
var
p1,p2,orig:TpointF;{Tpointf:puntodecoordenedasdecimales,tpoint:coordenadasenteras}
x,x0,y0:integer;
m,n:single;
begin
m:=EditM.Value;
n:=EditN.Value;
//Puntoorigenenelmediodelarejilla:
orig:=PointF(PG1.Width/2,PG1.Height/2);
Canvas.BeginScene;//>iniciaellienzo
//>colordelalneaazul:
Canvas.Stroke.Color:=TAlphaColorRec.Blue;
//>grosordelalneaa2:
canvas.StrokeThickness:=2;
//escalaralaresolucindelarejilla:
n:=n*PG1.Frequency;
//dibujodelladoderechodelalnea:
p1:=Pointf(orig.X,orig.yn);
//defineelprimerpunto
x:=round(PG1.Width/2);//posicinxenla
rejilladelorigenx
p2:=Pointf(PG1.Width,orig.ym*xn);//defineelpunto2afinaldelarejilla
canvas.DrawLine(p1,p2,1);//dibujalalneaentrelos2puntosconopacidad
//dibujodelladoizdo
p2:=Pointf(0,orig.y+m*xn);
canvas.DrawLine(p1,p2,1);
canvas.EndScene;
Prueba y guarda en una carpeta nueva, la unidad con el nombre: grafica1 y el proyecto con el nombre:
Grafica.

Gestos para rotar - mover - zoom

Aade un componente GestureManager:


Al Formulario Form1, asigna a la propiedad
GestureManager el GestureManager1
Al Formulario Form1, asigna el evento OnGesture: FromGesture:
procedureTForm2.FormGesture(Sender:TObject;
const[Ref]EventInfo:TGestureEventInfo;varHandled:Boolean);
var
LObj:IControl;
begin
ifEventInfo.GestureID=igiRotatethen
begin
LObj:=Self.ObjectAtPoint(ClientToScreen(EventInfo.Location));
ifLObjisTplotgridthen//sielclienteeselPlotgrid
begin
if(TInteractiveGestureFlag.gfBegininEventInfo.Flags)then
AnguloAntes:=PG1.RotationAngle
elseifEventInfo.Angle<>0then
PG1.RotationAngle:=AnguloAntes(EventInfo.Angle*180)/Pi;
end;
end;end;
Aade la variable pblica AnguloAntes:double y comprueba en un dispositivo tctil.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg79
Firemonkey:
Uso de listas String Grid. Conversor

1. Ideal para organizar listados en varias filas y columas.


2. Escoge: New > FireMonkey Desktopt Application HD
(XE6) o File > New > Multidevice. (XE7-10)
3. Inserta en el formulario un Tgridpanel alineado al cliente
En la fila 0 columna 0 aadimos un spinBox con el
nombre: valor1
En la fila 0 columna 1 aadimos un TEdit con el nombre:
resultado1
En la fila 1 columna 0 aadimos un TstringGrid con el
nombre: magni1
En la fila 1 columna 1 aadimos un TstringGrid con el
nombre: result1

En el evento Oncreate del formulario aadimos los


elementos a las listas en tiempo real:
var En Magni1 on select cell;
sufimetro:string; var
i:integer; Result:Double;
begin i:Integer;
sufimetro:='metros';//Longitud Op1,Op2:double;
magni1.RowCount:=15; Begin
magni1.cells[0,0]:='Tera'+sufimetro+'Tm'; try
magni1.cells[1,0]:='1E12'; Op2:=StrToFloat(Magni1.Cells[1,Arow]);
magni1.cells[0,1]:='Giga'+sufimetro+'Gm'; //>pasaaunidadesbase
magni1.cells[1,1]:='1E9'; fori:=0toResult1.RowCount1do
magni1.cells[0,2]:='Mega'+sufimetro+'Mm'; Result1.Cells[1,i]:=FloatToStr(Op2*Valor1.Value
magni1.cells[1,2]:='1E6'; /StrToFloat(Magni1.Cells[1,i]));
magni1.cells[0,3]:='Miria'+sufimetro+' //Actualizamosresultados...
Mm'; ifResult1.Selected<0theni:=0else
magni1.cells[1,3]:='1E5'; i:=Result1.Selected;
magni1.cells[0,4]:='Kilo'+sufimetro+'Km'; ifResult1.Selected<>0then
magni1.cells[1,4]:='1E3'; Result1.SelectRow(0)elseResult1.SelectRow(1);
magni1.cells[0,5]:='Hecto'+sufimetro+' Result1.SelectRow(i);//cambiodefilapara
Hm'; activarelevento
magni1.cells[1,5]:='1E2'; except
magni1.cells[0,6]:='Deca'+sufimetro+' Valor1.Text:='1';//evitarecursividad
Dam'; End
magni1.cells[1,6]:='10';
magni1.cells[0,7]:=sufimetro+'m'; EnResult1SelectCell:
magni1.cells[1,7]:='1'; begin
magni1.cells[0,8]:='Deci'+sufimetro+'dm'; Resultado1.Text:=Result1.cells[1,Arow];
magni1.cells[1,8]:='0,1'; End;
magni1.cells[0,9]:='Centi'+sufimetro+'
cm';
magni1.cells[1,9]:='1E2';
magni1.cells[0,10]:='Mili'+sufimetro+' Prueba y guarda en una carpeta nueva, la unidad
mm';
magni1.cells[1,10]:='1E3'; con el nombre: unit1 y el proyecto con el nombre:
magni1.cells[0,11]:='Micra'+sufimetro+' Conversor.
m';
magni1.cells[1,11]:='1E6';
magni1.cells[0,12]:='Nano'+sufimetro+'
nm';
magni1.cells[1,12]:='1E9';
magni1.cells[0,13]:='Angstromio'+'';
magni1.cells[1,13]:='1E12';
magni1.cells[0,14]:='Pico'+sufimetro+'
pm';
magni1.cells[1,14]:='1E15';
Magni1.EndUpdate;
Result1.RowCount:=15;
fori:=0toResult1.RowCount1do
Result1.Cells[0,i]:=magni1.cells[0,i];
Ejercicio Uso de StrinGrid y arrays con Firemonkey: Divisin por Ruffinni

Crea un nuevo proyecto llamado Ruffini (File > New > Multidevice)
Aade los componentes de la imagen adjunta:
1 spinbox
5 lables
2 StrinGrid
Llama a las Stringrids con el nombre: coef
y tabla
Llama al coef divisor a
Aade el evento en el botn:

procedureTForm1.FormCreate(Sender);
varco:integer;
begin
forco:=0toround(grado.Value)do
coef.Cells[co,0]:='0';
end;

procedureTForm1.Button1Click(Sender:TObject); procedureTForm1.GradoChange(Sender:TObject);
var begin
d:real; ifgrado.Value<coef.ColumnCount1then
fi,co,I:integer;//fila,columna
begin begin //quitacolumnas

d:=strtofloat(a.Text)*1;//cambiamoselsigno coef.Columns[tabla.ColumnCount1].DisposeOf;
tabla.cells[0,1]:=floattostr(d); tabla.Columns[tabla.ColumnCount1].DisposeOf;
forco:=1toround(grado.Value)do//ponemoslos end
coeficientes
elseifgrado.Value>coef.ColumnCount1then
ifcoef.Cells[co1,0]=''thentabla.cells[co,0]:='0'
begin //aadecolumnas
elsetabla.cells[co,0]:=coef.Cells[co1,0];
coef.AddObject(TStringColumn.Create(Self));
//bajamoselprimercoef;
tabla.AddObject(TStringColumn.Create(Self));
co:=1; //>celda[col,fil]
coef.Cells[tabla.ColumnCount1,0]:='0';
fi:=2;
coef.Columns[tabla.ColumnCount1].Width:=50
tabla.cells[co,fi]:=tabla.cells[co,0]; tabla.Columns[tabla.ColumnCount1].Width:=50
forco:=1toround(grado.Value)do
begin end;
//multiplicamosyponemosarribaizquierda
tabla.Cells[co+1,fi1]:= tabla.RealignContent;
floattostr(d*strtofloat(tabla.cells[co,fi])); end;
//sumamosyponemosabajo:
iftabla.cells[co+1,fi2]=''then
tabla.cells[co+1,fi2]:='0';
tabla.Cells[co+1,fi]:=floattostr(strtofloat(tabla.cells
[co+1,fi2])+strtofloat(tabla.cells[co+1,fi1]));
end;
end;
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg81
Sensores mobile. Antorcha android (versin apaptada Samples\FlashLight)
Descarga de internet imagen de bombilla o similar y de un botn encendido y apagado:
Crea un nuevo proyecto llamado Linterna (File > New > Multidevice
application)
Aade los components de la imagen derecha:
Alinea el LayoutContenedor al cliente y el LayoutBotones al centro.

Cambia el tipo del objeto


Camera por : Back Camera

Aade el cdigo:

procedureTForm1.FormCreate(Sender:TObject);
begin
apagado.Enabled:=Camera.HasFlash;
Camera.Active:=True;
end;

procedureTForm1.ApagadoClick(Sender:TObject);
begin
apagado.Visible:=False;
encendido.Visible:=True;
Camera.TorchMode:=TTorchMode.ModeOn;
end;

procedureTForm1.EncendidoClick(Sender:TObject);
begin
apagado.Visible:=True;
encendido.Visible:=False;
Camera.TorchMode:=TTorchMode.ModeOff;
end;

Compila en dispositivo: En el Project Manager, selecciona la plataforma Android y conecta un mvil Android al
Puerto USB.
Ejecutar y comprobar: Escoje Run > Run Without Debugging
Guarda el Proyecto: Linterna y la unidad: Linterna1.

Mejoras: Aade las sombras y extras que se muestran en el ejemplo:


C:\Users\Public\Documents\Embarcadero\Studio\16.0\Samples\Object Pascal\Mobile Samples\Device Sensors and
Services\FlashLight
Sensores mobile. Localizador sensor (versin apaptada Samples)
Crea un nuevo proyecto llamado Localizador (File > New > Multidevice application)
Aade los components de la imagen:

La propiedad del numberbox Lat ser del


tipo decimal Float, con 3 decimales y
valores comprendidos entre max: 80 y min
-80

La propiedad del numberbox Long ser


del tipo decimal Float, con 3 decimales y
valores comprendidos entre max: 180 y
min -180

Aade el cdigo:

procedureTForm1.ActivadorSwitch(Sender:TObject);
begin
LocationSensor1.Active:=Activador.IsChecked;//>activaellocationsensor
end;

procedureTForm1.LocationSensor1LocationChanged(Sender:TObject;
constOldLocation,NewLocation:TLocationCoord2D);
begin
Lat.Value:=NewLocation.Latitude;//>devuelveposicinlatituddelGPS
Long.Value:=NewLocation.Longitude;//>devuelveposicinlongituddelGPS
Button1Click(Sender);//>situaenelmapa
end;

procedureTForm1.Button1Click(Sender:TObject);
begin
formatsettings.DecimalSeparator:='.';//>formatodecimalpuntoamericano
WebBrowser1.Navigate('https://maps.google.com/maps?q='+floattostr(Lat.Value)+','+
floattostr(Long.Value));
end;

Compilar en el dispositivo: Conecta un mvil Android al Puerto USB y en el Project Manager, selecciona la
plataforma Android.
Ejecutar y comprobar: Escoje Run > Run Without Debugging
Guarda el Proyecto: Localizador y la unidad: Localizador1.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg83
Sensores mobile. Orientacin sensor (versin apaptada Samples)
Propiedades:

El Botn de Inclinacin muestra el


ngulo de rotacin en grados en el
eje X, Y y Z

El Botn de Origen muestra las


coordenadas X,Y y Z del vector que
apunta al norte magntico, medido
en microteslas.

Crea un nuevo proyecto llamado


Localizador (File > New >
Multidevice application)
Aade los components de la
imagen.
Aade el cdigo y guardal con
el nombre sensor1

OrientationSensor1SensorChoosing( end;
Sender:TObject;constSensors:TSensorArray;
varChoseSensorIndex:Integer); Timer1Timer(Sender:TObject);
var begin
I:Integer; lbTiltX.Text:=Format('TiltX:%f',
Found:Integer; [OrientationSensor1.Sensor.TiltX]);
begin lbTiltY.Text:=Format('TiltY:%f',
Found:=1; [OrientationSensor1.Sensor.TiltY]);
forI:=0toHigh(Sensors)do lbTiltZ.Text:=Format('TiltZ:%f',
begin [OrientationSensor1.Sensor.TiltZ]);
ifbotonInclinacion.IsPressedand lbHeadingX.Text:=Format('HeadingX:%f',
(TCustomOrientationSensor.TProperty.TiltXin [OrientationSensor1.Sensor.HeadingX]);
TCustomOrientationSensor(Sensors[I]).AvailablePr lbHeadingY.Text:=Format('HeadingY:%f',
operties)then [OrientationSensor1.Sensor.HeadingY]);
begin lbHeadingZ.Text:=Format('HeadingZ:%f',
Found:=I; [OrientationSensor1.Sensor.HeadingZ]);
Break; end;
end
elseifbotonOrigen.IsPressedand FormActivate(Sender:TObject);
(TCustomOrientationSensor.TProperty.HeadingXin begin
TCustomOrientationSensor(Sensors[I]).AvailablePr {$ifdefIOS}
operties)then {$ifndefCPUARM}
begin lbOrientationSensor.Text:='Sinsensor';
Found:=I; swOrientationSensorActive.Enabled:=False;
Break; {$endif}
end; {$endif}
end; end;

ifFound<0then botonOrigenClick(Sender:TObject);
begin begin
Found:=0; OrientationSensor1.Active:=False;
botonInclinacion.IsPressed:=True; botonInclinacion.IsPressed:=False;
botonOrigen.IsPressed:=False; botonOrigen.IsPressed:=True;
ShowMessage('Brjulanodisponible'); OrientationSensor1.Active:=
end; swActivar.IsChecked;
end;
ChoseSensorIndex:=Found; swActivarSwitch(
end; Sender:TObject);
begin
botonInclinacionClick(Sender:TObject); {activateordeactivatetheorientation
begin sensor}
OrientationSensor1.Active:=False; OrientationSensor1.Active:=
botonOrigen.IsPressed:=False; swActivar.IsChecked;
botonInclinacion.IsPressed:=True; Timer1.Enabled:=swActivar.IsChecked;
OrientationSensor1.Active:= end;
swActivar.IsChecked;
Transmisin Bluetooth. Teora
Los dispositivos BlueTooth pueden actuar como Masters o como Slaves (Amos o esclavos). La diferencia es que un
BlueTooth Slave solo puede conectarse a un master y a nadie ms, en cambio un master BlueTooth, puede
conectarse a varios Slaves o permitir que ellos se conecten y recibir y solicitar informacin de todos ellos, arbitrando
las transferencias de informacin ( Hasta un mximo de 7 Slaves).
As pues un nodo BlueTooth puede ser Master o Slave y dispone de una direccin nica, as como de un nombre
para identificarse y muy habitualmente tambin incluye un PIN de conexin o nmero de identificacin que debe
teclearse para ganar acceso al mismo.
Como el BlueTooth lo desarroll Nokia para conectar telfonos mviles, a otros dispositivos como auriculares,
micrfonos o conexiones al audio del coche, existe un procedimiento definido que se llama Pairing (o
emparejamiento) que vincula a dos dispositivos Bluetooth.
Cuando vinculas dos dispositivos BT, se inicia un proceso en el que ellos se identifican por nombre y direccin
interna y se solicitan la clave PIN para autorizar la conexin.
Si el emparejamiento se realiza con xito, ambos nodos suelen guardar la identificacin del otro y cuando se
encuentran cerca se vuelven a vincular sin necesidad de intervencin manual. Por eso el CD de tu coche reconoce el
mvil de tu bolsillo en cuanto te subes y puedes reproducir la msica que tienes en tu Smartphone.
Aunque para que tu BlueTooth pueda enviar o recibir msica, debe aceptar otra norma posterior llamada Advanced
Audio Distribution Profile (A2DP) y que en caso de ser algn sistema antiguo te impedir la reproduccin.
Naturalmente, a lo largo de los aos la norma ha ido variando y existen varias versiones de la misma, con
compatibilidad siempre con las versiones anteriores que se diferencian en la distancia que pueden alcanzar (entre 50
y 100 metros, tericamente y sin obstculos) adems de la velocidad de transferencia.
LOS COMANDOS AT
La transmission serie RS232 solo utilizaba dos hilos de comunicaciones, no haba ms remedio que incorporar una
orden de atencin que significara que a continuacin venia una orden de programacin del modem, que no deba ser
transmitida al otro extremo. Es decir que las ordenes eran del tipo AT+Orden, donde AT era el comando
especificado de atencin y al conjunto de ellas se llam comandos AT. Lisa commandos para HC-06.
COMMAND FUNCTION
AT Test UART Connection
AT+RESET Reset Device
AT+VERSION Query firmware version
AT+ORGL Restore settings to Factory Defaults
AT+ADDR Query Device Bluetooth Address
AT+NAME Query/Set Device Name
AT+RNAME Query Remote Bluetooth Devices
AT+ROLE Query/Set Device Role
AT+CLASS Query/Set Class of Device CoD
AT+IAC Query/Set Inquire Access Code
AT+INQM Query/Set Inquire Access Mode
AT+PSWDAT+PIN Query/Set Pairing Passkey
AT+UART Query/Set UART parameter
AT+CMODE Query/Set Connection Mode
AT+BIND Query/Set Binding Bluetooth Address
AT+POLAR Query/Set LED Output Polarity
AT+PIO Set/Reset a User I/O pin
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg85
Sensores mobile. Bluetooth (versin apaptada de Samples)
Aadir la librera a uses: System.Bluetooth
Y los objetos en la declaracin public:
FBluetoothManager: TBluetoothManager;
FDiscoverDevices: TBluetoothDeviceList;
FPairedDevices: TBluetoothDeviceList;
FAdapter: TBluetoothAdapter;

Aadir el procedure manualmente:


procedure ListaDispositivos(const Sender: TObject;
const ADevices: TBluetoothDeviceList);

procedureTForm1.BConectarClick(Sender:TObject); procedureTForm1.BuscarClick(Sender:TObject);
begin begin
ifFBluetoothManager.ConnectionState= AniIndicator1.Visible:=True;
TBluetoothConnectionState.Connectedthen Buscar.Text:='Buscando...';
begin Buscar.Enabled:=False;
ifComboDevices.ItemIndex>1then ComboDevices.Clear;
FAdapter.Pair(FDiscoverDevices[ComboDevices.Item ifFBluetoothManager.ConnectionState=
Index]) TBluetoothConnectionState.Connectedthen
ElseShowMessage('Dispositivonoseleccionado'); begin
end; Label1.Text:='DispositivoBluetooth
end; detectado
"'+FBluetoothManager.CurrentAdapter.AdapterNam
procedureTForm1.BDesconectarClick(Sender: e+'"';
TObject); FBluetoothManager.StartDiscovery(10000);
begin FBluetoothManager.OnDiscoveryEnd:=
ifFBluetoothManager.ConnectionState= ListaDispositivos;
TBluetoothConnectionState.Connectedthen end;
begin end;
ifComboParejas.ItemIndex>1then
FAdapter.UnPair(FPairedDevices[ComboParejas.Item procedureTForm1.ListaDispositivos(const
Index]) Sender:TObject;constADevices:
elseShowMessage('Dispositivoemparejadono TBluetoothDeviceList);
seleccionado'); var
end; I:Integer;
end; begin
Buscar.Text:='Terminado';
procedureTForm1.BEmparejadosClick(Sender: Buscar.Enabled:=True;
TObject); AniIndicator1.Visible:=False;
var FDiscoverDevices:=ADevices;
I:Integer; ComboDevices.Clear;
begin ifComboDevices.Count=1then
ifFBluetoothManager.ConnectionState= ComboDevices.Items.Add('Nohaydispositivos')
TBluetoothConnectionState.Connectedthen else
begin forI:=0toADevices.Count1do
ComboParejas.Clear; ComboDevices.Items.Add(ADevices[I].DeviceName
FPairedDevices:= +'>'+ADevices[I].Address);
FBluetoothManager.GetPairedDevices; ComboDevices.ItemIndex:=0;
ifFPairedDevices.Count>0then end;
forI:=0toFPairedDevices.Count1do
ComboParejas.Items.Add(FPairedDevices[I].DeviceN procedureTForm1.FormShow(Sender:TObject);
ame) begin
else try
ComboParejas.Items.Add('Nohaydispositivos FBluetoothManager:=TBluetoothManager.Current;
emparejados'); FAdapter:=FBluetoothManager.CurrentAdapter;
end; except
end; ShowMessage('Bluetoothnodetectado');
end;
end;
FireMonkey: Manipular objetos3D (versin apaptada de docwiki.embarcadero.com)
4. Escoge: New > Multi-Device / FireMonkey Application > FireMonkey 3D Application
o File > New > Other > Delphi Projects > FireMonkey 3D Application (segn la versin)
5. Aade los siguientes componentes 3D de la Tool Palette al
formulario:
1 TLight de la paleta Scenes
2 TCubes de la paleta Shapes.

6. Ajusta su posicin arrastando el objeto, y su tamao, desde la


marca azul de su izquierda, como en la imagen.

7. Para cambiar la propiedad Material del primer cubo es


necesario en la versin XE3 aadir al formulario un
componente: TTextureMaterialSource: Selecciona en el Object
Inspector, la TextureMaterialSource, la propiedad: Texture []
>Edit.
Se abrir la ventana editor. Pulsa en el botn Load para cargar
la textura deseada dese un bitmap y clica en OK al finalizar.
Asigna al primer cubo el materialsource:
TextureMaterialSource1
8. Para cambiar la iluminacin del segundo cubo, es neceario en la versin Xe3 aadir
al formulario un componente a TLightMaterialSource
Para ajustar la propiedad: Texture [] >Edit. Se abrir la ventana editor.
Pulsa en el botn Load para cargar la textura deseada dese un bitmap y clica en OK
al finalizar.
Asigna al segundo cubo el materialsource: LightMaterialSource1
9. Compila la aplicacin para observar la diferencia en la textura entre los dos cubos.
Aadir y ajustar objetos 2D, como botones, en espacios 3D:

Para ello arastra desde la paleta 3dlayers,


un component de capa: TLayer3D sobre
el formulario y pon, sobre este, un botn:
TButton.
Para similar una superficie 2D, cambia el
tipo de proyeccin del TLayer3D: En el
Object Inspector, cambia las propiedades:
Projection = pjScreen //vista plana
Align = alMostRight
Width = 180
Aade 3 TGroupBoxes sobre el objeto
TLayer3D. Pon la propiedad de los 3,
Align to alTop.
Aade los objetos y cambia el nombre de
los objetos que se muestran en la imagen.
Aadimos los spinbox para el valor.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg87
Eventos:
Utilizamos el mismo procedimiento para el ancho y alto: SpinAnchoChange
Utilizamos el mismo procedimiento al cambiar los tres objetos SpinEdit de posicin: SpinAnchoChange
Utilizamos el mismo procedimiento al cambiar los tres objetos TrackBar de rotacin: TracKXChange

procedureTForm4.Form1DCreate(Sender:TObject);//> llamadoeneleventoOncreatedelForm
begin
//inicializatamao:
SpinAncho.Value:=Cube1.Width; //poneelspinanchoalanchodelcubo
SpinAlto.Value:=Cube1.Height; //poneelspinaltoalaltodelcubo
//inicializaposicin
SpinX.Value:=Cube1.Position.X;
SpinY.Value:=Cube1.Position.Y;
SpinZ.Value:=Cube1.Position.Z;
//inicializarotacin
TrackX.Value:=Cube1.RotationAngle.X;
TrackY.Value:=Cube1.RotationAngle.Y;
TrackZ.Value:=Cube1.RotationAngle.Z;
end;

procedureTForm1.SpinAnchoChange(Sender:TObject);
begin
ifsender=SpinAnchothenCube1.Width:=SpinAncho.Value//siesllamadodesdeelspinancho
elseCube1.Height:=SpinAlto.Value; //sinoesqueesllamadodesdeelspinalto
end;

procedureTForm1.SpinXChange(Sender:TObject);
begin
Cube1.Position.X:=SpinX.Value; //posicinxdelcubolaquetengaelSpinX
Cube1.Position.Y:=SpinY.Value; //posicinydelcubolaquetengaelSpinY
Cube1.Position.Z:=SpinZ.Value; //posicinzdelcubolaquetengaelSpinZ
end;

procedureTForm1.TracKXChange(Sender:TObject);
begin
Cube1.RotationAngle.X:=TrackX.Value; //rotacinxdelcubolaquetengaelTrackX
Cube1.RotationAngle.Y:=TrackY.Value; //rotacinydelcubolaquetengaelTrackY
Cube1.RotationAngle.Z:=TrackZ.Value; //rotacinzdelcubolaquetengaelTrackZ
end;
Firemonkey: Introduccin a juego Flappy
Crea un nuevo proyecto llamado Flappy (File > New > Multidevice application)
Creacin de la pantalla de Introduccin:
Asigna el tamao a la ventana: 360 width x 480 Height aprox.
Aadiremos: 3 Imgenes, 1 label, 1 botn y 1 Stylebook.
En el Stylebook, cargaremos el estilo Air de la carpeta Samples (Apply and close).
Al Formulario Form1 le asignaremos ese
Stylebook1

Propiedades del botn: Name: PlayBtn


Text: Play Textsettings Fontsize: 24
StyleSettings Fontcolor: False
Propiedades del label: Name: Titulo Text:
Flappy - FontColor: Purple Size: 48
Align: Top - Margin Top 50
Propiedades de la Image1: Name: Fondo
Align: Contents Cargar el MultiresBitMap:
Fondo.png
Propiedades de la Image2: Name: Pajaro
Align: Center Cargar el MultiresBitMap:
Pajaro1.png

Integrar dentro del Label Titulo, un


GlowEffect (Softness 0.4 color gold) y un
FloatAnimation (Position.Y de Startvalue 30 a
stopvalue 67 Duration: 0.5)

Corre el programa (Run) para comprobar que el


ttulo oscila en vertical.
Guarda la unidad con el nombre: uIntro

Cdigo al pulsar el botn Play:


procedureTMenuForm.PlayBtnClick(Sender:TObject);
begin
Game.Iniciar;
Intro.Hide;
{$IFDEFMSWINDOWS}
Game.ShowModal;//sieswindowsllamaalaotraventanaenmodomodal
{$ELSE}
Intro.Show;//sinoeswindowsmuestralaventana
{$ENDIF}
end;

Creacin de la pantalla del juego:


Escoge del men: File New Multi-device Form Delphi. Tipo HDForm. Mismo tamao que el form anterior.
Nombre del form: Game. Nombre de la unidad: uGame
La primera capa Layout: Nombre: ReadyLayout, dentro de esta aadimos los siguientes objetos:
Un Label: ReadyLbl con texto Text: Readdy! - size 48 GlowEffect
Gold Align Horizontal
Un rectngulo: Fill: Orange Stroke: White - Corner rounded con un
label en su interior con el texto: Pulsa para mantener el pjaro en
vuelo
Poner esta capa ReadyLayout en Visible:False
Evento la hacer clic en la capa:
procedureTGame.ReadyLayoutClick(Sender:TObject);
begin
ReadyLayout.Visible:=False;
puntuacion.Visible:=True;
Timer1.Enabled:=True;
end;
La segunda capa Layout: Nombre: GameOverLayout, dentro de esta
aadimos los siguientes objetos con la disposicin de la figura
1 Label con el texto: Game Over
1 Rectngulo color crema con de esquinas redondeadas y dos labels dentro
2 Botones para Salir y Volver a jugar con el cdigo:
Salir: game.close;//Intro.show;
Volver:game.iniciar;
Hacemos la capa GameOverLayout visible false.

El formulario Game:
Propiedad Quality: HighPerformance
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg89
Evento al ocultar: TGame.FormHide(Sender:TObject): Timer1.Enabled:=False;
Intro.Show;
Objetos:
Aadimos una imagen de fondo. LLamada fondo y cargamos el MultiresBitMap:
Fondo.png
Aadimos tres imgenes: pajaroA y pajaroB visible false y pajaro visible true, donde
cargamos los bitmaps de pajaro.png y pajaro2.png. En el bitmap de pajaroA tendr
las alas subidas y en el bitmap del pajaro B tendr las alas bajadas.
Nota: este sprite lo puedes descargar desde la entrada Google: flappy bird sprite
Aadimos un Timer: Timer1
Aadimos una capa Layout de nombre tubo que contendr dos rectngulos:
TopTubo y TopTuboCap como en la imagen:
Aadimos un rectangle con el nombre Suelo y align al Bottom, color tierra.

var procedureTGame.Timer1Timer
Game:TGame; const
Desplazatubos:integer; VelocidadTubos=2;//velocidad
factor:single; depasodelostubos
EnemyList:TStringList; var
Score:Integer;//puntuacion R:TLayout;
PajaroFlag:boolean;//variablespermisoparamover I:Integer;
pajaro POffset,WOffset:Integer;
JuegoAcabado:boolean; R1,R2:TRect;//rectangulos
paracolisin
usesuIntro; begin
Game.BeginUpdate;
procedureTGame.FormCreate ifTimer1.Enabled=truethen
begin begin
EnemyList:=TStringList.Create; JuegoAcabado:=False;
factor:=1.5;//factordeescala //sitocasueloseacabael
GameOverLayout.Position.Y:=Game.Height; juego...
end; if(Pajaro.Position.Y+
Pajaro.Height)>Suelo.Position.Y
procedureTGame.FormDestroy(Sender:TObject); then
begin begin
EnemyList.Free; JuegoAcabado:=True;
end; end;

procedureTGame.FormHide(Sender:TObject); ifDesplazatubos=0then
begin begin
Timer1.Enabled:=False; if(Random<0.5)then
Intro.Show; begin
end; WOffset:=round((200*Factor));
end
procedureTGame.FormMouseDown else
Shift:TShiftState;X,Y:Single); begin
begin WOffset:=round((250*Factor));
ifTimer1.enabled=Truethen end;
begin if(Random<0.5)then
ifpajaro.Position.Y<75then begin
begin POffset:=round((125*Factor));
pajaro.Position.Y:=0; end
end else
else begin
begin POffset:=round((25*Factor));
pajaro.Position.Y:=pajaro.Position.Y75; end;
//sube75pixeles
end; R:=TLayout(Tubo.Clone(Self));//clonaelobjetotubo
pajaro.RotationAngle:=0;//miraalfrente EnemyList.AddObject('',R);//aadeelobjetoRala
end; lista
end; R.Parent:=Game;
R.Visible:=True;//muestraelobjetotubo
procedureTGame.ReadyLayoutClick R.Position.X:=Game.Width+R.Width;//loponeala
begin derecha
ReadyLayout.Visible:=False; R.Position.Y:=(0WOffset)+POffset;//posiciona
puntuacion.Visible:=True; arriba+alturaaleatoria
Timer1.Enabled:=True;
end; R:=TLayout(Tubo.Clone(Self));//clonaotroobjeto
tubo
EnemyList.AddObject('',R);//aadeelobjetoRala
lista
R.Parent:=Game;
R.Visible:=True;
R.Position.X:=Game.Width+R.Width;
R.Position.Y:=(Game.HeightR.Height+WOffset)+POffset;
//posicionaabajo+alturaaleatoria
R.RotationAngle:=180;//logira180grados
end;

ifDesplazatubos>(VelocidadTubos*30)then ifJuegoAcabado=TruethenGameOver;
begin end;
Desplazatubos:=0; Suelo.BringToFront;
end puntuacion.BringToFront;
else ifJuegoAcabado=truethen
begin GameOverLayout.BringToFront;
Inc(Desplazatubos);//aumentaeldesplazamiento Game.EndUpdate;
end; end;
//RectanguloR1estadefinidoporelareadelpajaro
R1:= procedureTGame.Puntua(I:Integer);
Rect(Trunc(Pajaro.Position.X),Trunc(Pajaro.Position.Y), begin
Trunc(Pajaro.Position.X+Pajaro.Width),Trunc(Pajaro.Posi Score:=I;
tion.Y+Pajaro.Height)); puntuacion.Text:=IntToStr(Score);
end;
forI:=EnemyList.Count1downto0do
begin procedureTGame.BtnSalirClick(Sender:TObject);
ifAssigned(EnemyList.Objects[I])then begin
begin Game.Close;
R:=TLayout(EnemyList.Objects[I]); Intro.Show;
R.Position.X:=R.Position.X5; end;
//RectanguloR2estadefinidoporelareadeltubo
R2:= procedureTGame.BtnVolverClick(Sender:TObject);
Rect(Trunc(R.Position.X),Trunc(R.Position.Y),Trunc(R. begin
Position.X+R.Width),Trunc(R.Position.Y+R.Height)); game.iniciar;
//sihayinterseccinentrelasdosareas... end;
ifChequeaColision(R1,R2)=Truethen
begin functionTGame.ChequeaColision(R1,R2:TRect;OffSetY
JuegoAcabado:=True; :LongInt=4;OffSetX:LongInt=4):Boolean;
end begin
else //RectanguloR1estadefinidoporelareadelpajaro
begin //RectanguloR2estadefinidoporelareadeltubo
if(((R.Position.X+(R.Width/2))<Pajaro.Position.X) //Detectarsihayintereseccinentrelasdosareas..
AND(R.Tag=1)AND(R.TagFloat=0))then //Automtico:>Result:=IntersectRect(R1,R2);
begin //Manual:>
R.TagFloat:=1; {Result:=(NOT((R1.Bottom(OffSetY*2)<R2.Top+
Puntua(Score+1); OffSetY)or(R1.Top+OffSetY>R2.Bottom(OffSetY*
end; 2))
end; or(R1.Right(OffSetX*2)<R2.Left+OffSetX)
or(R1.Left+OffSetX>R2.Right(OffSetX*2))));}
if(R.Position.X<((R.Width*1)10))then end;
begin
R.DisposeOf; procedureTGame.GameOver;
EnemyList.Delete(I); begin
end; JuegoAcabado:=True;
end; Timer1.enabled:=false;
end; GameOverLayout.BringToFront;
GameOverLayout.Visible:=True;
ifPajaro.RotationAngle<90then Puntuacion.Visible:=False;
Pajaro.RotationAngle:=Pajaro.RotationAngle+5; end;

Pajaro.Position.Y:= procedureTgame.Iniciar;
Pajaro.Position.Y+(Max(Pajaro.RotationAngle,1)/5); var
//(recuerdaponerlibreriamathparausarMax) I:Integer;
ifPajaroFlag=Falsethen R:TLayout;
begin begin
Pajaro.Bitmap.Assign(PajaroB.Bitmap); JuegoAcabado:=False;
PajaroFlag:=True; GameOverLayout.Visible:=False;
end pajaro.Position.X:=96;
else pajaro.Position.Y:=248;
begin pajaro.RotationAngle:=0;
Pajaro.Bitmap.Assign(PajaroA.Bitmap); ReadyLayout.Visible:=True;
PajaroFlag:=False; puntua(0);
end; end;
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg91

Conversor de monedas de FireMonkey/Multi-device con servicio web


SeleccionadesdeelmenAdd>NewMultidevice/FireMonkeyApplication.
Elegimos una aplicacin FireMonkey HD y comenzaremos por
desarrollar una aplicacin Windows 32 Bits.
Diseo del formulario:
Colocamos 2 Edit y 3 Labels como se muestra en la imagen:
Colocamos un ListBox y configuramos las siguientes propiedades:
StyleLookup = transparentlistboxstyle XE4: GroupingKind = gsGrouped
Clic derecho del mouse en el ListBox donde seleccionaremos la opcin
AddItem y agregamos: 5 ListBoxItems en XE 4: 2 ListBoxGroupHeaders
Cambiamos el texto de cada tem en la propiedad Text por el nombre de
cada moneda y dejamos la primra activada (Is selected).
En Xe4 y XE5 puedes aadir las banderas de cada pas en la propiedad
ItemData - BitMap Tambin
Servicio de datos web:
El siguiente paso es generar nuestra clase que consumir el Servicio
Web del Banco de Mxico y que nos proporcionar las paridades o tipos de cambio de las monedas que
vamos a utilizar en nuestra aplicacin, el WSDL de ste servicio web es el siguiente:
http://www.banxico.org.mx/DgieWSWeb/DgieWS?WSDL
Escoge del me: Component: Import WSDL para
importar el WSDL a nuestra aplicacin con el
asistente que se muestra. Escoger los valores por
defecto. Al final nos generar un archivo pas.
ste importador genera el cdigo necesario para
poder consumir el servicioWeb y ya slo nos resta
escribir el cdigo para que nuestra aplicacin se
conecte y nos muestre las paridades para cada
una de las monedas seleccionadas.
Aadimos un aadir un componente THTTPRIO
de la carpeta webservices a nuestro formulario, y
aadir la informacin necesaria a ste. Llamamos
al mtodo tiposDeCambioBanxicoRequest del
servicio

Al seleccionar la moneda deseada de la lista,


pasamos el texto de cada moneda, al objeto de
destino:
procedureTForm1.ListBox1Change(Sender:
TObject);
begin
Label2.Text:=ListBox1.Items[ListBox1.ItemIndex];
lbMonedaExt.ItemData.Bitmap:=(SenderasTListBoxItem).ItemData.Bitmap;
end;
Escribimos el cdigo necesario en el evento OnExit del Edit2 donde capturamos la cantidad a convertir para
que nos muestre el valor en euros de acuerdo a la moneda seleccionada.
procedureTForm1.Edit2Exit(Sender:TObject);
begin
valorME:=StringReplace(edit2.Text,'$','',[rfReplaceAll]);
valorME:=StringReplace(valorME,',','',[rfReplaceAll]);
Edit1.Text:=format('%5.2m',[strtoCurr(ValorME)*ParidadSel])
end;
Compilamos.Nuestro servidor de aplicaciones PAServer debe estar en ejecucin para poder realizar la
compilacin de la aplicacin.
Aplicacin Multi-device (Firemonkey) usando SQLite: Lista de tareas o Notas

Usaremos dbExpress para Conectarse a la Base de Datos. Para las plataformas mviles, dbExpress soporta
InterBase ToGo as como SQLite. Esos productos de bases de datos pueden ejecutarse sobre dispositivos
iOS y Android.
Vamos a crear un archivo de base de datos SQLite usando el FireMonkey Mobile Form Designer
ACrearlabasedeDatosylatablaenelDataExplorer
1. Vaya al Data Explorer, click-derecho en el nodo SQLite y
seleccione Add New Connection:

2. Defina el nombre de la conexin, como por ejemplo


ListaCompra o ShopingList

3. Especifique la ubicacin del archivo de base


de datos:

4. Click en el botn Advanced y abra la caja de


dilogo Advanced Properties.

5. Cambie la propiedad FailIfMissing a False y


click en OK para cerrar la caja de dilogo
Nota: Seteando FailIfMissing a False instruye al Data Explorer a crear un nuevo fichero de base de datos si no
existe.
10. Regrese a la caja de dilogo en el Modify Connection, click en el botn Test Connection. Con sta
operacin, el nuevo archivo de base de datos es creado si no existe.
Nota1: Si se muestra el mensaje: Asegrese que sqlite3.dll est presente en su
sistema de desarrollo. Si el archivo no est presente, descargue el archivo asqlite3.dll desde:
http://www.sqlite.org/download.html a la ruta system
Nota 2: Si no existe la propiedadFailifMissing puedes aadirla con el botn derecho: add
Crear una Tabla
1. En el Data Explorer, click-derecho en Tables, y luego seleccione
New Table desde el men contextual
2. Escribe el nombre del campo: Elemento del tipo TEXTo y guarda la
tabla con el nombre: Lista.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg93
BCrearelformularioparaAndroid:
1. Crear una aplicacin FireMonkey Mobile usando: File > New > FireMonkey Mobile Application - Delphi.
2. Suelte un TToolBar sobre el Formulario.
3. Suelte un TButton sobre el componente ToolBar y establezca las siguientes propiedades en el Object
Inspector:
Poner propiedad Name a ButtonAdd.
Poner StyleLookup a addtoolbuttonbordered.
4. Suelte un TButton sobre el componente ToolBar y establezca las siguientes propiedades en el Object
Inspector:
Poner la propiedad Name a ButtonDelete.
Poner el StyleLookup a deletetoolbutton.
Poner el Text a Borrar
Poner el Visible a False.
5. Suelte un TLabel sobre el componente ToolBar y establezca las siguientes propiedades en el Object
Inspector:
Poner el Align a alClient.
Poner el StyleLookup a toollabel.
Poner el Text a Lista.
Poner el TextAlign a taCenter.
6. Arrastre un componente TListBox sobre el
formulario y setear las siguientes propiedades en
el Object Inspector:
Poner la propiedad Align a alClient, entonces el componente ListBox usar el formulario completo.
ConectandoalosDatos
1. Seleccione la tabla Lista creada anterirormente del Data Explorer y sultelo en el Form Designer.
Nota: Esto crea dos componentes TSQLConnection y TSQLDataSet sobre el Formulario
2. Seleccione el componente TSQLConnection del Formulario y cambie la propiedad Connected a True.
3. Seleccione el componente Lista del Formulario
y cambie la propiedad Active a True.
4. Seleccione View > LiveBindings Designer
para abrir la ventana visual.
5. Seleccione el elemento de la Lista sobre el Item
del ListBox1 y arrastra sobre ItemText del
Listbox1.

HacerVisibleelBotnDelete
Seleccione ListBox1 y defina el siguiente manejador
de evento para el evento OnItemClick: ButtonDelete.Visible:=ListBox1.Selected<>nil;
AgregarunaEntradaalaLista
1. Suelte un componente TSQLQuery al formulario.
2. Establecer las siguientes propiedades en el Object Inspector Name a SQLQueryInsert y conecta con
SQLConnection
3. Poner la propiedad SQL como se muestra: INSERT INTO ITEM (Elemento) VALUES (:Elemento)
4. Seleccione el botn Expand (...) sobre la propiedad Params.
Seleccione el parmetro Elemento y poner DataType a ftString.

5. En el Form Designer, doble-click al componente AddButton. Aada el


siguiente cdigo para este manejador de evento:
procedureTForm1.ButtonAddClick(Sender:TObject);
var
Textoentrada:String;
begin
try
ifInputQuery('EntreNuevoelemento','Name',Textoentrada)and(Textoentrada.Trim<>'')
then
begin
SQLQueryInsert.ParamByName('Elemento').AsString:=Textoentrada;
SQLQueryInsert.ExecSQL();
lista.Refresh;
ListBox1.Repaint;
ButtonDelete.Visible:=ListBox1.Selected<>nil;
end;
except
one:Exceptiondo
begin
ShowMessage(e.Message);
end;
end;end;

La funcin InputQuery muestra un cuadro de dilogo que pide al usuario final que introduzca un texto. Esta
funcin devuelve True cuando el usuario selecciona OK, as que usted puede agregar datos a la base de datos
slo cuando el usuario selecciona OK y el texto contenga algunos datos
EliminarunaEntradadelaLista
1. Suelte un componente TSQLQuery al formulario.
2. Establecer las siguientes propiedades en el Object Inspector:
Poner la propiedad Name a SQLQueryDelete.
Poner la propiedad SQLConnection a SQLITECONNECTION.
Poner la propiedad SQL como se muestra: DELETE FROM LISTA WHERE elemento = :elemento
Poner el botn Expand (...) sobre la propiedad Params.
Poner el parmetro Elelemnto a DataType ftString.
3. En el Form Designer, doble-click al componente DeleteButton. Agregue el siguiente cdigo a este
manejador de evento:
procedureTForm1.ButtonDeleteClick(Sender:TObject);
var
Textoentrada:String;
begin
Textoentrada:=ListBox1.Selected.Text;
try
SQLQueryDelete.ParamByName(Elemento).AsString:=Textoentrada;
SQLQueryDelete.ExecSQL();
Lista.Refresh;
ButtonDelete.Visible:=ListBox1.Selected<>nil;
except
one:Exceptiondo
begin
SHowMessage(e.Message);
end;
end;
end;

Probar: Para realizar las pruebas de aadir y eliminar elementos a la lista puedes realizarlas bajo la plataforma
Win32

Almacenar la base de datos local en el mvil:


Es necesario realizar las siguientes acciones:
Cambiar la configuracin (para conectarse al archivo de base de datos) a un archivo local bajo el folder
Documents (para Dispositivos iOS) o internal storage (para Dispositivos Android).

Antes de poder ejecutar la aplicacin en el mvil, es necesario configurar el despliegue de su archivo de


base de datos:
1. Abrir el Deployment Manager seleccionando Project > Deployment.
2. Seleccione Add Files, y seleccione el archivo de base de datos antes creado Lista.db
3. cambie Remote Path a StartUp\Documents\ (para iOS platform) o assets\internal\ (para Android platform).
4. Seleccione la columna Platforms (doble-click en el ellipsis [...] en la lnea de Lista.db):
1. Asegrese que iOS Simulator y iOS Device o Android estn presentes para Lista.db
2. Remueva Win32 desde la lista si est presente (usted no tiene que copiar archivos de base de datos para
la plataforma Win32).
5. Seleccione All-Configurations - iOS Device platform o All-Configurations - Android platform y asegrese
que Lista.db est lista para ser desplegada a StartUp\Documents\ o assets\internal.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg95
Especificando la Ubicacin de la base de datos SQLite sobre el Dispositivo Mvil
1. En el Form Designer, seleccione el componente Lista.
2. En el Object Inspector, doble-click al evento BeforeConnect.

3. Aada el siguiente cdigo al manejador de evento:


procedureTForm1.SQLConnectionSQLiteBeforeConnect(Sender:TObject);
begin
{$IFDEFINED(iOS)orDEFINED(ANDROID)}
ShoppingList.Params.Values['Database']:=
TPath.Combine(TPath.GetDocumentsPath,'shoplist.s3db');
{$ENDIF}
end;

El registro TPath est declarado en la unidad System.IOUtils, solo necesita agregar System.IOUtils en la
uses clause de su unidad.

Crear una Tabla si No Existe


Con SQLite puede crear una tabla cuando la tabla no existe, usando la sentencia CREATE TABLE IF NOT
EXISTS. Puede crear una tabla despus que el componente SQLConnection se conecte a la base de datos y
antes que el componente TSQLDataSet se conecte a la tabla. Use los siguientes pasos:
1. En el Form Designer, seleccione el componente ShoppingList.
2. En el Object Inspector, double-click en el evento AfterConnect.
3. Agregue el siguiente cdigo para manejar este evento:

procedureTForm1.ShoppingListAfterConnect(Sender:TObject);
begin
ShoppingList.ExecuteDirect('CREATETABLEIFNOTEXISTSItem(ShopItemTEXTNOTNULL)');
end;

Ejecutando Su Aplicacin en el Simulador o sobre un Dispositivo Mvil

Ahora su aplicacin est lista para ejecutarse sobre el simulador o su dispositivo mvil conectado. Para
ejecutar su aplicacin Desarrollo de Apps Mviles con Delphi (iOS y Android) .1. En el Project Manager,
seleccione su plataforma objetivo.
2. Escoja alguno de los siguientes comandos: Run > Run o Run > Run Without Debugging
Procedimientos y funciones bsicas - Delphi (alfabtico)
Abs Returns the absolute value of the argument. FindNext Returns the next entry that matches the name
AnsiCompareStr Performs a case sensitive compare of two and attributes.
strings. FloatToDecimal Converts a floating-point value to a decimal
AnsiCompareText Performs a non-case sensitive compare of representation.
two strings. FloatToStrF Converts the floating-point value to its string
AnsiLowerCase Converts characters to lowercase. representation.
AnsiUpperCase Converts characters to uppercase. FloatToStr Converts the floating-point value to its string
Append Opens an existing file for appending. representation.
AppendStr Adds a given string to an existing string FloatToText Converts the given floating-point value to its
ArcTan Returns the arc tangent of the argument. decimal representation.
AssignCrt Associates a text file with a CRT window. FloatToTextFmt Converts the given floating-point value to its
Assigned Tests to determine if a procedural, pointer, or decimal representation.
Delphi object variable is nil. FmtLoadStr Loads a string from a program's resource string
AssignFile Assigns the name of an external file to a file table
variable. FmtStr Formats a series of arguments and the results
BlockRead Reads one or more records into a variable. are returned in the parameter Result.
BlockWrite Writes one or more records from a variable. Format Formats a series of arguments and returns the
Break Terminates a for, while, or repeat statement. result as a Pascal string.
ChangeFileExt Changes a file's extension. FormatBuf Formats a series of arguments
ChDir Changes the current directory. FormatDateTime Formats a date and time using the specified
Chr Returns a character with a specified ordinal format.
number. FormatFloat Formats the floating-point value using the
CloseFile Closes an open file. format string given by Format.
ClrEol Clears all characters from the cursor position Frac Returns the fractional part of the argument.
to the end of the line without moving the Free Destroys an object instance.
cursor. FreeMem Disposes a dynamic variable of a given size.
ClrScr Clears the screen and returns the cursor to GetDir Returns the current directory of specified drive.
the upper left corner. GetMem Creates a dynamic variable of the specified size
Concat Concatenates a sequence of strings. and puts the address of the block in a pointer
Continue Continues a for, while, or repeat statement. variable.
Copy Returns a substring of a string. GotoXY Moves the cursor to the given coordinates
Cos Returns the cosine of the argument (x is an within the virtual screen.
angle, in radians). Halt Stops program execution and returns to the
Date Returns the current date. operating system.
DateTimeToFileDate Converts the Delphi date format to Hi Returns the high-order byte of the argument.
the DOS date format. High Returns the highest value in the range of the
DateTimeToStr Converts a value from time format to a string. argument.
DateTimeToString Converts a value from time format to a string. Inc Increments a variable.
DateToStr Converts a value from date format to a string. Include Includes an element in a set.
DayOfWeek Returns the current day of the week InitWinCrt Creates the CRT window if it has not already
Dec Decrements a variable. been created.
DecodeDate Decodes the specified date Insert Inserts a substring into a string.
DecodeTime Decodes the specifies time. Int Returns the Integer part of the argument.
Delete Deletes a substring from a string. IntToHex Converts an integer to a hexidecimal
DeleteFile Deletes the given file. IntToStr Converts an integer to a string
DiskFree Returns the amount of free disk space. IOResult Returns the status of the last I/O operation
DiskSize Returns the size of the specified disk. performed.
EncodeDate Returns values specified in date format. IsValidIdent Returns true if the given string is a valid
EncodeTime Returns values specified in time format. identifier.
Eof Returns the end-of-file status. KeyPressed Determines if a key has been pressed on the
Eoln Returns the end-of-line status of a text file. keyboard.
Erase Erases an external file. Length Returns the dynamic length of a string.
Exit Exits immediately from the current block. Ln Returns the natural logarithm of the argument.
Exp Returns the exponential of the argument. Lo Returns the low-order Byte of the argument.
ExpandFileName Expands the given file name. LoadStr Loads the string resource from the application's
ExtractFileExt Returns the file extension. executable file.
ExtractFileName Returns the file name. Low Returns the lowest value in the range of the
ExtractFilePath Returns the complete file path. argument.
FileAge Returns the age of the file. LowerCase Lowercases the given string
FileClose Closes a file. MaxAvail Returns the size of the largest contiguous free
FileDateToDateTime Converts a DOS date format to the block in the heap.
Delphi date format. MemAvail Returns the amount of all free memory in the
FileExists Returns True if file exists. heap.
FileGetAttr Returns file attributes MkDir Creates a subdirectory.
FileGetDate Returns the DOS date-and-time stamp of the Move Copies bytes from source to dest.
file. New Creates a new dynamic variable and sets a
FileOpen Opens a specific file. pointer variable to point to it.
FilePos Returns the current file position of a file. NewStr Allocates a new string on the heap.
FileRead Reads from a specific file. Now Returns the current date and time.
FileSearch Searches through the directories for a specific Odd Tests if the argument is an odd number.
file. Ofs Returns the offset of a specified object.
FileSeek Changes the current position of the file. Ord Returns the ordinal number of an ordinal-type
FileSetAttr Sets file attributes value.
FileSetDate Sets the DOS date-and-time stamp of the file. ParamCount Returns the number of parameters passed to
FileSize Returns the current size of a file. the program on the command line.
FillChar Fills a specified number (count) of contiguous ParamStr Returns a specified command-line parameter.
bytes with a specified value. Pi Returns the value of Pi.
FindClose Terminates a FindFirst/FindNext sequence. Pos Searches for a substring in a string.
FindFirst Searches a directory for a specified file name Pred Returns the predecessor of the argument.
and set of attributes. Ptr Converts a segment base and an offset
address to a pointer-type value.
Ofimega ManualEjerciciosProgramacinDELPHI Revago16 Pg97
Random Returns a random number. StrLIComp Compares two strings, up to a maximum
Randomize Initializes the built-in random number length, without case sensitivity.
generator with a random value. StrLower Converts a string to lower case.
Read For typed files, reads a file component into a StrMove Copies characters from one string to another.
variable. For text files, reads one or more StrNew Allocates a string on a heap.
values . StrPas Converts a null-terminated string to a Pascal-
ReadBuf Inputs a line from the CRT window. style string.
ReadKey Reads a character from the keyboard. StrPCopy Copies a Pascal-style string to a null-
Readln Executes the Read procedure, then skips to terminated string.
the next line of the file. StrPos Returns a pointer to the first occurrence of a
ReAllocMem Deallocates a block from the heap. string in another string.
Rename Renames an external file. StrScan Returns a pointer to the first occurrence of a
RenameFile Renames a file. character in a string.
Reset Opens an existing file. StrRScan Returns a pointer to the last occurrence of a
Rewrite Creates and opens a new file. character in a string.
RmDir Removes an empty subdirectory. StrToDate Coverts a string to a date format.
Round Rounds a real-type value to an Integer-type StrToDateTime Converts a string to a date/time format.
value. StrToFloat Converts the given string to a floating-point
RunError Stops program execution. value.
ScrollTo Scrolls the CRT window to show a screen StrToInt Converts a string to an integer
location. StrToIntDef Converts a string to an integer or the default
Seek Moves the current position of a file to a StrToTime Converts a string to a time format.
specified component. StrUpper Converts a string to upper case.
SeekEof Returns the end-of-file status of a file. Succ Returns the successor of the argument.
SeekEoln Returns the end-of-line status of a file. Swap Swaps the high- and low-order bytes of the
Seg Returns the segment of a specified object. argument.
SetTextBuf Assigns an I/O buffer to a text file. TextToFloat Converts the null-terminated string to a
Sin Returns the sine of the argument. floating-point value.
SizeOf Returns the number of bytes occupied by the Time Returns the current time.
argument. TimeToStr Converts a time format to a string.
SPtr Returns the current value of the SP register. TrackCursor Scrolls the CRT window if necessary to
Sqr Returns the square of the argument. ensure that the cursor is visible.
Sqrt Returns the square root of the argument. Trunc Truncates a real-type value to an Integer-type
SSeg Returns the current value of the SS register. value.
Str Converts a numeric value to a string. Truncate Truncates the file at the current file position.
StrCat Appends a copy of one string to the end of TypeOf Returns a pointer to an object type's virtual
another and returns the concatenated string. method table.
StrComp Compares two strings. UpCase Converts a character to uppercase.
StrCopy Copies one string to another. UpperCase Uppercases the given string.
StrDispose Disposes a string on a heap. Val Converts a string value to its numeric
StrECopy Copies one string to another and returns a representation.
pointer to the end of the resulting string. WhereX Returns the X coordinate of the current cursor
StrEnd Returns a pointer to the end of a string. location.
StrFmt Formats a series of arguments. WhereY Returns the Y coordinate of the current cursor
StrLCat Appends characters from one string to the location.
end of another and returns the concatenated Write For typed files, writes a variable into a file
string. component. For text files, writes one or more
StrIComp Compares two strings without case sensitivity. values to the file
StrLComp Compares two strings, up to a maximum WriteBuf Writes a block of characters to the CRT
length. window.
StrLCopy Copies characters from one string to another. WriteChar Writes a single character to the CRT window.
StrLen Returns the number of characters in Str. Writeln
StrLFmt Formats a series of arguments and the result
contains a pointer to the destination buffer.

También podría gustarte