DelphiXE PDF
DelphiXE PDF
DelphiXE PDF
Delphi – Object Pascal para versiones © Embarcadero 7 a XE10 & Lazarus free Pascal
Delphi es un entorno de programación del tipo RAD (Diseño Rápido de Aplicaciones) basado en el lenguaje
Object Pascal, creado por Borland y continuado por Embarcadero. Su característica principal es que posee un
control de bases de datos muy amplio, compatible con Oracle y a partir de las versiones XE permite
aplicaciones multiplataforma dentro de su framework Firemonkey. Rad Studio incorpora también C++ Builder.
Lazarus es la versión gratuita, multiplataforma y open source compatible y similar a la versión Delphi 7.
Conceptos básicos.
▪ Proyecto. Un proyecto es un conjunto de módulos de formulario, de códigos y de archivos
que componen una aplicación. La ventana View Project Manager muestra todos los
archivos que componen una aplicación.
▪ Formulario. Ventana con el diseño (frm). Lleva un código asociado a dicho formulario.
▪ Componentes. Los componentes son los objetos como cuadros, botones, etiquetas…
que se ponen en un formulario o ventana desde la Tool Palette.
▪ Propiedades. Usando la ventana de Object inspector (F11) podemos acceder a las
propiedades o a los eventos del componente. Las propiedades especifican los valores
iniciales de las características, tales como tamaño, nombre y posición.
▪ Eventos: Es la respuesta a las acciones del usuario que desencadenan una acción en el
programa.
Concepto de código:
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: Trozo de código como respuesta a un evento o acción, que no
recoge ni devuelve ningún dato.
▪ Procedimientos: Trozo de código que recoge uno o varios parámetros, pero no retornan.
▪ Funciones: Son procedimientos que además devuelven un valor al procedimiento desde
donde se le llamó.
▪ Diagrama de Flujo: Representa el esquema gráfico de un algoritmo
▪ Pseudocódigo: Representa los pasos o procesos básicos del algoritmo en lenguaje local.
Reglas de nomenclatura geberales al declarar procedimientos o variables:
Deben comenzar por una letra
No pueden contener puntos
No puedes superar los 255 caracteres Propiedades básicas de los objetos:
Nombres de formularios no sobrepasar 40 caracteres Alignment - Alineación
No pueden tener el mismo nombre que una palabra clave BevelInner - borde interior
Comentarios en el código se inician con: // o entre { } BorderStyle - estilo del borde
Caption - rótulo
Eventos y acciones (sobre un componente):
TabStop - Salto tabulación
Lista de eventos (Desencadena la acción de un objeto) Color, Cursor - Color, puntero
Enabled - Activo
Evento Acción
Font - Tipo letra
Click Al hacer clic con el mouse (o el teclado) Height - Altura del objeto
DragDrop Al soltar un control arrastrado con el mouse Hint - Etiqueta ayuda
DragOver Al Arrastrar un control con el mouse. Left - Posición izquierda
KeyDown Presionar una tecla mientras el objeto tiene el foco. Name - Nombre del objeto
KeyPress Presionar una tecla y devolver su valor ASCII. PopupMenu - Menú contextual
KeyUp Liberar una tecla mientras el objeto tiene el foco. ShowHint - Mostrar etiquetas
MouseDown Presionar el botón del mouse sobre el objeto. Top - Posición vertical
MouseMove Mover el puntero del mouse por encima del objeto Visible - Visible
MouseUp Liberar el botón del mouse en el objeto.
Width - Ancho del objeto
Ejercicio 1. Crear una ventana “hola mundo” y un botón para cerrar.
En primer lugar, antes de trabajar con Delphi, es aconsejable que crees una carpeta (subdirectorio) con tu
nombre para guardar ahí los ejercicios.
• Crear un proyecto nuevo:
Delphi XE: Elige del menú: File New Aplication (o VCL Forms application)
Lazarus: Elige del menú: Proyecto – Nuevo proyecto - Aplicación
Te aparecerá una ventana o formulario vacío (Form). En el panel Inspector de objetos (Object Inspector), verás
las propiedades de la ventana o de los objetos que en ella pongas.
• Cambiar el nombre de la ventana: En el panel Object Inspector, pestaña Properties (Propiedades), haz clic en
Caption (rótulo) y en su casilla escribe: Ventana para poner un rótulo a la ventana.
end;
Para indicar una acción a un objeto escribir el nombre del objeto, un punto y su acción: Form1.close;
Si no pones el nombre del objeto, te refieres a la ventana en general: sólo deberás escribir la palabra: close
(cerrar la ventana) en el lugar indicado:
Procedure TForm1.Button1Click(Sender: TObject); void __fastcall TForm1::Button1Click(TObject *Sender)
Begin {
close; Close();
end; }
• Selecciona cada componente añadido 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)
Comentarios al ejercicio: Algunos componentes tienen propiedades del tipo de texto, numérico o lógicas.
No se pueden igualar o comparar propiedades de tipos diferentes. Para ello se debe realizar una conversión
de un formato a otro:
IntToStr convierte un valor numérico en un valor de texto para que se puedra mostrar en el panel1
StrtoInt Convierte un valor de tipo texto en su valor numérico
Probar la aplicación:
Pulsa el botón 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 código 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
IntToStr (Integer to String) Cambia del tipo de número entero a cadena de texto
StrToInt (String to Integer) Cambia del tipo cadena de texto a número entero
Otros:
Ejecuta y prueba (Run): Al pulsar el botón, activamos el temporizador Timer que desplaza un pixel a la derecha la
posición del botón a cada pulso de su intervalo, de duración 10 milisegundos.
Para guardar primero la unidad y luego el proyecto, escoge del menú: File Save project as...
Uso de variables de fecha y decimal:
Una variable almacena un valor temporalmente para utilizarlo después.
Se nombran o declaran al inicio del procedimiento en la sección var y pueden ser de fecha (datetime),
numéricas (integer), decimales sencillas o dobles (single o double), de texto (string), etc…
Bucles y bifurcación:
Bifurcación:
• if ... then ... else: IF edad >= 18 THEN label1.caption:=’Mayor de edad’
ELSE label1.caption:=’Mayor de edad’;
Equivale al SI condicional
No se añade “;” de final de línea antes del
Else. Si la condición ocupa varias líneas es necesario añadir Begin –
case edad of
End 0..18: Label1.caption:=’menor edad’;
18..60: Label1.caption:=’mayor edad’;
Bifurcación múltiple:
60..99: Label1.caption:=’anciano’;
• Case: else Label1.caption:=’no vale’;
Bifurca las acciones dependiendo de diversos resultados de end;
un parámetro del tipo ordinal.
(Número o carácter ordenado alfab.)
Bucles:
Infinito: while i<10 do i := i+1;
While: Repite la ejecución infinitas veces hasta que
se cumpla la condición.
Finito (Contador):
For ... To, For ... Downto: for i:=1 to 100 do
Ejecuta una acción un número determinado de veces. Begin
Label1. caption:=’Paso número’ + i;
o To: Incrementa una vez el bucle
Beep; // tono sonoro
o Downto: Decrementa una vez el bucle. End;
Ejemplo-ejercicio Password:
Crea un nuevo proyecto. (File – New - Application).
▪ Añade un Button de la paleta Standard y cambia sus propiedades:
Enabled = false ; PasswordChar = * ; Caption = OK
▪ Añade por encima un Edit de la paleta Standard
▪ Pulsa doble clic en el Edit1 y escribe, dentro de su procedure, el código:
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
Ofimega acadèmies Manual Ejercicios - Programación Rad Studio Delphi Imp - dic-18 Pág 7
Ejercicio de conversión de variables. Convertidor de Euros. Para Delphi 7+ Lazarus
• Ingredientes:
Empieza un proyecto nuevo
VCL Aplicación en Delphi
o Nuevo – Proyecto –
Aplicación en Lazarus.
▪ 1 etiqueta (TLabel)
• Preparación:
En el panel: Object Inspector (F11), pestaña 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, tamaño 12
• Cocción:
Pulsar doble clic sobre el botón 1 para añadir al evento Onclic las siguientes líneas de comando:
(Líneas a añadir en negrita) Comentarios
procedure TForm1.Button1Click(Sender: TObject);
var
numero1,numero2:double;
variables a utilizar:
begin número1 y número2 del tipo numéricas con decimales
numero1:=strtofloat(edit1.text);
numero2:=numero1/166.386;
Número1 vale el texto del Edit1 convertido
edit2.text:=floattostr(numero2);
end; Número2=número2/166,386 (poner punto decimal)
El texto del Edit2 será el valor de la variable número2
convertida a string
Ejercicio Propuesto:
Pulsa doble clic sobre el botón 2 y añade el código al botón2 para que multiplique el valor de Edit1 por
166,386
Variantes al programa:
Para evitar tener que crear variables que almacenen el valor temporalmente, podríamos haber realizado la
conversión directamente del siguiente modo:
Edit2.text:=floattostr(strtofloat(edit1.text)/166.386)
Sin embargo, es más práctico y analizable, dividir el código en varias líneas.
Para controlar error de introducir texto en un Edit para valor numérico:
Se puede controlar con un MaskEdit, ó usando la función Format, FormatFloat/FloatToStrF o evaluando
si es numérico antes de realizar operaciones matemáticas: IsNan (Is Not a Number). Véase la ayuda.
Guardar el proyecto: Guarda el proyecto y su unidad (conversor1.pas) en una carpeta independiente
\Projects\Conversor con el nombre del proyecto: Conversor.dpr
Comentarios: Al pulsar la tecla INTRO en el edit1 pone en la dirección del navegador, el texto del Edit1
Algunos Códigos de tecla ASCII: Valor
Retroceso {backspace}, #8
Tab {tab} #9
Supr {delete} o {del} #127
Entrar {enter} o ~ #13
Esc {esc} #27
▪ Probar la aplicación: 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
El código:
Botones adelante y atras:
WebBrowser1.GoBack; y WebBrowser1.GoForward;
Botón para ir:
procedure THeaderFooterForm.btnIrClick(Sender: TObject);
begin
WebBrowser1.URL := Direccion.Text;
end;
Al teclear en dirección:
procedure THeaderFooterForm.DireccionKeyDown(Sender: TObject; var Key: Word;
var KeyChar: Char; Shift: TShiftState);
begin
if Key = vkReturn then
begin
WebBrowser1.URL := Direccion.Text;
btnIr.SetFocus; //pone el foco para quitar el teclado
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 añadir elementos a modo de historial al pulsar en Ir:
encontrado:=false;
for i := 0 to Direccion.Items.count-1 do
begin
if Direccion.Items[i]=Direccion.Text then encontrado:=true;
end;
if encontrado=false then
begin
//limita la lista a 10
if Direccion.Items.count>10 then Direccion.Items.Delete(0);
Direccion.Items.Add(Direccion.Text); //añadir a la lista...
end;
Compilar:
▪ Compilar por emulardor: Para probar la emulación de Android se debe
instalar las android SDK manager y escoger en el Target el emulador:
rxe5_android (muy lento)
Edit3.Text:=FormatFloat('###.##',StrtoFloat(Edit1.Text) *
StrtoFloat(Edit2.Text) / 2 );
• Cambia la propiedad del formulario Form1. Stylebook: por StyleBook1. Resource: Transparent
• Pulsa doble clic sobre el botón Button1 y en el evento: OnClick del botón Button1 añadir el código en negrita:
procedure TForm1.Button1Click(Sender: TObject);
begin
if RadioButton1.IsChecked =true then //si esta activado Área…
NumberBox1.Value:=SpinBox1.Value*SpinBox2.Value/2
else NumberBox1.Value:=Sqrt(Sqr(SpinBox1.Value)+Sqr(SpinBox2.Value));
end;
Ofimega acadèmies Manual Ejercicios - Programación Rad Studio Delphi Imp - dic-18 Pág 11
• Llamaremos al mismo evento: OnChange en los dos RadioButton y al evento OnCreate del formulario Form1
para que se cambie el texto de las etiquetas al empezar el programa o al cambiar de selector:
Probar la aplicación:
Pulsa Run para comprobar su funcionamiento →
Guardar el proyecto: Crea una carpeta que se llame: Contador.
▪ Escoge: File Save as... Para guardar el archivo de código en la carpeta con el nombre: triangulos1.pas
▪ Escoge: File Save project as... Para guarda el proyecto en la carpeta con el nombre triangulos.dpr
1. En el panel Project Manager, pulsa con el botón Derecho del mouse sobre
Target Platforms.
Add Platform…
Escoge 64 bits Windows.
2. Pulsa con el botón derecho del mouse sobre la plataforma 64 bits y escoge:
Activate.
3. Compila de nuevo la aplicación y comprueba que se muestra en la carpeta
Win64\Debug la aplicación exe.
Nota: Si tu FM RAD Studio corre bajo x86 (Win32) podrás compilar en 64 bits pero no podrás ejecutarlo.
1. Escoge del menú: Tools > Options > Environment Options > Connection
Profile Manager page. Click en Add
2. Escribe el nombre del profile: “ConexionMac”. Plataforma OsX
3. Pon el nombre de tu equipo Mac en la red o su IP
4. En el panel Project Manager, pulsa con el botón Derecho del mouse sobre
Target Platforms. Add Platform…Escoge: OSX.
5. Pulsa con el botón derecho del mouse sobre la plataforma OSX y escoge:
Assign Remote Profile.
6. Selecciona Add… para abrir la ventana de conexión con
un equipo mac por red.
7. Escribe el nombre de la conexión: ConexionMac
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 botón 1 para escribir la acción dentro
del procedure:
panel1.caption:=edit1.text + edit2.text; → da error
De este modo, los tres botones realizan el mismo procedure pero utilizamos
el parámetro Sender con IF … else if para evaluar qué botón se ha pulsado en cada caso.
Mejoras: ¿Qué pasa si dividimos un número por cero? → Devuelve un error el programa.
Escoge del menú: Program → Reset para desbloquear el programa.
En el caso de dividir deberíamos evaluar que si numero2=0 entonces muestre un mensaje de que no se
puede realizar la operación. Para ello, añadir la siguiente línea:
If número2=0 then showmessage(‘No se puede dividir por cero);
(Sin olvidar poner un begin – end cuando escribimos varias líneas de código 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: Repite la ejecución infinitas veces hasta que se cumpla la condición.
En matemáticas, factorial o permutación multiplica un número por el siguiente inferior hasta 1.
Ejemplo: 5! = 5 * 4 * 3 * 2 * 1 = 120
Abre el proyecto anterior: CALCUALDORA y añade el siguiente botón: Button5. Añade el código que se muestra y
comprueba su funcionamiento:
En los tres procedimientos siguientes, sólo tendremos que escribir el texto en negrita El resto se escribe
automáticamente al pulsar doble clic en el componente o sobre el evento adecuado del componente (F11)
Crear un proyecto nuevo llamado: Mouse.dpr y añade al formulario, los componentes que se muestran en la figura.
Con el formulario seleccionado, busca en petaña Events, el evento onMouseDowny pulsa doble clic para crear el
procedure.
Agrega el código siguiente:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
label1.Caption:='Izquierdo:' +inttostr(X); //guarda posición X del ratón
label2.Caption:='Izquierdo:' +inttostr(Y); //guarda posición Y del ratón
end
else if Button = mbRight then
begin
label1.Caption:='derecho:' + inttostr(X);
label2.Caption:='derecho:' + inttostr(Y);
end;
end;
Comprueba (Run F9) y guarda el proyecto y la unidad en tu carpeta al finalizar.
Para detectar cuándo el usuario pulsa una tecla, se emplea los eventos: on key press y on key down (en la pestaña Events
del Object Inspector)
En los eventos on key press y on key down. Los procedures nos
informan, con la variable key, del código de la tecla pulsada.
Ord (Char) devuelve el valor numérico ASCII que le corresponde
un caracter
Crear un proyecto nuevo llamado: Tecla.dpr y añade al
formulario, tres labels con los captions (rótulos) que se muestran
en la figura:→
Con el formulario seleccionado, busca en petaña Events, el
evento onkeypress y pulsa doble clic para añadir el procedure.
Agrega el código siguiente:
Variables públicas 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
(públicas), si no se crea el apartado var dentro del procedure (privadas).
ejemplo:
var
Form1: TForm1;
horainicio: double; //no existe el tipo time, se elige el tipo numérico doble. Permite decimales doble
precisión
horafin: double;
I: Integer; // numérico entero)
S: string; // del tipo cadena de texto
otros tipos de variables:
Integer Shortint SmallInt Longint Byte Word
Cardinal Boolean ByteBool WordBool LongBool Char
Práctica:
• Crear una nueva aplicación VCL llamada CRONO. Añade al formulario (ventana) los siguientes
componentes:
3 botones
3 paneles de color blanco como se muestra en la figura:
Tipo de componente: TButton
Name: button1
Caption: Empezar
Tipo de componente: TButton
Name: button2
Caption: Parar
Tipo de componente: TPanel
Name: Panel2
Caption: Hora fin
Tipo de componente: TPanel
Name:Panel1
Caption: Hora inicio
Tipo de componente: TPanel
Name: Panel3
Tipo de componente: Tbutton
Name: button3
Caption: Crono
Caption: Salir
var
• Añadir las siguientes variables al inicio de la unidad: Form1: TForm1;
horainicio: double;
horafin: double;
• Añadir las líneas de código a los procedures:
Nivel avanzado
procedure TForm1.Button1Click(Sender: TObject);
begin
Cómo crear un archivo INI que guarde la hora de
horainicio:=time; entrada.
panel1.Caption := 'Hora de inicio: ' + TimeToStr(Time);
end; - Es necesario añadir INIFILES a la sección USES
de la unidad.
procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.Button2Click(Sender: TObject); var
begin datosini:TIniFile;
horafin:=time; HORAENTRADA:STRING;
panel2.Caption := 'Hora de paro: ' + TimeToStr(Time);
begin
panel3.caption:= 'Crono: ' + TimeToStr(horainicio-
horafin); HORAENTRADA:=TIMETOSTR(TIME);
end; datosini:= TIniFile.Create('DATOS.INI');
-->crea el archivo datos.ini
datosini.WriteString('Eduardo', 'Entrada',
procedure TForm1.Button3Click (Sender: TObject); HORAENTRADA); -->añade a la sección
begin [Eduardo] entrada=12:15
close; DATOSINI.FREE; --> cierra el archivo datos.ini
end; end;
Ofimega acadèmies Manual Ejercicios - Programación Rad Studio Delphi Imp - dic-18 Pág 19
Ventanas de Mensajes y cuadros de diálogo directos.
Ventanas de mensaje:
Modo Delphi: Showmessage('Mensaje’);
MessageDlg(‘Mensaje', mtInformation, [mbOk], 0)
Modo Windows: Application.MessageBox(‘Mensaje’, 'Textoventana', MB_OK);
Ventana de pregunta:
Application.MessageBox('Pregunta', 'Textoventana', MB_YESNO)
MessageDlg(Mensaje', mtConfirmation, [mbYes, mbNo], 0) → Devuelve: mrYes o mrNo
InputBox('Nombre_ventana', 'Texto_Dato', 'Respuesta_predeterminada'); → Devuelve Var String
InputQuery('Identificate!', 'Pon tu nombre, por favor...', Nombre); → Devuelve Var Bolean
Otros mensajes:
ShowMessageFmt(const Msg: string; Params: array of const);
CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons)
Ejercicio-ejemplo: Crea en un formulario nuevo 5 botones y asigna a cada uno de ellos el siguiente código:
Resumen de controles usuales. (Válido para Visual basic & Delphi VCL)
Introduce los controles que se muestran en la figura y cambia las
Name:
propiedades como se indica, para que quede como en la 2ª figura:
BarraCodigo
Max: 255 Label 1: Nombre: Carácter
Min: 32 Label2: Nombre: ASCII
Label 8: Nombre: VerAscii - Backcolor: Blanco - Center
Label5: Nombre: Rojo Caption: Rojo
Label6: Nombre: Verde Caption: Verde
Label7: Nombre: Azul Caption: Azul
Button1 o Command1: Caption: &Salir
Compo: Panel
Name: Panel1
Compo: Label
Name: Label1
Compo: Image1
Name: Image1
Compo: Bevel
Name: Bevel1
Style:bsLowered
Componente: CheckBox
Name: ImageForm Componente: Button Name: StretchCheck
Caption: Visor Name: Salir Checked: False
Caption: Salir Caption: Ajustar
Ejemplo. Como grabar y leer todos los caption del formulario según el idioma escogido:
▪ Buscaremos todos los componentes de nuestro formulario usando la clase: TCOMPONENT que me
devuelve el nombre del componente según el número de órden de creación 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 número 3
▪ Component is TLABEL: Evalua si el componete es de la clase o tipo Tlabel
{Al cargar el formulario lee el archivo de idioma.lng que le ha dicho en el archivo datosini y que antes lo ha guardado
el usuario al cambiar la configuración de idioma en el archivo Datos.ini}
var
Ini: TIniFile;
component:tcomponent;
i:integer;
dire:string;
begin
Dire:= Application.GetNamePath;
Ini := TIniFile.Create(dire+'\langs\'+Configidioma+'.lng'); //dire es la ruta por defecto
//-> Ruta para ios: TIniFile.Create(GetHomePath + PathDelim + 'Documents' + PathDelim + 'ex.ini');
for i := 0 to ComponentCount - 1 do //-> Agrupa por componente seccion [CAPTIONS]
begin
Component := Components[ i ];
if (Component is TLABEL) and ((Component as TLABEL).Caption <>'') then (component as
TLABEL).Caption:=Ini.ReadString( 'CAPTIONS', (component as TLABEL).name,(component as
TLABEL).Caption)
end;
end;
Ejercicio 6 . Reproductor multimedia
Componente: Opendialog
Paleta: Dialogs
Name: Abrirdialogo
Filter:AVI|*.avi|WAV |*.wav|MIDI |*.mid
Componente: Mainmenu
Componente: Mediaplayer Paleta: Standard
Name: Player Carpeta: System Name: MainMenu1
Display: VideoPanel
AuotoOpen: False
Componente: Panel
Name: Videopanel Formulario
Name: Form1
Caption: Reproductor multimedia
Evento: Abrir1click
Ejercicio propuesto 1: Añade al proyecto Visor de imágenes, del ejercicio anterior, la posibilidad de ver archivos de
vídeo y música además de imágenes; añadiendo el componente mediaplayer.
Ejercicio propuesto 2: Si tienes instaladas las librerías gratuitas JVCL. Puedes crear un capturador de vídeo fácilmente
con el componente: JvAVICapture1 (Paleta: JVimages, animators).
Ejercicico 7 Dibujar: Controles de los botones del mouse y variable “Flag”
procedure TForm1.FormMouseDown
begin
Pinta := True; // Permiso para pintar
Button1 Canvas.MoveTo(X, Y); //Fija el origen
Button2 end;
procedure TForm1.FormMouseUp
begin
Pinta := False; //Quita permiso para
pintar
end;
procedure TForm1.Button1Click
begin
If Colordialog1.execute then Form1.Canvas.Pen.Color := colordialog1.color; //Abre ventana color y asigna
end
Ofimega acadèmies Manual Ejercicios - Programación Rad Studio Delphi Imp - dic-18 Pág 25
Ejercicio Arrastrar y soltar. Propiedades de los formularios y del mouse.
1º. En un Nuevo proyecto/aplicación VCL Delphi: CARAS.DPR. Añadir al formulario los ingredientes que se muestran:
var
Form1: TForm1;
Live : TBitmap;
implementation
{$R *.DFM}
{$R extrares.res} // <- aquí se incluye el recurso
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 lógica (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
• Preparación:
En sus propiedades (Properties), los objetos tendrán 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
Comprueba pulsando F9 o el botón 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
Animación. Protector de pantalla (Uso del estamento CASE)
Ingredientes:
- Shape (Paleta Additional): Name: Bola; Shape: stCircle
- Timer (paleta system): Timer1 – Interval: 20
- Botones: 2 (Empezar y parar)
Formulario: Si lo deseas, puedes asignar color transparente.
Variables:
Mover: integer;
Acciones:
En el Button1: Empezar : Timer1.enabled=true ;
En el Button2: Parar: Timer1.enabled=false;
Case:
procedure TForm1.FormCreate(Sender: TObject); //Al crearse el formulario Bifurca las acciones
dependiendo de diversos
begin resultados de un parámetro del
mover:=1; // -> importante: La variable: Mover, debe tener cualquier valor tipo ordinal
end;
procedure TForm1.Timer1Timer(Sender: TObject); //En el timer1
begin
case Mover of
1: // Mueve la bola a la izquierda y hacia arriba
begin
Bola.left:=Bola.Left - 20;
Bola.Top:=Bola.Top - 20;
// Si el gráfico alcanza el borde izquierdo del formulario, se mueve a la derecha y hacia arriba.
If Bola.Left <= 0 Then Mover := 2
// Si el gráfico alcanza el borde superior del formulario, se mueve a la izquierda y hacia abajo.
Else If Bola.Top <= 0 Then Mover := 4;
End;
2: // Mueve la bola la derecha y hacia arriba
begin
Bola.left:=Bola.Left + 20;
Bola.Top:=Bola.Top - 20;
{Si el gráfico alcanza borde derecho del formulario, se mueve a la izquierda y hacia arriba.
Se determina el borde derecho del formulario restando el ancho del gráfico del ancho del formulario.}
If Bola.Left >= (Form1.Width - Bola.Width) Then Mover := 1
// Si el gráfico alcanza el borde superior del formulario, se mueve a la derecha y hacia abajo.
Else If Bola.Top <= 0 Then Mover := 3;
end;
3: // Mueve la bola a la derecha y hacia abajo
begin
Bola.left:=Bola.Left + 20;
Bola.Top:=Bola.Top + 20;
// Si el gráfico alcanza el borde derecho del formulario, se mueve a la izquierda y hacia abajo.
If Bola.Left >= (Form1.Width - Bola.Width) Then Mover := 4
// Si el gráfico alcanza el borde inferior del formulario, se mueve a la derecha y hacia arriba. Se
determina el borde inferior del formulario restando la altura del gráfico de la altura del formulario menos 680
twips debido a la altura de la barra de título la barra de menús.
Else If Bola.Top >= (Form1.Height - Bola.Height) Then Mover := 2;
End;
4: // Mueve la bola a la izquierda y hacia abajo
begin
Bola.left:=Bola.Left - 20;
Bola.Top:=Bola.Top + 20;
// Si el gráfico alcanza el borde izquierdo del formulario, se mueve a la derecha y hacia abajo.
If Bola.Left <= 0 Then Mover := 3
// Si el gráfico alcanza el borde inferior del formulario, se mueve a la izquierda y hacia arriba.
Else If Bola.Top >= (Form1.Height - Bola.Height) Then Mover := 1;
End;
Variantes y mejoras:
Este protector de pantalla puede convertirse en un juego de habilidad (mezclado con el anterior) si al pulsar doble clic
sobre el objeto (que puede ser una imagen) cuenta los golpes y a su vez se acelera el objeto.
Ofimega acadèmies Manual Ejercicios - Programación Rad Studio Delphi Imp - dic-18 Pág 29
Animación. (Juego Ping) Avanzado Firemonkey
var if b = 0 then //si hay colisión con segunda pala
Form1: TForm1; bajando....puntua
p1x, p1y, p2x, p2y, p3x, p3y: real; //posic. de los begin
recuadros label4.Text := inttostr(strtoint(label4.text) + 1);
b: byte; end;
modowin:boolean; b := 1;
mx,my:integer; //posic. del mouse end;
procedure TForm1.ButtonPausaClick(Sender: TObject); if p1y > form1.Height then //toca fondo pierde
begin begin
Timer1.Enabled := False ; b := 1; //pone en modo subir
Timer2.Enabled := False ; p1y := form1.Height - 63;
Timer3.Enabled := False ; p1x := form1.Width / 2;
Timer4.Enabled := False ; if strtoint(label4.Text) > strtoint(label2.Text) then
buttonSalir.Visible := True ; label2.Text := label4.Text; //fija la máxima puntuación y pone
buttonIniciar.Visible := True ; puntos a cero.
end; label4.Text := '0';
end;
procedure TForm1.ButtonIniciarClick(Sender: TObject);
begin if b = 1 then //si esta en modo subir
Timer1.Enabled := True ; begin
Timer2.Enabled := True ; p1y := p1y - 5; //resta posición vertical
Timer3.Enabled := True ; if modowin=false then //si esta jugando en android
Timer4.Enabled := True ; controla con el sensor
buttonSalir.Visible := False ; begin
buttonIniciar.Visible := False ; if (rectangle1.Position.X + 20 *
{$IFDEF MSWINDOWS} motionsensor1.Sensor.AccelerationY < form1.Width) and
modowin:=true; //si es windows (rectangle1.Position.X + 20 *
{$ELSE} motionsensor1.Sensor.AccelerationY > 0) then
modowin:=false; //si no es windows p1x := rectangle1.Position.X + 20 *
{$ENDIF} motionsensor1.Sensor.AccelerationY;
end; end
else //si esta jugando en windows
procedure TForm1.FormCreate(Sender: TObject); begin
begin if (mx - p1x) > Rectangle1.Width then p1x :=
Timer1.Enabled:=False; rectangle1.Position.X + 5 //mouse a la derecha
Timer2.Enabled:=False; else if (mx - p1x) < 5 then p1x :=
Timer3.Enabled:=False; rectangle1.Position.X - 5; ////mouse a la izda
Timer4.Enabled:=False; end;
p1x := form1.Width / 2; //situa al centro inferior end;
p1y := form1.Height-20;
end; if b = 0 then //si esta en modo bajar
begin
procedure TForm1.FormMouseMove p1y := p1y + 5; //suma posición vertical
begin if modowin=false then
mx:=round(x); begin
my:=round(y); if (rectangle1.Position.X + 20 *
end; motionsensor1.Sensor.AccelerationY < form1.Width) and
(rectangle1.Position.X + 20 *
procedure TForm1.Timer1Timer(Sender: TObject); motionsensor1.Sensor.AccelerationY > 0) then
begin p1x := rectangle1.Position.X + 20 *
rectangle1.Position.X := p1x; //mueve los objetos motionsensor1.Sensor.AccelerationY;
rectangle1.Position.Y := p1Y; end
rectangle2.Position.X := p2X; else //si esta jugando en windows
rectangle2.Position.Y := P2Y; begin
rectangle3.Position.X := p3X; if (mx - p1x) > Rectangle1.Width then p1x :=
rectangle3.Position.Y := P3Y; rectangle1.Position.X + 5 //mouse a la derecha
Application.ProcessMessages; //procesa pero espera a que se else if (mx - p1x) < 5 then p1x :=
acabe la tarea anterior rectangle1.Position.X - 5; ////mouse a la izda
end; end;
end;
procedure TForm1.Timer2Timer(Sender: TObject); end;
var
a: integer; procedure TForm1.Timer3Timer(Sender: TObject); //mueve la
begin pala 1 aleatoriamente
if p1y < 0 then begin
begin p2y := form1.Height / 1.3;
b := 0; //modo bajar p2x := rectangle2.Position.X - 10;
p1y := p1y + 15; if rectangle2.Position.X < -150 then
end; begin
if ((trunc(p1y) < trunc(p3y) - rectangle1.Height)) and p2x := form1.Width;
((trunc(p1y) > trunc(p3y) - rectangle1.Height - 5))and (p1x > timer3.Interval := Random(150)+10;
p3x - rectangle1.Width / 1.3) and (p1x < p3x + end;
(rectangle3.Width - rectangle1.Width) + rectangle1.Width / end;
1.3) then
begin procedure TForm1.Timer4Timer(Sender: TObject); //mueve la
if b = 0 then //si hay colisión con primera pala pala 2 aleatoriamente
bajando....puntua begin
begin p3y := form1.Height / 1.3;
label4.Text := inttostr(strtoint(label4.text) + 1); end; p3x := rectangle3.Position.X + 10;
b := 1; if rectangle3.Position.X > form1.Width + 150 then
end; begin
p3x := - 150;
if ((trunc(p1y) < trunc(p2y) - rectangle1.Height)) and timer4.Interval := Random(150) + 10;
((trunc(p1y) > trunc(p2y) - rectangle1.Height - 5))and (p1x > end;
p2x - rectangle1.Width / 1.3) and (p1x < p2x + end;
(rectangle2.Width - rectangle1.Width) + rectangle1.Width /
1.3) then
begin
Delphi. Ejercicio 5 . Movimientos y contadores. 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 bulbon.bmp
Name: Label2
Enabled: True Comp: Panel2
Caption: 0 Comp: Panel3
taRightJustify Align: alLeft Align: alBottom
Bevelouter: bvLowered
Caption: Aciertos
Preparación: Alignment: taLeftJustify
var
MainForm: TMainForm;
subir:integer; // => Variable pública para controlar el sentido subir será numérica entera
Acciones:
El timer1 se encarga de desplazar la flecha hacia la derecha y comprueba si su posición 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;
Ofimega acadèmies Manual Ejercicios - Programación Rad Studio Delphi Imp - dic-18 Pág 31
El timer2 se encarga de desplazar arriba y abajo la bombilla, (según si la variable subir esté a 0 o 1):
procedure TMainForm.Timer2Timer(Sender: TObject);
begin
if subir=0 then {si no está activado subir…}
begin
if bombilla.top<200 then {si no pasa de 200 de profundidad que siga bajando}
begin
bombilla.top:=bombilla.top+1;
bombilla.picture:=bombilla1.picture; {por si está encendida, que se apage}
end
else {si pasa de 200 de fondo...}
subir:=1 {que se active subir}
end
else {si está activada subir..}
begin
if bombilla.top>0 then {y si aún no está arriba...}
bombilla.top:=bombilla.top-1 {que siga subiendo}
else {si ya ha llegado arriba...}
subir:=0 {que se descative subir}
end
end;
Al empezar el programa, la variable subir debe de valer algo (cero por ejemplo)
procedure TMainForm.FormCreate(Sender: TObject);
begin
subir:=0; {empieza con subir desactivado}
end;
Al hacer clic sobre la flecha se activa el timer (o también se puede hacer sobre un botón)
procedure TMainForm.flecha1Click(Sender: TObject);
begin
timer1.enabled:=true; {al hacer clic con el ratón que se active el timer1}
end;
Variantes y mejoras:
Conexión a Internet.
1.- Crea un botón que nos conecte con la página web de soporte del programa:
Añade la siguiente línea de código:
Panel1
Name: Empezar
Name:Inicio
Name: Salir
Name:Parar Shape1
stCircle
Timer 1
Pamel2. Bottom Interval=50
Panel3.Bottom
Shape2
Tscrollbar
Label 1 Componente: vertical
Tbiagauge Name: Barrav
Name: Nivelh Max: 10
Max-Min: +10 -10 Min: -10
Tscrollbar
Horizontal
Name: Barrah
progressbar progressbar
Name: Nivelv y nivelh Name: Energía
Max-Min: +10 -10 0 - 100
Procedures:
Variantes:
• El fondo de la ventana será de color negro y se añadirán 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 añadirán asteroides que resten puntos y/o desvíen la nave de su ruta.
• Finalizará el juego al coincidir el objeto con las coordenadas de la base lunar.
• Puedes sustituir las barras de dirección por botones Updown de la paleta Win32 o sustituirlos por
ArcDial y TrackBar el en Firemonkey
Variante para que no se salga la nave de los límites de la ventana a incluir en el procedimiento del timer:
If Shape1.Left<0 then Shape1.Left:=299;
If Shape1.Left>300 then Shape1.Left:=1; ->Idem para control arriba y abajo con la propiedad top
Notas:
• Hemos creado un procedimiento independiente para comprobar si se sale del borde, por lo tanto hay que declararlo
en la lista de declaración de procedures: procedure ComprobarBordes();
• La acción para el evento ScrollHChange es la misma que para ScrollVChange
• La acción para el evento DialHChange es la misma que para DialVChange
Ejecuta y prueba (Run). Si todo es correcto, Guarda todo (File Save All): Unit: Editor1 - Proyecto: Editor
Procesar textos en Multidevice (Firemonkey)
Utilizamos el componente Memo1 en modo móvil/Firemonkey para editar e imprimir texto:
Para Imprimir en modo Firemonkey añadir la librería
FMX.Printer y utilizar las funciones begindos y
enddoc
Ejercicio para imprimir:
procedure TForm2.Impri1Execute(Sender: TObject);
var
MyRect: TRectF; //recuadro area de impresión
i:integer;
begin
if PrintDialog1.Execute then
with Printer do
try //Intenta si puede
BeginDoc; {iniciamos documento a imprimir
Printer.ActivePrinter.SelectDPI(1200, 1200);
Una ventana Madre (MDI) contendrá varias ventanas hijas (Child). Para ello debmos cambiar la propiedad FormStyle a:
fsMDIform para la ventana madre y fsMDIChild para la ventana hija. Luego, en Project – Options, poner la ventana Hja en la
lista de available. Esta es la ventana Madre:
Mainmenu1
GroupIndex: 0
OpenFileDialog
Ventana:
Name: Madre (GroupIndex: 9)
FormStyle:fsMDIForm Cascada: Cascade;
Mosaico: Tile;
Salir: (GroupIndex: 9) Organizar iconos:
ArrangeIcons;
procedure THija.Abrir1Click
begin
madre.Abri1(Sender); procedure THija.FormClose(al cerrar la ventana hija)
end; begin
Action := caFree; (para que pueda ser cerrada por
procedure Hija.Salir1Click; la madre)
begin end;
madre.Salir1Click(Sender);
end; procedure THija.FormCloseQuery(acción antes de
cerrar)
var
DialogValue: Integer;
procedure THija.Imprimir1Click; FName: string;
var begin
if PrintDialog.Execute then if Memo1.Modified then
memo1.Print(FileName); begin
end; Confirma.showmodal; ->Muestra ventana confirma
FName := Caption;
procedure THija.Impresora1Click(Sender: TObject); Confirma.Label2.Caption:='¿Grabar '+Fname;
begin case Confirma.Modalresult of
PrinterSetupDialog1.Execute; mrOK: Save1Click(Self);
end; mrCancel: CanClose := False;
end;
Procedure Guardar end;
if (Filename = '') or IsReadOnly(Filename) then end;
GuardarcomoClick(Sender)
else
begin
Memo1.Lines.SaveToFile(Filename);
Memo1.Modified := False;
procedure THija.Nuevo1Click
procedure THija.Guardarcomo1Click(Sender: begin
TObject); Modifica.Caption:='Otro documento nuevo';
begin madre.Nuevo(Sender);
SaveFileDialog.Filename := Filename; end;
if SaveFileDialog.Execute then
begin procedure THija.Cerrar1Click
Filename := SaveFileDialog.Filename; begin
Caption := ExtractFileName(Filename); Close;
Modifica.Caption:=' ';{retira mensaje} end;
Save1Click(Sender);
end;
end;
procedure THija.Save1Click(Sender: TObject); procedure THija.NegritaClick(Sender: TObject);
begin begin
if PathName = DefaultFileName then if Negrita.Down then MEMO1.Font.Style :=
Guardarcomo1Click(Sender)
MEMO1.Font.Style + [fsBold]
else
else MEMO1.Font.Style := MEMO1.Font.Style -
begin
[fsBold];
Editor.Lines.SaveToFile(PathName);
end;
Editor.Modified := False;
end;
end;
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 39
ActionList y ActionManager: Procesador de textos utilizando el componente ActionList
Escoge: Archivo – Nuevo proyecto VCL (o VCL Forms application)
Cambia la propiedad: Form1.caption = Editor de textos
Añadir componentes al formulario:
- Añadiremos un componente RichEdit de la paleta win32.
Una vez sobre el formulario cambiar la propiedad align a client.
- Pulsa doble clic en el componete StatusBar de la paleta win32 y este
se añadirá abajo del formulario como barra de estado.
Para crear un panel en la barra de estado:
En la propiedad SimpleText -> escribir: Sin título.txt.
En la propiedad Panels abrir el cuadro de Panels
Clic en el botón New para añadir un panel a la barra de estado
statusbar1. Cierra el cuadro.
- Añadir menú y barra de herramientas:
De la paleta estandar escoge el componente: Mainmenú1
De la paleta Win32 escoge el componente: ToolBar
Agrupar acciones mediante Action list:
Para agrupar las acciones del menú y de la barra de herramientas Delphi proporciona un “action manager” para
centralizar ambos códigos e imágenes.
En la paleta adicional, haga doble clic en el componente: ActionManager o en la paleta estandar: action list. Para añadirlo
al formulario. Como es un componente no visual, se puede poner en cualquier sitio.
Para ver los captions de componetes no visuales escoga: Tools - Environment Options, clic en Designer page, y
seleccionar: Show component captions, OK..
Menu Comando Herramientas? Descripción
Archivo Nuevo Sí Creates a new file.
Archivo Abrir Sí Opens an existing file for editing.
Archivo Guardar Sí Saves the current file to disk.
Archivo Guardar No Saves a file using a new name (also lets you save a new
como… file using a specified name).
Archivo Salir Sí Quits the editor program.
Edición Cortar Sí Deletes text and stores it in the clipboard.
Edición Copiar Sí Copies text and stores it in the clipboard.
Edición Pegar Sí Inserts text from the clipboard.
Ayuda Contenido No Displays the Help contents screen from which you can
access Help topics.
Ayuda Indice No Displays the Help index screen.
Ayuda Acerca.. No Displays information about the application in a box.
Doble-clic en Action list para abrirlo
En Editing Form1.ActionManager1 pulsar el botón: New Action. En sus
propiedades escribir:
Caption = &New
Category = Archivo
Hint = Crea un archivo nuevo
ImageIndex = 6 (imagen 6 de ImageList)
Name = FileNew
Pulsar el botón: New Action. En sus propiedades escribir:
Caption = &Guardar
Variante: ActionManager
Category = Archivo
Hint = Guarda el archivo
Similar a Actionlist, tenemos el componente:
ImageIndex = 8 (imagen 8 de ImageList)
ActionManager en la paleta Adicional. Va en
Name = FileSave
combinación con Actionmainmenú y Actiontoolbar.
Pulsar el botón: New Action. En sus propiedades escribir:
Permite la apariencia Office XP y permite
Caption = &Indice
personalizar las barras de herramientas y el menú
Category = Ayuda
en tiempo real, con el componete: CustomizeDlg.
Hint = Indice ayuda
Name = HelpIndex
Pulsar el botón: New Action. En sus propiedades escribir:
Caption = &Acerca…
Category = Ayuda
Hint = Acerca de… Name = HelpAbout
Añadir acciones estandar al acion list (open, save as, exit, cut, copy, paste, help)
Pulsar el botón derecho del mouse a escoger del menú
contextual: añadir New estándar Action: Añadir las acciones:
TEditCut, TEditCopy, y TEditPaste. Se creará la categoría Edit
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
Añadir un menú:
De la paleta estandar escoge el componente: Mainmenú1 y pulsa
doble clic, para añadirlo al formulario.
Puedes usar el botón derecho del mouse sobre el menú para añadir
elementos al menú desde la plantilla: Insert from template. O añadir
los elementos manualmente usando el botón derecho del mouse
sobre el menú y escoger Insert.
procedure Tform1.ConsultarNombre;
begin
estudiante:=Testudiante.create;
estudiante.Nombre:=Edit1.Text;
estudiante.Apellido:=Edit2.Text;
estudiante.Asignatura:=Edit3.Text;
Showmessage('Estudiante: '+ Estudiante.nombre + ' ' + Estudiante.Apellido);
estudiante.Destroy; // para liberar memoria
end;
Firemonkey – Delphi
PajaroFlag: Boolean;
RectangleMouseDown:
begin
if Timer1.Enabled=true then
begin
if pajaro.Position.Y<75 then pajaro.Position.Y:=0
else pajaro.Position.Y:= pajaro.Position.Y-75;
end;
pajaro.RotationAngle:=0;
Timer1Timer:
if PajaroFlag=False then
begin
Pajaro.Bitmap.Assign(PajaroB.Bitmap);
PajaroFlag := True;
end
else
begin
Pajaro.Bitmap.Assign(PajaroA.Bitmap);
PajaroFlag := False;
end;
Comprueba que que permite añadir y borra datos en la tabla, pero estos se pierden al volver a ejecutar la
aplicación.
Cierra prueba y uelve al diseño y selecciona la tabla1 asigna la propiedad a la Tabla1: filename: Agenda.xml
(también pedes asignarla en tiempo de ejecución)
Añade 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 as…Crea una carpeta llamada Agenda y guarda la unidad como: Agenda1.pas y
el proyecto como Agenda.dpr
Label1
Edit1 Panel1 DBNavigator1
Evento OnChange: Datasource:Datasource1
Edit1change
Dbgrid1
Datasource: Datasource1
Table1 o Clientdataset
TableName: Agenda.dbf
Datasource1
O Filename: Agenda.xml
Dataset: Table1 o
Clientdataset Mainmenu Active: True
StatusBar: 1
Name: Barraestado
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 47
- 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 código:
Edit1Change
Tabla1.setRangeStart;
Tabla1.FieldByName('Apellidos').AsString:=Edit1.Text;
Tabla1.Applyrange;
Procedures:
visibleClick:
CreateForm (asigna la table en tiempo de ejecución)
if visible.Checked then Form1.FormStyle :=
Table1.tablename:= ‘Agenda.dbf’ //para DBF
fsStayOnTop
o Tabla1.filename:=’Agenda.xml’ // para XML
else Form1.FormStyle := fsNormal;
end;
Application.OnHint :=muestrahints;
Tranparenteclick:
if tranparente.Checked then
Edit1Change
Form1.alphablend:=true;
Tabla1.SetrangeStart;
Tabla1.FieldByName('Apellidos').AsString:=Edit1.Text;
Tabla1.Applyrange;
//=>Mostrar infomación en barra de estado:
Salir1Click Procedure muestrahints
Close; Barraestado.Caption := Application.Hint;
Variantes al ejercicio:
Ordenar la tabla:
▪ Si tienes instalados los componentes JVCL puedes cambiar el dbgrid por un JVultimdbgrid que te permite ordernar
la tabla al pulsar en el encabezado del campo.
Crear acceso con password.
• Añade una ventana tipo Pasword que pida la clave antes de entrar:
File – New – Other –(Delphi files o Dialogs) – Password dialog
• En (Project - Options - Autocreate forms): Cambiar el orden para que se muestre
primero la ventana de Password antes que la principal (main).
Si la respuesta es correcta, habilitar el botón OK que mostrará la ventana principal Form1.
Opción1: Añadir la unit1 de la ventana principal a la lista de uses del password y llamarla con form1.show
Opción2:
PasswordChange:
If Password.text= ’ofimega’ then Okbtn.enabled:=true;
Okbtnclick:
// -> Opción 1
Application.CreateForm(Tform1, form1);
//-> Opción 2:
form1.Show; // -> muestra la ventana form1
hide; // -> oculta la ventana atual
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:
Complementos: Para realizar las pruebas y comparaciones puedes añadir al formulario un DBNavigator y un DBGRid
ambos conectados con el Datasource1
Acceso a datos.
Desde Access creamos la base de datos Testwin con 3 tablas: Acceso,
Preguntas y Temas y los siguientes campos:
▪ Acceso: Usuario – Clave – Permiso
▪ Temas: ID – Tema
▪ Preguntas: Tema, Dificultatd, T1, R1, R2, R3 $4, Sol, Comen, Imagen
Página Sesión
En el formulario, añadimos los objetos
de datos de la imagen.
Pestaña de acceso:
Añadimos dos gropubox
Destinado a iniciar sesión de usuario o crear
nuevo usuario.
En cada uno de ellos insertamos dos cuadros
de texto (edits) y dos botones (buttons) como
en la figura.
El segundo groupbox, se establece visible =
false.
Al pulsar el botón BNuevo del primer
groupbox1 se mostrará el segundo y ocultará
el primero:
procedure TForm1.BNuevoClick(…);
begin
GroupBox2.Visible:=True;
GroupBox1.Visible:=False;
end;
Página trasera
Es la página de administración de preguntas y se accede a ella con privilegios de admninistrador. En ella podemos crear y
modificar preguntas. Añadimos los controles con los nombres que se muestran en la imagen:
Página frontal
En la pestaña frontal, añadir los controles con los nombres que se muestran en la imagen:
Formulario: En la paleta DataControls, añadir al formulario un Dbgrid, y en su propiedad datasource: poner datasource1.
Añadir el gráfico:
• Delphi 7: De la paleta Datacontrols, añadir un componente: DBChart.
• Delphi XE7: De la paleta: TeeChartLit, añadir un TDBChart
Pulsar doble clic y en la solapa series poner como en la figura.
En la solapa Chart, Añadir la serie1 (Add) tipo Bar como en figura.
En la pestaña Datasource: Seleccionar Dataset y elegir el Dataset de nuestra tabla de datos.
• Ejercicio propuesto1: Añadir un campo calculado a la tabla Decil y cuartil . En el evento: OnCalcFields de la tabla
escribir: Table1Decil.value:=table1porciento.Value/10;
• Table1Cuartil.value:=table1porciento.Value/25;
• Ejercicio propuesto2: 2: Añadir un componente WebBrowser: En el Form1.Oncreate:
dire:=ExtractFilePath(ParamStr(0)); WebBrowser1.Navigate('file://'+dire+'estadistica.htm');
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 53
PROGRAMA DE RECETAS DE COCINA PARA DELPHI. (Uso de Datos y los TabsSheets)
Prepara una carpeta llamada Recetas.
• Para DBF-MDB: Crear un archivo DBF (Data Base File) o MDB (Access) con la estructura de la imagen, con un índice
indexado por el campo Titulo y guarda la tabla con el nombre: RECETAS en la carpeta Recetas.
• Para XML:
Añade el componente
ClientDataset y con el botón
derecho agrega los campos
de la imagen.
Crea el Dataset y gurarda la
Database con el nombre:
RECETAS.XML en la carpeta
Recetas
Crea los índices el la
propiedad: Indexdef
• Añadir un nuevo formulario sólo para datos (Módulo de datos) del menú: New – Form – Datamodule. Llamado DM
• Añadir al datamodule DM, los componetes: Table1 (o ClientDataset con el nombre Table1) y el
componete Datasource1 cambiando su propiedad Dataset: Table1
• Asignar a la table1 la propiedad (TableName o FileName) nombre del
archivo Recetasdbf o recetas.xml según la base de datos.
• En modo DBF: añadir a la Table1 todos los campos (botón derecho)
• En el formulario principal (File – Project manajer – Form1) asignar la
propiedad Name: Receta.
• Modificar el formulario como en la figura inferior:
En él añadir:
- Una Toolbar y una Statusbar (Win32)
- Un panel alineado a la derecha con un
Splitter (Additional) a su izquierda.
- Un Pagecontrol (win32) a la
izquierda alineado al cliente.
Sobre el Pagecontrol1, pulsar el botón
derecho del mouse y escoger: New
page y crear 9 solapas (TabSheets).
Asignar a la propiedad caption de cada
TabSheet los nombres que se
muestran:
Entrantes, Vegetales, Pastas, carnes,
etc…
En cada pestaña, añadir los
componentes: 3 dbedits, 1
DBcombobox y 2 dbmemos como en la
figura izquierda.
En el panel derecho añadir un
componente DBgrid Align al cliente.
Asignar las propiedades para cada componente DB, el Datasource: Datasource1 y el Datafiled el campo que le
corresponda.
En la barra de herramientas toolbar con el botón derecho crear 3 nuevos botones y añadir un DBNavigator.
CODIGO FUENTE del programa de recetas:
var
Receta: TReceta; //->nombre de la ventana o formulario
procedure TReceta.TabSheet9Enter(Sender…
var filtro: string; //-> variable de texto begin
contar('recetas');
procedure TReceta.PageControlChange(Sender: TObject); end;
begin
DM.table1.filtered:=true;
procedure TReceta.PageControl1Enter(Sender…
Edit1.text:='';
begin
DM.Table1.CancelRange;
contar('Recetas');
if PageControl1.activepage =tabsheet1 then
end;
Filtro:='''Entrantes''';;
if PageControl1.activepage =tabsheet2 then
Filtro:='''Vegetales'''; procedure TReceta.contar(Sender:string);
if PageControl1.activepage =tabsheet3 then begin
Filtro:='''Carnes'''; Receta.StatusBar1.panels[1].text:=sender+ ':
if PageControl1.activepage =tabsheet4 then ' + inttostr(dm.Table1.RecordCount);
Filtro:='''Pescados'''; end;
if PageControl1.activepage =tabsheet5 then
Filtro:='''Mariscos''';
if PageControl1.activepage =tabsheet6 then Filtro:='''Varios''';
if PageControl1.activepage =tabsheet7 then Filtro:='''Postres''';
if PageControl1.activepage =tabsheet8 then Filtro:='''Pastas''';
if PageControl1.activepage =tabsheet9 then
Begin
procedure TReceta.Edit1Change(Sender…
DM.table1.filtered:=False;
Var
Filtro:='''Completo''';
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.Text;
end;
DM.Table1.ApplyRange;
end;
procedure contar(Sender: TObject);
begin
Receta.StatusBar1.panels[1].text:=inttostr(dm.Table1.RecordCount);
end;
Impresión:
• Imprimir el formulario (ventana) : Añadir componente: Printdialog de la paleta Dialogs y en el botón imprimir escribir el
código: if PrintDialog1.execute then print;
• Imprimir informe de datos: Utilizar el diseñador de informes Rave report o Qreport explicados en el siguiente tema.
Guarda el proyecto con el nombre: Recetas (también la ventana/unidad recetas1 y la ventana/datamodule dm)
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 55
INFORMES de impresión de datos (reports)
a) Crear un informe con RaveReports
Truco: Cambiar el formulario de vista previa a español: Busca en la carpeta: Rave5\Lib los
formularios:
RPFormPreview.FRM y RPFormSetup.FRM y ábrelos desde Delphi.
Opcional: Puedes añadir también un componente: RVSystem al formulario de recetas y que enlazará con la
propiedad Engine del objeto RaveReport. Este componente te permitirá especificar los parámetros de impresión
y vista previa deseados.
Truco: Para cambiar la ventana a español, abre el formulario: QRPrev.DFM en la carpeta: DELPHI\LIB
LENGUAJE SQL EN DELPHI
Manipulación de Datos mediante lenguaje SQL: SELECT, INSERT, UPDATE, DELETE
SELECT: Extrae datos de una o más tablas indicando los campos (o columnas) separados por comas.
El asterisco (*) sustituye a todos los campos
2.- Especifica valores a insertar mediante el estado SELECT: INSERT INTO FACTURARENGLON
(FACNO, NOMBRECLIENTE, CIUDAD, ESTADO)
este INSERT se combina con otro SELECT para copiar los SELECT 99, ITEMNO, DESCRIPTION, PRECIO_USD FROM
renglones de la factura número dos y ponerlos en la factura FACTURARENGLON WHERE FACNO = 2
número 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'
Substitución de variables:
En Delphi, cuando se añade una palabra precedida por un signo de dos puntos (:), la palabra es automáticamente
convertida en un parámetro, 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 línea que asigna el parámetro añade un signo de
porcentaje (%) al final:
qryClientes.ParamByName('Apellido').AsString := dlgConsulta.edtApellido.Text+'%';
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 57
Ejercicio de consulta de datos con SQL
• Crea una aplicación nueva en Delphi. File New Aplication.
• De la pestaña 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 parámetro. En la propiedad Params pulsa doble clic y pon su Datatype a string
• A continuación, vaya a la propiedad "RequestLive" de su Query y póngala 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 continuación verás una ventana vacía. 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 añadir 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.
Groupbox
Edit1
Dbedit
7. Para relacionar
facturas con artículos
debemos volver al
DM y elegir en
mastersource de
artículos 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. Añadir 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
Table_articulosPVP.Value:=Table_articulosprecio.Value*(1+Table_facturasiva.Value/100);
Cálculo automático: Por último, para calcular automático, añadir al evento del la table_articulos: AfterPost:
Table_articulosAfterPost: Form1. Calcular1Click(nil); //→ llama al procedure sin sender
Mejoras:
• Añadir 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 número de factura: Como no existe del tipo Autonumerico en Dbase, no vale con cambiar
el Autogeneratevalue a AutoInc sino escribir el código:
Var pública en el Data module: Numero:single:
Table_facturasBeforeInsert: Table_facturas.last;
Numero:=Table_facturasNUM_FACT.value;
Table_facturasAfterInsert: Table_facturasNUM_FACT.value:=numero+1;
Añadir al formulario los botones: Adelante , atrás primero último, añadir y borrar.
Cómo crear una consulta (Query) SQL para relacionar dos tablas por un campo en común: Véase lenguaje SQL
Pasos previos para el ejercicio: en este manual
• Crear un directorio C:\FACTU ( o similar)
• Utilizar la herramienta Data Base Desktop para crear previamente las tablas de bases de datos: FACTURA.DBF y
ARTI.DBF cuyo campos mínimos sean:
ARTI."REFER",
FACTURA."NUM_FACT", ARTI."DESCRIPCIO",
FACTURA."FECHA_FAC", ARTI."CANT",
FACTURA."COD_CLIENT", ARTI."DESC",
FACTURA."IVA", ARTI."PRECIO",
ARTI."NUM_FACT",
Table2
DataSource2
DataSource1 DataSet: Query2
DataSet: Table1
Campos
Calculados
Nota: En esta aplicación es posible añadir y modificar datos en factura, pero no en artículos. Para ello On Form create:
es necesario crear un botón para añadir artículo, que utiliza la table 2. Query1.Open;
Las consultas SQL no permiten modificaciones en la tabla relacionada si no tenemos RequestLive a
Query2.Open;
true. Por eso trabajaremos directamente sobre las tablas en página siguiente.
Botón calcular
procedure TFormfactu.Table1BeforeInsert
begin
table1.last;
numero:=table1num_fact.value;
end;
Cómo borrar la última factura
procedure TFormfactu.EliminarClick 2º sumar 1 al número de la última factura y
begin ponérselo a la nueva, también preparar la fecha
table1.last; de la factura con el día de hoy:
numero:=table1num_fact.value;
if MessageDlg('¿Eliminar la factura ' + floattostr(numero)+ procedure TFormfactu.Table1AfterInsert
'?', mtInformation, [mbYes, mbNo], 0) = mrYes begin
then table1.delete; table1num_fact.value:=numero+1;
end; table1fecha_fac.value:=date;
table1iva.value:=16;
estado.caption:='Añadida la factura num. ' +
floattostr(numero);
procedure TFormfactu.Table1AfterDelete; end;
begin
ShowMessage('Eliminada la factura num. ' +
floattostr(numero));
end;
Ejercicio Facturación. Cómo 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 botón derecho encima y elige añadir campos (coge todos). De esta manera se declaran en la unidad PAS todos los
campos y sus tipos.
A continuación 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 fórmula para el campo.
Presta atención 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 numérico.
También es posible crear campos calculados uniendo campos de texto. Ejemplo:
CustomersCityStateZip.Value := CustomersCity.Value + ', ' + CustomersState.Value + ' ' + CustomersZip.Value;
Cómo calcular la base imponible: La base imponible no es un campo calculado, pues es el resultado de la suma de varios
campos de varios registros mientras un campo calculado se obtiene de operar con campos de un mismo registro.
Método 1. Base imponible (suma de varios registros) como consulta SQL
Para ello se debe crear una consulta SQL e incluir las siguientes líneas de comando Strings. (Este método no es
aconsejado en este ejercicio pues las consultas SQL no permiten modificaciones sin RequestLive a true)
Método 2: Base imponible con un bucle While que sume consecutivamente y uno a uno cada registro y lo almacene
en una variable numérica.
Como este método es más lento (pero más flexible) es aconsejable crear un botón llamado "Calcular" cuyo
procedimiento al hacer clic sea el siguiente.
La visualización de la base imponible debe ser en un componente Label no Edit pues es más fácil y además no debe ser
modificable.
procedure TFormfactu.CalcularClick(Sender: TObject);
var
baseimpo: Real; {crea la variable numérica real donde se almacenará el resultado de la suma}
impiva: Real;
begin
baseimpo:=0.0;
impiva:=0.0;
table2.disablecontrols;
table2.first; {sitúa el puntero de registros al principio de la tabla}
while not table2.eof do {mientras no llege al End Of File...(final de la tabla) haz el bucle}
begin
baseimpo := baseimpo + table2importe.AsFloat; {suma la cantidad anterior más la de este campo}
table2.next; {salta al siguiente campo}
end;{repite el bucle}
table2.enablecontrols;
impiva:=baseimpo*table1iva.value;
labelbaseimpo.Caption :=Floattostr(baseimpo);
end;
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 63
Ficha Listado de facturas. Crear un filtro entre dos fechas.
ChekBox: Filtrar
Impresión de la factura:
1. Crear una nueva ventana QuikReport1
2. Añadir los apartados: QrBand, QrSubdetaill y GroupFooterBand1
3. Añadir los componentes: QRLabel para etiquetas o títulos y QRDbtext para los campos
4. Aplicar un filtro para que sólo se imprima una factura
QrBand. Tipo: Qtdetaill
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
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ComCtrls, ExtCtrls, Menus,
DBTables, DB, DBGrids, Mask, DBCtrls, dialogs, math, Grids;
var table2.last;
Formfactu: TFormfactu; table2.delete;
numero:double; end;
baseimpo: Real; table1.enablecontrols;
table2.enablecontrols;
uses empresa1, CLIENTES, Imprime1, Acerca; end;
2,- Externa, es el usuario quien construye el filtro o condición, usando un componente Edit para el filtro y un botón
de ordenes (OK) para que se ejecute y despliegue la tabla filtrada, el código en dicho botón es;
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;
Base datos tipo cliente - servidor Delphi: Interbase – Firebird - Mysql
En lugar de usar tablas locales tipo BD o mdb, utilizaremos una base de datos del tipo servidor como
Interbase (o su equivalente gratuita Firebird):
1. Instalar Interbase o Firebird en el PC: https://downloads.embarcadero.com/free/interbase
2. Crear la base de datos con IBconsole o con IBExpert
Herramientas visuales de Interbase: IBConsole:
El primer paso para utilizar IBConsole es registrar el servidor Interbase y conectar a servidores locales y
remotos.
Para registrar un servidor: seleccionar del menú Server | Register ... o Create…lo que mostrará la ventana
para conectarse a un servidor local o remoto.
Indicar si el servidor es local o remoto. Por defecto es local. En el caso que sea remoto, indicar el nombre del
servidor y el protocolo de red a utilizar. Si es TCP/IP se puede indicar la dirección IP en lugar del nombre.
Si se quiere registrar el servidor...
o Indicar un nombre de alias. En el caso de servidor local, el nombre es automático.
o Indicar una descripción para el servidor.
o Indicar que la información de alias debe ser almacenada.
Si se quiere conectar al servidor...
o Indicar el nombre de usuario (SYSDBA)
o Indicar la clave (masterkey)
La primera vez que entras a Interbase, el sistema tiene
predefinido un usuario
llamado SYSDBA que tiene todos los derechos de acceso en
Interbase. El
password de este usuario es inicialmente masterkey
Recuerda que el campo nombre no se puede duplicar por ser primary key.
Modificar datos:
Cambiamos el telefono con el siguiente código:
Update telefonos set telefono = ‘977351777’
IBExpert
Es una herramienta gratuita que se descarga desde la página de firebird y es un interfaz grafico para
manipular bases de datos y tablas de internase y firebird.
1. Descargar versión personal desde: http://ibexpert.net/ibe/index.php?n=Main.DownloadFree
2. Registrarte para que te envíen el password y nombre de usuario.
Introducirlos al ejecutar el programa.
3. Crear la base de datos:
Escoge del menú: Database Create database…
Introduce el nombre de usuario, password, versión de la base de datos y
lugar donde se guarda. Ver figura
4. Conectar la base de datos. Pulsa sobre el nombre de la base de datos de la
lista y escoge: Conect.
5. Crear la tabla: Pulsa el botón dercho del mouse sobre el elemento Tables y
escoge: New table…
Escribe el nombre de los campos, su tipo y tamaño en la pestaña: Fields:
Pulsa en Agregar
Indica el driver de Mysql ODBC
Para comprobar que todo está correcto, modifica la propiedad Active del TTable a True y verás en el DBGrid la
estructura de la agenda creada anteriormente.
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 69
El acceso a las bases de datos MySQL o SQLite y las creación de las tablas es
posible hacerlo muy fácilmente desde la pestaña DataExplorer.
Crear una nueva conexión y con el botón derecho encima seleccionar: New table.
Añadir los campos de texto: Nombre y teléfono de ancho 50 caracteres y guardar la tabla con el nombre Agenda.
Método 2:
Con esto nos aparecerá el dispositivo en el target de Android SDK. Pulsar doble clic
sobre él.
En el modo de emulación 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 (versión final).
2. En project - Options: En pestaña Uses permisions: Activar o desactivar las funciones deseadas para el dipositivo
(Acceso a cámaras o localización)
3. En project - Options: En pestaña Provisioning: Crear un certificado
4. En project – Deployment – pulsar el botón de la barra: Deploy.
5. Crear una cuenta de desarrollador de Google previo abono de 25 $.
Publicación en Google Play. Subir la APK
Para probar la emulación para IOS crearemos una aplicación básica para FireMonkey;
▪ Escoge: New > FireMonkey Desctopt Application o File > New > Other > Delphi Projects > FireMonkey HD Application.
▪ Añade, de la paleta Estandar, estos tres elementos al formulario:
- Tedit – Edit1
- TButton que diga “Hola”.
- TLabel que diga: “Introduzca su
nombre”
Probar la aplicación:
Pulsa el botón Run o elige del menú: Run – run para comprobar su funcionamiento.
Nota: Si tu FM RAD Studio corre bajo x86 (Win32) podrás compilar en 64 bits pero no
podrás ejecutarlo.
3º Selecciona Add…
para abrir la ventana de conexión con un equipo mac
por red.
▪ Crea un nuevo proyecto llamado Ruffini (File > New > Multidevice)
▪ Añade 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
▪ Añade el evento en el botón:
procedure TForm1.FormCreate(Sender);
var co:integer;
begin
for co := 0 to round(grado.Value) do
coef.Cells[co,0]:='0';
end;
▪ Añade el código:
▪ Compila en dispositivo: En el Project Manager, selecciona la plataforma Android y conecta un móvil Android al
Puerto USB. Recuerda activas las opciones del desarrollador (pulsando varias veces en el numero de
compilación) en el moóvil y tener instalado el driver ADB driver installer.
▪ Ejecutar y comprobar: Escoje Run > Run Without Debugging
▪ Guarda el Proyecto: Linterna y la unidad: Linterna1.
Mejoras: Añade 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
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 79
Sensores mobile. Localizador sensor (versión apaptada Samples)
▪ Crea un nuevo proyecto llamado Localizador (File > New > Multidevice application)
▪ Añade los components de la imagen:
▪ Añade el código:
▪ Compilar en el dispositivo: Conecta un móvil Android al Puerto USB y en el Project Manager, selecciona la
plataforma Android. Recuerda activas las opciones del desarrollador (pulsando varias veces en el numero de
compilación) en el moóvil y tener instalado el driver ADB driver installer.
▪ Ejecutar y comprobar: Escoje Run > Run Without Debugging
▪ Guarda el Proyecto: Localizador y la unidad: Localizador1.
Sensores mobile. Orientación sensor (versión apaptada Samples)
Propiedades:
OrientationSensor1SensorChoosing( end;
Sender: TObject; const Sensors: TSensorArray;
var ChoseSensorIndex: Integer); Timer1Timer(Sender: TObject);
var begin
I: Integer; lbTiltX.Text := Format('Tilt X: %f',
Found: Integer; [OrientationSensor1.Sensor.TiltX]);
begin lbTiltY.Text := Format('Tilt Y: %f',
Found := -1; [OrientationSensor1.Sensor.TiltY]);
for I := 0 to High(Sensors) do lbTiltZ.Text := Format('Tilt Z: %f',
begin [OrientationSensor1.Sensor.TiltZ]);
if botonInclinacion.IsPressed and lbHeadingX.Text := Format('Heading X: %f',
(TCustomOrientationSensor.TProperty.TiltX in [OrientationSensor1.Sensor.HeadingX]);
TCustomOrientationSensor(Sensors[I]).AvailablePr lbHeadingY.Text := Format('Heading Y: %f',
operties) then [OrientationSensor1.Sensor.HeadingY]);
begin lbHeadingZ.Text := Format('Heading Z: %f',
Found := I; [OrientationSensor1.Sensor.HeadingZ]);
Break; end;
end
else if botonOrigen.IsPressed and FormActivate(Sender: TObject);
(TCustomOrientationSensor.TProperty.HeadingX in begin
TCustomOrientationSensor(Sensors[I]).AvailablePr {$ifdef IOS}
operties) then {$ifndef CPUARM}
begin lbOrientationSensor.Text := 'Sin sensor';
Found := I; swOrientationSensorActive.Enabled := False;
Break; {$endif}
end; {$endif}
end; end;
Podemos usar dbExpress o FireDAC para conectarse a la Base de Datos. Para plataformas móviles, mejor
usar las bases de datos InterBase ToGo o SQLite. Pueden ejecutarse sobre dispositivos iOS y Android.
Escoge una nueva apliación (File > New > Multi-Device Application)
A Crear la base de Datos y la tabla en el Data Explorer
1. Ve al panel Data Explorer,
En el modo DBExpres: Click-derecho en el nodo SQLite
En el modo FireDAC : Click-derecho en el nodo SQLiteDatabase
Selecciona: Add New Connection:
2. Pon el nombre de la conexión,
Por ejemplo: Lista
Crear la Tabla
a. En el modo DBX:
En el Data Explorer, click-derecho en Tables, y luego seleccione New Table
desde el menú contextual
Escribe el nombre del campo: Elemento del tipo TEXTo y
guarda la tabla con el nombre: Lista.
b. En el modo FireDAC:
Añade al formulario un: TFDQuery y cambia las
propiedades:
Name property to FDQueryCreateTable.
SQL property: CREATE TABLE IF NOT EXISTS Item (Elemento TEXT NOT NULL)
Clic derecho en FDQueryCreateTable y escoge Execute.
c. Mediante un admintrador sqlite..
La antigua versión del navegador Mozilla Firefox, permite instalar el complemento: SQLite Manager.
Para ejecutarlo: Pulsa la tecla Alt para activar el menú del Firefox y escoge: Herramientas – SqliteManager.
Otra opción es descargar e instalar la aplicación gratuita: SQlite administrator de sqliteadmin.orbmu2k.de
Para crear la base de datos: Base de datos – Nueva base de datos: Notas, e indica la carpeta a guardar.
Para cear la tabla: Escoge del menú:
Tabla – Crear tabla. Utiliza los valores de
la figura.
SQL: CREATE TABLE "main"."lista"
("elemento" VARCHAR)
B Crear el formulario para Android:
1º. Suelta un TToolBar sobre el Formulario.
2º. Suelta un TButton sobre el componente ToolBar. Cambia las propiedades:
• Name: ButtonAdd.
• StyleLookup: addtoolbuttonbordered o mejor: addtoolbuttonbordered. Align Left – Margin: 2
3º. Suelta un TButton sobre el componente ToolBar. Cambia las propiedades:
• Name: ButtonDelete.
• StyleLookup: deletetoolbutton.
• Text: Borrar
• Visible a False. Align Right – Margin: 2
4º. Suelte un TLabel sobre el componente ToolBar. Cambia las propiedades:
• Align: alClient.
• StyleLookup: toollabel.
• Text: Lista o Lista de tareas
• TextAlign o TextSettings - HorzAlign: taCenter.
5º. Arrastra un componente TListBox sobre el formulario.
O un TListView. Cambia la propiedad: Align: alClient.
Conectando a los Datos
1º. Suelta la tabla Lista si no lo has hecho ya, para crear el componente TSQLConnection y TSQLDataSet en
el Formulario (en FireDAC: ListaConection y ListaTable o NotasConection y NotasTable)
2º. En el componente Connection del Formulario, tener la propiedad Connected en True.
3º. El componente Lista Table del Formulario y cambia la propiedad
Active a True.
4º. Selecciona View > LiveBindings Designer o
View >Tools o Tool Windows > LiveBindings Designer según
versiones.
O pulsa en la opción Bind Visually del ListBox
5º. Selecciona el elemento de la Lista y arrastra sobre ItemText del
Listbox1. Como en la imagen.
Opcional: Usar el asistente LiveBinding Wizard porque además te
añade un componente Navigator.
Hacer Visible el Botón Delete
Seleccione ListBox1 y defina el siguiente manejador de evento para el evento OnItemClick:
En Delphi: ButtonDelete.Visible := ListBox1.Selected <> nil;
En C++: ButtonDelete->Visible = (ListBox1->Selected != NULL);
Agregar Entrada a la Lista con el botón + add
Suelta un componente TSQLQuery (Si usas DBExpress) o un TFDQuery (si usas FireDAC) al formulario.
En el Object Inspector cambia la Propiedad Name a SQLQueryInsert y conecta con SQLConnection
Poner la propiedad SQL como se muestra: INSERT INTO lista (Elemento) VALUES (:Elemento)
En la propiedad Params, expande (…).
Selecciona el parámetro Elemento y cambia a tipo texto: DataType a ftString.
Pulsa en el formualrio, doble-click sobre el componente AddButton.
Añade el siguiente código para el evento OnClick:
procedure TForm1.ButtonAddClick(Sender: TObject);
var
Textoentrada: String;
begin
try
if InputQuery('Entre Nuevo elemento', '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
on e: Exception do
begin
ShowMessage(e.Message);
end;
end;
end;
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 91
En C++:
String caption = "Enter New Item";
String Prompts[1];
Prompts[0] = "Name:";
String Defaults[1];
Defaults[0] = "";
_di_TInputCloseQueryProc Met = new InputQueryMethod(&OnInputQuery_Close);
TDialogServiceAsync::InputQuery(caption, Prompts, 0, Defaults, 0, (TInputCloseQueryProc *)Met);
La función InputQuery muestra un cuadro de diálogo que pide al usuario final que introduzca un texto. Esta
función devuelve True cuando el usuario selecciona OK, así que usted puede agregar datos a la base de datos
sólo cuando el usuario selecciona OK y el texto contenga algunos datos
Eliminar una Entrada de la Lista con el botón Delete
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 botón Expand (...) sobre la propiedad Params.
• Poner el parámetro Elelemnto a DataType ftString.
3. En el Form Designer, doble-click al componente DeleteButton.
Agregue el siguiente código a este manejador de evento:
procedure TForm1.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
on e: Exception do
begin
SHowMessage(e.Message);
end;
end;
end;
En C++:
{
String TaskName = ((TListViewItem*)(ListView1->Selected))->Text;
try {
FDQueryDelete->ParamByName("Elemento")->AsString = TaskName;
FDQueryDelete->ExecSQL();
FDQuery1->Close();
FDQuery1->Open();
ButtonDelete->Visible = (ListView1->Selected != NULL);
}
catch (Exception &e) {
ShowMessage(e.Message);
}
Probar: Para realizar las pruebas de añadir y eliminar a la lista puedes realizarlas bajo la plataforma Win32
Antes de poder ejecutar la aplicación en el móvil, 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) o assets\internal\ (para Android).
4. Seleccione la columna Platforms (doble-click en el ellipsis [...] en la línea de Lista.db):
1. Asegúrese que iOS Simulator y iOS Device o Android están presentes para Lista.db
2. Quita Win32 desde la lista si está presente (no hay que copiar archivos de base de datos para Win32).
5. Cambia el combo desplegable superior a: All-Configurations - iOS Device platform o All-Configurations -
Android platform y asegúrese que Lista.db está lista se inicia en StartUp\Documents\ o assets\internal.
Especificando la Ubicación de la base de datos SQLite sobre el Dispositivo Móvil
1. En el Form Designer, seleccione el componente Lista.
2. En el Object Inspector, doble-click al evento BeforeConnect.
3. Añada el siguiente código al manejador de evento:
procedure TForm1.SQLConnectionSQLiteBeforeConnect(Sender: TObject);
begin
{$IF DEFINED(iOS) or DEFINED(ANDROID)} //si la plataforma es IOS o Android ...
Notas.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath,'Notas.s3db');
//-> O ...
FDConnection1.Params.Values['Database'] :=
TPath.Combine(TPath.GetDocumentsPath, 'shoplist.s3db');
{$ENDIF}
end;
Agrega System.IOUtils en la uses clause de tu unidad para el registro TPath.
Añadimos una Toolbar con dos botones para Cancelar y Guardar, como
en la imagen. Con los siguientes códigos:
Para Guardar: if tareasTable.State in [dsEdit,dsInsert] then
tareasTable.Post;
TabControl1.ActiveTab:=Tabitem1;
Para Cancelar: tareasTable.Cancel;
TabControl1.ActiveTab:=Tabitem1;
Si existe error de DEF en la conexión FireDAC: Quitar ConectionDefName y poner una ConectionName en la
TareasConnection y en la Conectionname de la TFDquery con el mismo nombre.
Es recomendable generar la conexión en ejecución:
with TareasConnection do
begin
Params.Clear;
DriverName:= 'SQLite';
Params.Values['Database']:=System.Ioutils.TPath.Combine(System.Ioutils.TPath.GetHomePath(), 'Tareas.sdb');
Connected:= True;
end;
TareasTable.SQL.Text:='SELECT * FROM Tareas';
TareasTable.Active:=true;
Ofimega Manual Ejercicios - Programación DELPHI Rev - dic-18 Pág 95
Procedimientos y funciones básicas - Delphi (alfabético)
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.
Random Returns a random number. StrLFmt Formats a series of arguments and the result
Randomize Initializes the built-in random number contains a pointer to the destination buffer.
generator with a random value. StrLIComp Compares two strings, up to a maximum
Read For typed files, reads a file component into a length, without case sensitivity.
variable. For text files, reads one or more StrLower Converts a string to lower case.
values . StrMove Copies characters from one string to another.
ReadBuf Inputs a line from the CRT window. StrNew Allocates a string on a heap.
ReadKey Reads a character from the keyboard. StrPas Converts a null-terminated string to a Pascal-
Readln Executes the Read procedure, then skips to style string.
the next line of the file. StrPCopy Copies a Pascal-style string to a null-
ReAllocMem Deallocates a block from the heap. terminated string.
Rename Renames an external file. StrPos Returns a pointer to the first occurrence of a
RenameFile Renames a file. string in another string.
Reset Opens an existing file. StrScan Returns a pointer to the first occurrence of a
Rewrite Creates and opens a new file. character in a string.
RmDir Removes an empty subdirectory. StrRScan Returns a pointer to the last occurrence of a
Round Rounds a real-type value to an Integer-type character in a string.
value. StrToDate Coverts a string to a date format.
RunError Stops program execution. StrToDateTime Converts a string to a date/time format.
ScrollTo Scrolls the CRT window to show a screen StrToFloat Converts the given string to a floating-point
location. value.
Seek Moves the current position of a file to a StrToInt Converts a string to an integer
specified component. StrToIntDef Converts a string to an integer or the default
SeekEof Returns the end-of-file status of a file. StrToTime Converts a string to a time format.
SeekEoln Returns the end-of-line status of a file. StrUpper Converts a string to upper case.
Seg Returns the segment of a specified object. Succ Returns the successor of the argument.
SetTextBuf Assigns an I/O buffer to a text file. Swap Swaps the high- and low-order bytes of the
Sin Returns the sine of the argument. argument.
SizeOf Returns the number of bytes occupied by the TextToFloat Converts the null-terminated string to a
argument. floating-point value.
SPtr Returns the current value of the SP register. Time Returns the current time.
Sqr Returns the square of the argument. TimeToStr Converts a time format to a string.
Sqrt Returns the square root of the argument. TrackCursor Scrolls the CRT window if necessary to
SSeg Returns the current value of the SS register. ensure that the cursor is visible.
Str Converts a numeric value to a string. Trunc Truncates a real-type value to an Integer-type
StrCat Appends a copy of one string to the end of value.
another and returns the concatenated string. Truncate Truncates the file at the current file position.
StrComp Compares two strings. TypeOf Returns a pointer to an object type's virtual
StrCopy Copies one string to another. method table.
StrDispose Disposes a string on a heap. UpCase Converts a character to uppercase.
StrECopy Copies one string to another and returns a UpperCase Uppercases the given string.
pointer to the end of the resulting string. Val Converts a string value to its numeric
StrEnd Returns a pointer to the end of a string. representation.
StrFmt Formats a series of arguments. WhereX Returns the X coordinate of the current cursor
StrLCat Appends characters from one string to the location.
end of another and returns the concatenated WhereY Returns the Y coordinate of the current cursor
string. location.
StrIComp Compares two strings without case Write For typed files, writes a variable into a file
sensitivity. component. For text files, writes one or more
StrLComp Compares two strings, up to a maximum values to the file
length. WriteBuf Writes a block of characters to the CRT
StrLCopy Copies characters from one string to another. window.
StrLen Returns the number of characters in Str. WriteChar Writes a single character to the CRT window.
Writeln