Basado en el añejo Pascal permite desarrollar programas Orientado a Objetos que:
|
||||
Visual |
Programa |
Datos |
Datos |
|
enlaces |
Circular |
Delphi |
||
Cola |
PROGRAMACION VISUAL:
ELEMENTOS BASICOS
Una herramienta rápida que nos permite descomponer en partes un problema para su solución, es el llamado modelo de solución, este consiste de una pequeña caja que contiene los tres elementos más básicos en que se puede descomponer cualquier problema sencillo de información, estas tres partes son:
- 1º Datos que el computador ocupa para resolver el problema, estos datos son almacenados internamente en la memoria del computador en las llamadas variables de entrada.
- 2º Operaciones generalmente algebraicas necesarias para solucionar el problema, suelen ser formulas (o igualdad matemática, ej. X= y + 5).
- 3º Resultado o solución del problema que se obtiene de la parte de operaciones del modelo y dichos datos están almacenados en las llamadas variables de salida.
En resumen para todo problema de información es necesario plantearse las siguientes preguntas:
- ¿Que datos ocupa conocer el computador para resolver el problema y en cuales variables de entrada se van a almacenar ?
- ¿Que procesos u operaciones debe realizar el computador para resolver el problema planteado ?
- ¿Que información o variables de salida se van a desplegar en pantalla para responder al problema planteado originalmente?
- ¿Como nota importante no confundir los términos datos, variables e información;
- - Datos: se refiere a información en bruto, no procesada ni catalogada, por ejemplo “Tijuana”, “calle primera # 213”,”15 años”, " $2,520.00”, etc.
- - Variable: Es el nombre de una localidad o dirección interna en la memoria del computador donde se almacenan los datos, ejemplo de variables para los casos del párrafo anterior, CIUDAD, DIRECCION, EDAD, SUELDO, ETC.
- - Información: Datos ya procesados que resuelven un problema planteado.
Ejemplo: La solución que resuelva el problema de calcular el área de un triángulo con la formula área igual a base por altura sobre dos.
Variable(s) Entrada Proceso u operación Variable(s) salida BASE ALTURA AREA = BASE * ALTURA2 AREA
En BORLAND DELPHI un identificador es una palabra compuesta de letras y/o números de hasta 32 caracteres significativos, empezando siempre con una letra.
Una variable se define como un identificador que se utiliza para almacenar todos los datos generados durante la ejecución de un programa.
Existen ciertas reglas en cuanto a variables:
- Claras y con referencia directa al problema.
- No espacios en blanco, ni símbolos extraños en ellas.
- Se pueden usar abreviaturas, pero solo de carácter general.
- No deben ser palabras reservadas del lenguaje.
Ejemplos de buenas variables: Nombre, Edad, SdoDiario, IngMensual, Perímetro, Calif1, etc.
A toda variable que se use en un programa, se le debe asociar (generalmente al principio del programa) un tipo de dato específico.
Un tipo de dato define todo el posible rango de valores que una variable puede tomar al momento de ejecución del programa y a lo largo de toda la vida útil del propio programa. Los tipos de datos más comunes son:
TIPO RANGO char Caracter ASCII byte 0 a 255 integer -32,768 a 32,767 Real 1E-38 a 1E+38 Boolean TRUE o FALSE shortint -128 a 127 word 0 a 65535 longint -2147483648 a 214748364 String Cadena caracteresPara el caso de strings se prodra usar cualquiera de los dos siguientes formatos:
Var Nombre:string; Carrera:string[30];
Operador Operación + SUMA - RESTA * MULTIPLICACION / DIVISION Div DIVISION ENTERA Mod MODULO O RESIDUO
Como nota importante a recordar siempre;
Si se usa el operador DIV en problemas de división entre enteros, pascal trunca la parte residual, es decir;
// área de declaración de variables real a; // área de operaciones a := 10 div 4; // área de despliegue de resultados desplegar a; -> En pantalla sale ( 2.000000 )
El problema no es el tipo real, sino que por definición de la división entre enteros pascal trunca la parte residual.
El operador (%) devuelve el residuo entero de una división entre enteros, ejemplo;
// área de declaración integer alfa; // área de operaciones alfa := 23 mod 4; // área de despliegue desplegar alfa; -> El resultado en pantalla es 3 Otro ejemplo; alfa := 108 mod 10; desplegar alfa; -> El resultado en pantalla es 8Para resolver los problemas de potencias y raíces, se usan ciertas instrucciones especiales que proporciona el lenguaje, llamadas funciones matemáticas, en pascal existe todo un conjunto de instrucciones o funciones matemáticas.
Y ademas deberan recordar sus leyes de logaritmos y de potencias:
Con el uso de los logaritmos, los procesos de multiplicación, división, elevación a potencias y extracción de raíces entre números reales pueden simplificarse de la manera siguiente.
- El logaritmo de un producto es igual a la suma de los logaritmos de los factores: log ( a . m) = log a + log m
- El logaritmo de un cociente es igual a la diferencia de los logaritmos de los términos: Log(a:m) = log a - log m
- El logaritmo de una potencia es igual al exponente por el logaritmo de la base: Log am = m * Log a
- El logaritmo de una raiz es igual al logaritmo del radicando dividido por el índice de la raíz: log image231.jpg= m/n log a
Las dos funciones que se usan para resolver este problema son:
- Ln(x) ? Nos regresa el logaritmo natural del numero x.
- EXP(x) ? nos regresa eX es decir el antilogaritmo de un numero.
Otra vez si se ocupa resolver la multiplicacion de 5 * 20, la regla de logaritmos nos dice que el resultado es = log(5) + log(20) aunque en pascal se usa Ln(5) + Ln(20) pro en estos casos lo que se tiene de resultado no es 100 sino el logaritmo de 100, porque estamos sumando los logaritmos, es decir al resultado de la suma de logaritmos le tenemos que sacar su antilogaritmo, para conocer el resultado final(100) de la mulptiplicacion.
Ejemplo en pascal
Real alfa
Alfa := Exp( Ln(5) + Ln(20) );
Primero se calculan los logaritmos de 5 y de veinte con (Ln), luego los sumamos y a este resultado le extraemos el antilogaritmo con (EXP) que seria el resultado final.
Otro ejemplo si se tiene la potencia 53 entonces aplicando la regla de logaritmos el programa quedaria:
Real alfa
Alfa = EXP(5 * Ln(3));
Y si se tiene que obtener la raiz de 9 Ö 9 en borland delphi sera: Alfa = EXP( 1/2 * Ln(9));
En BORLAND DELPHI el problema de no tomar en cuenta la jerarquía de los operadores al plantear y resolver una operación casi siempre conduce a resultados muchas veces equivocados, como estos ejemplos:
2+ 3* 4 := 20(incorrecto)
2+ 3* 4 := 14 (correcto)
Si calif1=60 y calif2=80 y si el programa usa: promedio := calif1 + calif2/2; la pc daría como resultado: promedio = 100
Antes de plantear una formula en un programa se deberá evaluar el siguiente Orden de operaciones:
Nota: Si se quiere alterar el orden normal de operaciones, entonces usar paréntesis.
Nota: Tampoco es bueno usar paréntesis de mas en una operación, esto solo indica que no se evalúo bien la formula, como en el siguiente ejemplo;
image15.jpg
aquí los paréntesis están de mas, porque por orden de operaciones, multiplicación y división tienen la misma jerarquía y entonces se resuelven de izquierda a derecha, en otras palabras ni que falten paréntesis ni que sobren paréntesis.
Entradas o capturas de datos y salidas o despliegues de información o resultados son de los procesos más comunes en cualquier tipo de problema de información, estos procesos o instrucciones varían de acuerdo a los lenguajes y ambientes de programación a usar.
El lenguaje y ambiente de programación a utilizar, es de tipo visual, y muchos de los problemas asociados a entradas y salidas se encuentran ya resueltos por el propio compilador.
El ambiente de construcción de programas a usar, es el siguiente:
SOLO CARGARLO EN PANTALLA EJECUTANDO EL BORLAND DELPHI, QUE SE ENCUENTRA EN LA BARRA DE START DE WINDOWS.
image295.jpg
Sus elementos básicos son:
Es decir será la primera ventana que el usuario ve al momento de ejecutarse el programa, su nombre es Form1.
Esta forma o ventana es un objeto de Borland Delphi y como todos los objetos de Delphi y del universo, la forma o ventana tiene asociados propiedades y eventos.
Propiedades son todas las características particulares que diferencian un objeto de otro objeto, las propiedades o características mas comunes son forma, tamaño, color, etc., para objetos en DELPHI estas propiedades se modifican o individualizan usando el Inspector de Objetos, que es la parte del programa que las contiene.
También se pueden modificar las propiedades dentro de un programa, usando instrucciones apropiadas, mismas que llevan el siguiente formato:
nomobjeto?propiedad := nvovalor;
ej.; Form2?Color := clRed;
Eventos, son todos aquellos sucesos de carácter externo que afectan o llaman la atención del objeto, para estos caso la forma o ventana:
- Debe tener capacidad de detectar el evento
- Debe tener capacidad de reaccionar y emitir una respuesta, mensaje o conducta apropiada a el evento detectado.
Evento es por ejemplo que otro objeto llamado humano, pulse el objeto tecla ESC, o haga click derecho con el objeto ratón en alguna parte de la ventana , etc. , es en estos casos, cuando la ventana detecta un evento de estos, la propia forma deberá responder de manera apropiada.
Esta respuesta no es automática, sino son la serie de instrucciones del lenguaje (o programa) que los ingenieros de software diseñan(o programan), en otras palabras son los eventos quienes contendrán los programas.
Es tambien el Inspector de Objetos, quien contiene todos los posibles eventos asociados a la forma.
Para los primeros programas en Borland Delphi solo se usaran propiedades sencillas como color, font, etc. de Form1, y no se usan, de momento los eventos que puede detectar Form1
Un programa o problema de información en Borland Delphi no es mas que una o mas formas o ventanas, donde cada una de ellas contiene elementos u objetos especiales llamados componentes, dichos componentes DELPHI los proporciona a través de la barra de componentes.
Es decir toda la interfase que se quiera manejar con el usuario del programa, no consiste mas que de una colección de componentes agrupados en una forma o ventana.
La colección de componentes que pone a nuestra disposición DELPHI están agrupados en diversos folder o pestañas o paginas en la barra de componentes, las principales categorias para este curso contienen los siguientes componentes:
Standard.- Frames MainMenu PopupMenu Label Edit Memo Button CheckBox RadioButton ListBox ComboBox ScrollBar GroupBox RadioGroup Panel ActionList
Additional.- BitBtn SpeedButton MaskEdit StringGrid DrawGrid Image Shape Bevel ScrollBox CheckListBox Splitter StaticText ControlBar AplicationsEvents Chart
Data Access.- DataSource Table Query StoredProc DataBase Session BatchMove UpdateSQL NestedTable
Data Controls.- DBGrid DBNavigator DBText DBEdit DBMemo DBImage DBListBox DBComboBox DBCheckBox DBRadioGroup DBLookupListBox DBLookupComboBox DBRichEdit DBControlGrid DBChart
Win31.- DBLookupList, DBLookupCombo, TabSet, Outline, Header, TabbedNotebook, NoteBook.
Dialogs.- OpenDialog, SaveDialog, FontDialog, ColorDialog, PrintDialog, PrinterSetupDialog, FindDialog, ReplaceDialog.
System.- Timer, PaintBox, FileListBox, DirectoryListBox, DriveComboBox, FilterComboBox, MediaPlayer, OleContainer, Ddeclientconv, DdclientItem, Ddeserverconv, DdeserverItem.
QReport.- QuickReport, QRBand, QRGroup, QRDetailLink, QRLabel, QRMemo, QRDBText, QRDBCalc, QRSysData, QRShape, QRPreview.
Para incorporar un componente a una forma solo basta seleccionarlo con un click derecho en su icono y luego colocar el cursor dentro de la forma en el lugar donde se quiere que aparezca y volver a hacer un click derecho.
También los componentes son objetos de borland delphi y como tales también tienen asociados propiedades y eventos, tales como los tiene la forma principal, solo que existen pequeñas variaciones en cuanto a sus propiedades y eventos propios con respecto a Form1.
Recordar además, que es el Inspector de Objetos en primera instancia quien permite asociar o modificar propiedades especificas tanto a una forma como a un componente.
Ya en segunda instancia las propiedades de formas y componentes se pueden modificar también directamente dentro de un programa, usando instrucciones.
Se utiliza para desplegar textos o mensajes estáticos dentro de las formas, textos tales como encabezados, solicitud al usuario del programa para que proporcione algún dato o información(edad, dame sueldo, etc.), en cierta forma hace las funciones de printf, cout, writeln, print, display, etc., pero solo cuando se consideran en su parte de mensajes.
También es un objeto en Borland Delphi y por tanto tiene asociados sus propias propiedades y eventos, al mismo tiempo como se está usando dentro del objeto form1, muchas propiedades que se definan para el objeto Form1, el objeto Label1 las va a heredar.
Si bien es cierto que el objeto se llama Label, pero cuando se ponen dentro de una forma Borland Delphi los va numerando automáticamente, si se ponen tres Labels en Form1, ellos se llaman o simbolizan o se procesan o programan con Label1, Label2, Label3.
Es la propiedad Caption, la que lleva el contenido del mensaje que se quiere desplegar en la pantalla, solo click derecho a un lado de la propiedad Caption en el Inspector de Objetos, teniendo seleccionada la caja Label1 en la forma y escribir el texto indicado.
Es el componente principal de la forma, contiene el código principal del programa y su activación por el usuario provoca que se realicen los principales procesos del problema planteado (aquí es donde se capturan datos, se realizan operaciones, etc.).
De este componente se maneja su propiedad Caption para etiquetarlo con la palabra “OK” o “ACEPTAR” o “EXE” y su evento OnClick para activarlo, es en dicho evento donde se construye el código del programa.
Recordar que aunque no es un componente necesario en los programas, ya que el código se puede asociar o pegar a cualquier evento de cualquier forma, o componente del programa, Microsoft ya acostumbro a todos los usuarios al botón OK, de acuerdo, OK.
Este botón también puede activar su evento OnClick, cuando el usuario presione la tecla Igualmente puede activar su evento OnClick cuando el usuario, presione la tecla Ejemplo:
Para este programa se ocupa, una forma, dos componentes labels para encabezados apropiados al problema, 10 componentes labels para textos y datos, un componente Button.
Para el ultimo componente Label su propiedad Caption se dejara en blanco o vacía para que sea el usuario del programa quien lo cargue al apretar el botón de ordenes o botón de OK.
Recordar que Borland Delphi va numerando automáticamente todos los componentes en el programa en forma consecutiva, es decir al finalizar el diseño del programa se tendrán, los componentes form1, label1,label2,label3,..button1.
El procedimiento completo para crear y ejecutar el programa es:
Donde se deberá seleccionar primero, el icono de nuevo folder, esto es, para crear un nuevo folder o directorio donde quedara guardado o almacenado el programa, en cuanto se crea el nuevo folder, sobrescribir la palabra “new folder” que aparece, con el nombre que tendrá el directorio donde quedara almacenado el programa, escribir por ejemplo “programa uno” ( Windows95 ya permite que los nombres de directorios y sus archivos ya sean mas largos y no necesariamente del tipo antiguo de 8.3), al terminar de sobrescribir, la palabra “programa uno” apretar tecla Ya creado y renombrado el directorio, observar que en la parte inferior de la ventana el programa ya tiene el nombre de “Unit1.pas”, a un lado esta una caja o botón de “OPEN”, mismo que se deberá apretar y después usar en la misma parte un botón llamado “SAVE” para almacenar “Unit1.dpr”.
Observar que el componente en la forma, que esté seleccionado ( esto se puede hacer, usando un click dentro de el componente) se puede arrastrar para cambiarlo de lugar o posición o hacerlo mas pequeño o mas grande.
Como nota también a recordar siempre, un componente o la propia forma, está seleccionado, si el Inspector de Objetos lo esta referenciando, es decir es el Inspector de Objetos quien contiene el nombre del componente en la parte de arriba del propio Inspector de Objetos.
Para cargar o para que despliegue un texto el componente Label1, solo escribir dicho texto en la cajita que esta a un lado de la propiedad Captión en el Inspector de Objetos, por ejemplo para el problema, escribir la palabra “AUTOS ECONOMICOS”, y recordar que también esté componente también tiene propiedad font que se puede usar para alterar el tipo de letra que despliega el componente.
Recordar que este componente, es quien contiene el código del programa y mas específicamente es su evento OnClick quien lo contiene y quien además lo activa o lo ejecuta.
Para añadirle el código(en este ejemplo que cargue el Caption de Label12 al tiempo de ejecución del programa y por decisión del propio usuario) existen dos maneras:
En el Inspector de Objetos, hacer click en la pestaña o folder llamado event y ahora en lugar de propiedades el Inspector de Objetos, muestra todos los eventos que el componente puede detectar(observar y anotarlos), ahora click en la cajita que esta a un lado del evento llamado OnClick y con este paso aparece el siguiente minieditor de programas de Borland Delphi:
Observar que ya trae listo el evento Button1Onclick() para programarse y es dentro del BEGIN-END donde se construye el programa.
Solo escribir dentro de las llaves la instrucción Label8.Caption := “FORD”;
NomComponente.NomPropiedad := NvoValor;
La otra manera y mas sencilla de cargar el editor, es haciendo un dobleclick dentro del componente.
Nota.- También se puede usar también la primera letra dentro del botón de comando o de ordenes (OK) para activar las instrucciones o acciones del botón, es decir se puede usar click en botón o solo pulsar la letra O, para que se ejecute este ultimo procedimiento , solo poner un símbolo & en el caption del botón antes de la letra O.
El programa ya en ejecución debe ser similar(pero mejor diseñado) al siguiente ejemplo:
Ya que se practicó, la mecánica de creación de programas, resolveremos el problema de interactividad con el usuario.
Es decir en estos casos es el usuario quien generalmente proporciona los datos para su procesamiento en el problema el trabajo del ingeniero de software, es procesarlos y darles sentido, coherencia y sobre todo eficiencia.
En resumen de este componente, se necesita entender lo siguiente:
Este componente Edit, es el equivalente a las variables en cualquier lenguaje de programación, mas la instrucción de captura o despliegue correspondiente, es decir;
Ya aclarada su función, es necesario entender primero, que este componente permite capturar datos y también como en el caso del componente Label desplegar datos, textos, mensajes o resultados de operaciones de ser necesario, usando la propiedad Text del componente Edit.
Esta propiedad Text, así como la propiedad Caption en Label, permiten igualarse a muchos procesos básicos, es decir es fácil igualar Text o Caption a un dato, una variable, otro Text u Caption, o una expresión algebraica normal, como en los siguientes ejemplos;
Edit2.Text := 5;
Label3.Caption := ‘GABY’;
Edit4.Text := 3 * 6.2 ;
En principio su valor de default es la palabra Edit1 y es en su propiedad Text donde se modifica, generalmente al principio de un programa se deja en blanco, y al ejecutarse el programa, el usuario lo llena con los datos solicitados o el programa lo llena con el resultado de las operaciones.
Es importante entender que la propiedad TEXT de este control o componente se cargara o se leera como una STRING, es decir para procesarlo se usa codigo similar a :
Edit10.Text := ‘3,1416’;
String temporal := Edit10.Text;
Observar que aunque se cargue con un dato aparentemente de tipo REAL la propiedad TEXT solo puede contener STRINGS. Se usaran mucho a lo largo de todo el curso las siguientes funciones de BROLAND DELPHI para estar conviertiendo de STRINNS a VALORES NUMERICOS y tambien de VALORES NUMERICOS a STRINGS.
Ejemplo:
EDIT1.TEXT := ‘23.456789’;
Format(’%0:2f’,[Edit1.Text]) ? EL DESPLIEGUE SERA 23.45
ALGUNAS CONSTANTES DE FORMATEO SON:
%5:5d –> despliega cinco digitos enteros y cinco decimales, si el dato tiene menos partes enteras se rellenara con ceros 0000.
%u –> similar a %d excepto que no muestra el signo (+/-) del dato.
%e –> despliega en notacion cientifica o exponencial.
%f –> fijo dos decimales por default.
%g –> el compilador decide si lo manda a decimal o exponencial.
%n –> similar a %f solo que los miles se separan con comas.
%m –> formato monetario.
%x –> lo convierte a hexadecimal.
ing-point value from a null-terminated string.
Cuando un usuario lo carga con un dato recordar que el dato almacenado queda de tipo texto, no importa lo que haya escrito el usuario.
Para resolver el problema de usar datos numéricos dentro del Text de un componente Edit, en operaciones matemáticas, solo USAR LAS FUNCIONES APROPIADAS, como se muestra en el siguiente ejemplo.
temp := StrToFloat(Edit1.Text)* 5;
Edit1.Text := FloatToStrF(temp,ffGeneral,5,2); NOTA: ffCurrency, ffExponent, ffFixed, ffGeneral, ffNumber
Recordar que el usuario, usara un componente Edit para almacenar los datos de entrada del problema, muchas veces estos datos son de tipo numérico, por ejemplo en un componente Edit se almacena la cantidad de pesos, el precio de un articulo, la edad de una persona, etc.
Solo recordar siempre usar el componente Edit, directamente como una variable cualquiera(con su método o función correspondiente ) y construir la operación o formula con los propios componente o cajas edit.
Es decir, por ejemplo, si se pide resolver el problema de multiplicar dos números cualesquiera, se ocuparan tres ` cajas Edit,(factor1, factor2, producto), es en estos casos donde se usan tres componentes Edit como si fuesen tres variables simples directamente.
Ya en programa se ocupan 3 componentes Label para títulos (Multiplicando, Multiplicador, Multiplicación), tres componentes Edit para los datos (dos proporcionados por el usuario y uno calculado por el programa) y un componente Button(OK) para realizar la operación.
Codigo;
corrida:
notas:
Como se observa este componente Edit permite capturar datos por parte del usuario del programa.
Es mas sencillo considerar, estos componentes como variables normales y usarlos directamente.
Solo en problemas algebraicos usar propiedad Text con las funciones apropiadas.
Respetar la ortografía en el ejemplo, sobre todo en las instrucciones (las que terminan con ;)
Si son muchas operaciones en un problema, el procedimiento es similar, solo resolverlo por partes ya que una formula que contenga cuatro o cinco Edit, se convierte en un renglón de código gigante.
sin embargo es mas sencillo usar el método que se usa en el programa dado de ejemplo para la multiplicación, es decir considerar los componentes Edit como variables normales, y usar:
Edit3.Text:=Format(’%0.2f’,[temp]);
Edit8.Text.ToDouble();
Para el caso de resultados decimales , la salida incluye todo el conjunto de decimales asociados a un tipo double(muchos ceros), para resolver este problema se pueden usar directamente algunos métodos asociados a la clase AnsiString , por ejemplo uno de esos métodos es;
Format(’string de formato’, var real);
La string de formato contiene una serie de simbolos literales que se utilizan para darle el formato de salida deseado, esto simbolos o constantes literales son;
Const. Lit. Significado
0(cero) Rellena con 0(ceros) todas las posiciones indicadas, ejemplo “0000.00” para el numeró 23.4 la string de salida seria 0023.40
# Constante muy usada para formato de valores numéricos, esta constante solo despliega el valor numérico normal.
. Se utiliza para separar la parte entera de la parte decimal.
,(coma) Se utiliza para separar el valor numérico en unidades de millar.
E+, E-, e+, e- Se utilizan para convertir a notación científica exponencial el valor de salida.
En resumen, este componente Edit, es el componente mas importante y elemental en todo problema que involucre el procesamiento de datos en ambientes visuales, se debe acostumbrar a considerarse como un elemento importante en cualquier problema visual, y acostumbrarse a procesarlo como si fuese una variable normal cualesquiera.
EL RESUMEN DE CONVERSION DE DATOS A COMPONENENTE Y QUE SE USA A LO LARGO DE ESTE CURSO EN GENERAL DESCANSA EN LAS SIGUIENTES 4 FUNCIONES.
Ejemplo: Se construye y resuelve el segundo programa del modelo de solución del área del triángulo.
Para crear y diseñar la forma y sus componentes se ocupa, una forma, seis labels, tres edits y un Button, quedando así;
Pantalla de diseño
El código o miniprograma, solo diseñarla, y dentro del evento Click del componente Button1, queda así;
cuando se capturen los datos de base y altura, no dejar espacios en blanco antes del primer numero o se darán problemas y errores de conversión a valores numéricos.
También se puede usar, para asegurarse que el dato proporcionado por el usuario, solo incluya números, o solo contenga letras, etc.
Para darle formato al dato que el usuario debe proporcionar solo hacer dobleclick a un lado de la propiedad EditMask en el Inspector de Objetos y esto nos da el siguiente minieditor de datos:
<
Observar en la ventana derecha, algunos ejemplos de “mascaras de edición”.
Es en la ventanilla arriba a la izquierda donde se colocan los caracteres especiales de edición ( en el ejemplo se están usando, $, #, puntos y comas).
carácter significado
! Caracteres opcionales se despliegan en blanco
Caracteres que siguen deben ser mayúsculas
< Caracteres que siguen deben ser minúsculas
L Requiere una letra en esta posición
l Permite una letra es esta posición pero no la requiere
A Requiere un alfanumérico en esta posición
a Permite un alfanumérico pero no lo requiere
0 Requiere un numero en esta posición
9 Permite un numero pero no lo requiere
# Permite un numero y también signos mas y menos
: Separa horas:minutos:segundos
/ Separa meses/días/años
; Se utiliza para separar los tres campos o partes de una mascara
_ inserta espacios en blanco en el texto
Cualquier otro carácter que no aparezca en la tabla anterior, puede aparecer en una mascara, pero solo se tomara en cuenta como una literal cualesquiera, es decir son insertados automáticamente y el cursor los brinca.
El segundo campo o parte de una mascara es un carácter simple que indica que carácter literal debe ser incluido como parte del texto del componente MaskEdit, por ejemplo (000)_000-0000;0;*,
Un 0 en el segundo campo indica que solo deben capturarse los diez dígitos marcados con O, en lugar de los 14 que tiene la mascara.
El tercer campo de la mascara, es el carácter que se quiera que aparezca en lugar de espacios en blancos.
Ejemplo de esta clase de datos, son por ejemplos Municipio en Tucumán, las posibles respuestas son (Banda del Río Salí, Concepción, San Miguel de Tucumán, Tafí Viejo, Yerba Buena), otro ejemplo es Sexo (Hombre, Mujer), etc.
Para situaciones como esta, existen componentes que permiten programar por adelantado las posibles respuestas, y el usuario solo debe seleccionar la respuesta apropiada , en lugar de tener que escribirla.
Este componente ComboBox nos permite definir en primera instancia un conjunto de datos o valores respuestas asociados a una caja de edición cualesquiera, así ahora el usuario tendrá la oportunidad de seleccionar un dato del conjunto de datos o respuestas ya predefinido.
Este componente ComboBox tiene dos partes, una parte de encabezado, para poner el nombre del grupo de respuestas( por ejemplo municipios, sexo, etc.), que se carga usando la propiedad Text del componente.
La segunda parte es la lista de opciones o respuestas que se debe cargar al tiempo de diseño de la ventana, en el momento de poner el componente ComboBox1, solo hacer dobleclick a un lado de la propiedad Items en el Inspector de objetos y sale el siguiente editor de strings:
Al momento de ejecución del programa, toda la lista de respuestas, estarán a la vista del usuario, para que este ultimo la seleccione.
Recordar que el usuario al momento de ejecución del programa, solo vera el encabezado, para seleccionar su respuesta deberá apretar la flechita que esta a un lado del encabezado.
Para procesar este componente: Usar su popiedad Text de manera normal, es decir si la respuesta se ocupa en string,
Solo usar ComboBox1.Text, o si la respuesta se quiere numerica solo convertir Text a flotante de manera normal
Para resolver este problema, se tienen dos métodos, el primero de ellos consiste de una serie de componentes que permiten agrupar datos o información(resultados) de una manera mas lógica y estética.
El segundo método consiste de construir y trabajar con dos o mas ventanas a la vez.
Se empieza por el primero método, es decir componentes de agrupamiento.
El componente Panel1 puede contener una toda una serie lógica de otros componentes.
Solo se deberá recordar colocar primero todos los paneles en la forma y encima de ellos los componentes que contendrán.
Este componente también tiene una serie de propiedades que le dan una mejor presentación usando las propiedades BevelInner, BevelOuter, BevelWidth, y BorderWidth.
Es decir se puede dividir una sola ventana en varias partes, por ejemplo en un panel se ponen los componentes donde se capturan los datos de un problema junto con el botón de OK, y en otro panel se construye la salida, por ejemplo se crea un panel para capturar los datos de un empleado incluyendo sueldo diario y días trabajados y un segundo panel contiene su cheque semanal de pago ( problema sugerido también ).
Para modificar programas construidos sin paneles, el procedimiento para agregarlos es:
El texto que identifica el propósito general del grupo se escribe dentro de la propiedad Caption en el Inspector de Objetos, teniendo seleccionado este componente GroupBox.
Además de sus propiedades, métodos y eventos propios, como todos los componentes de este tipo, tiene o hereda las propiedades, métodos y eventos de todos los controles generales de tipo Windows.
Es muy similar al componente panel, excepto que incluye una pestaña que permite dejar mas claro, el proposito del grupo.
Lo primero que hay que entender para poder resolver este problema es que en borland delphi , cada forma o ventana tiene asociado ciertos recursos, ademas de los componentes que contiene, tambien una serie de recursos especiales, en general, la forma, los recursos y los objetos hijos o componentes, se encuentran relacionados todos ellos, en un archivo especial, llamado “Unit1.pas”.
Es decir si se crea una segunda forma o ventana,, dicha form2, junto con sus recursos, componentes, etc., se encontraría contenida en el archivo llamado “Unit2.pas” y así sucesivamente.
Pero recordar y también tomar en cuenta, que los componentes de esta segunda forma, también se simbolizarían y procesaran normalmente, es decir ellos también serán (Edit1, Label5, etc.).
Para crear una segunda forma (form2), solo usar el icono de new Form que se encuentra en la barra de herramientas, recordar además que los otros iconos de dicha barra sirven para estarse intercambiando entre formas y Unit(código fuente).
La segunda forma se construye normalmente, pero queda el problema de donde queda el botón de ordenes, le respuesta es, se pone en la primera forma o ventana principal del programa.
El proceso en este botón es similar a todos los programas anteriores, es decir primero se capturan los datos ( pantalla o ventana de captura)luego se resuelve las operaciones y luego traspasar los datos a los componentes de la segunda forma o ventana.
Para poder realizar este procesos, solo usar ahora un nuevo formato de trabajo con todos los componentes usados, para que ahora incluyan la forma que lo contiene, es decir se usa ahora ;
NOMFORMA.NOMCOMPONENTE.NOMPROPIEDAD. Ejemplos;
Crear, armar y diseñar todas las ventanas primero, junto con sus componentes y miniprogramas.
Cualquier ventana que mencione o contenga una referencia dentro de su código a otra ventana, deberá incluir en su Unit respectiva, la unidad (Unit) de la otra forma o ventana, esto es muy similar a lo que se hace en PASCAL para el manejo de unidades.
Para incluir la unidad(Unit) de la otra forma o ventana, solo tener seleccionada o al frente la ventana que llama, y usar la orden File, USE Unit, que se encuentra en arriba en la barra de menú, junto con el Run, Compile, etc., al dar esta orden(File USE Unit) sale una lista con todas las unidades(Unit) que ya se diseñaron, seleccionar la apropiada y ya se incluirá automáticamente en la forma o ventana actual.
Si una ventana o forma referencia dos o mas formas diferentes, entonces usar la orden File, USE Unit, tantas veces como sea necesario.
Este procedimiento permite construir programas con dos o mas ventanas, pero el problema es que todas ellas estarán a la vista del usuario, para resolver este problema, el procedimiento mas sencillo es poner en False la propiedad visible de la forma o ventana que se quiera tener oculta y poner cualquiera de las siguientes instrucciones en el código del programa para que aparezcan o desaparezcan a voluntad;
Programación Avanzada permite crear y destruir ventanas y componentes al tiempo de ejecución del programa, pero estos conocimientos, no forman parte del ámbito de este libro.
Si se tienen formas de mas, o formas que ya no se quieren usar o de plano mal construidas se pueden remover del proyecto usando PROJECT REMOVE FROM PROJECT del menu normal y de la ventanilla que aparece seleccionar la unidad que contiene la forma que se quiere eliminar.
En principio es parecido al componente Button, pero en el ejemplo de arriba observar que incluye un gráfico o bitmap, que lo hace mas agradable y visible al usuario.
Es en su propiedad KIND, en el inspector de objetos, donde se pueden definir cualquiera de sus diez opciones, como lo muestra la siguiente pantalla.
Todos son BITBUTTON, nada mas con Kind Seleccionado.
Close, en una ventana, cuando el usuario lo selecciona, cierra la ventana.
INSTRUCCIONES DE CONTROL DE PROGRAMA INSTRUCCIONES CONDICIONALES: Es decir al comparar dos alternativas diferentes el computador puede tomar una decisión, basándose en la evaluación que hace de alguna condición. Ejemplo de instrucciones condicionales ;
si sueldo > 3000
si sexo = ‘m’
De los ejemplos observar que los caminos por el computador dependerán de la evaluación que el computador hace con y de la condición.
Todo lenguaje de programacion debe tener instrucciones que permitan formar condiciones e instrucciones que pueden evaluar esas condiciones.
Para propósito de construcción visual de programas, este tipo de instrucciones condicionales se usaran en forma interna es decir son parte del código del programa que se empotra dentro de los eventos de componentes, no son formas o componentes en si.
Pero recordar que lenguajes visuales de igual forma tienen componentes que permiten del mismo modo al usuario tomar decisiones, incluso directamente en pantalla, es decir existen los llamados componentes de selección y decisión.
El formato general de una instrucción condicional es:
Como se observa son cuatro partes bien diferenciadas entre si;
Cuando el computador evalúa una condición,, el resultado de esa evaluación solo es evaluado de dos maneras o la condición es CIERTA o la condición es FALSA.
Esto dependerá del valor que tenga asignado o que se haya capturado para la variable que esta en la condición, por ejemplo si se capturo 6000 en sueldo en el ejemplo a), entonces el computador indicaría que la condición es CIERTA, pero en otro caso, si a la variable sueldo primero se le asigno un valor de 250 entonces el computador indicaría que la condición, es FALSA.
Ya dependiendo del resultado de la evaluación, el computador ejecuta las instrucciones contenidas en la parte CIERTA o en la parte FALSA de la condición.
CONDICIONES SIMPLES: sexo = m
sueldo > 300,000
Una condición simple se define como el conjunto de variables y/o constantes unidas por los llamados operadores relaciónales.
Los operadores relaciónales que reconoce el lenguaje borland delphi son:
NOTA:
string carrera;
if (carrera=’informatica’) etc, etc, etc,
INSTRUCCION IF: cargar o asignar la variable de condición;
Primus.- Observar donde van y donde no van los puntos y comas;
Secundus.- Si un if no ocupa un grupo falso de instrucciones, entonces no se pone el else, y la llave antes del else si terminaría con punto y coma.
Programa Ejemplo:
Codigo:
Corrida:
<
CONDICIONES COMPUESTAS: Una condición compuesta se define como dos o mas condiciones simples unidas por los llamados operadores lógicos que BORLAND DELPHI reconoce:
Para que el computador evalúe como CIERTA una condición compuesta que contiene el operador lógico “or”, basta con que una de las condiciones simples sea cierta.
La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta dada por la relación image54.jpgdonde n = cantidad de condiciones, la primera mitad de ellos ciertos y la segunda mitad falsos.
Ejemplo, si formamos una condiciona compuesta con dos condiciones simples y el operador lógico “y”, la cantidad total de casos posibles serian image55.jpg, y se puede construir la siguiente tabla de verdad.
Tabla de verdad con “and”
C C C
La evaluación final se obtiene usando la regla anteriormente descrita para una condición compuesta, que contiene el operador “and”.
Esta tabla significa lo siguiente;
La tabla de verdad para una condición compuesta con “OR” es la siguiente;
C C C
Como se observa, una condición compuesta con “OR”, es menos restrictiva, o el 75% de los casos terminarían ejecutando el grupo CIERTO de instrucciones de la instrucción condicional.
Construir una tabla de verdad para una condición compuesta de tres o mas condiciones simples, es también tarea sencilla, solo recordar que;
Ejemplo una condición compuesta de tres condiciones simples, donde el primer operador lógico es el “y” y el segundo operador lógico es el “O”, daría la siguiente tabla de verdad.
C C c C c
INSTRUCCION CASE: La instrucción case es una instrucción de decisión múltiple, donde el compilador prueba o busca el valor contenido en una variable contra una lista de constantes ints o chars, cuando el computador encuentra el valor de igualdad entre variable y constante, entonces ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociados a un default, aunque este ultimo es opcional.
El formato de esta instrucción es el siguiente;
capturar o asignar variable de condición;
OBSERVAR donde se usan y donde no se usan los ( : ) y los ( ; )
Mejor un ejemplo practico:
Codigo:
Corrida:
Recordar que la propiedad Text de cualquier componente, puede usar o accesar cualquier [posición o carácter] usando los corchetes por ejemplo;
si Edit4 = “Juan” entonces:
Label3.Caption = Edit4?Text[2]; pasa solo la ‘u’ al caption
Notas:
En particular, instrucciones de tipo case se utilizaban para construir programas de selección de menús, donde al usuario se le planteaban dos o tres problemas distintos y el propio usuario seleccionaba cual de ellos quería ejecutarse.
COMPONENTES VISUALES DE SELECCION Y DECISION: BORLAND DELPHI proporciona una serie de componentes visuales que permiten al usuario, no al programador, tomar decisiones en pantalla, el programador solo se encarga de implantar código adecuado a la decisión tomada por el usuario.
Es la propiedad Text del componente donde se escribe sentido de la selección ej.;
En los ejemplos, los componentes checkbox, son las cajas donde el usuario toma un decisión (ej. 3) o realiza una selección (ej. 1,2)
Existen dos maneras de programar este componente:
Cuando el usuario selecciona un checkbox la propiedad Checked refleja esta decisión quedando cargada con las constantes true o false, en estos casos solo validar con un if por cada CheckBox dentro de nuestro botón de ordenes, el estado de dicha propiedad. Ejemplo:
Corrida:
Notas:
El segundo método para programar el componente, involucra el evento OnClick de este componente CheckBox, este evento OnClick es activado automáticamente en cuanto el usuario realiza o marca o toma su selección, es claro que si no se programa este evento el usuario no observara ningún proceso, sino que tendrá que indicar que ya hizo su decisión, apretando el botón de OK.
Pero si se programa el evento OnClick de este componente con el código adecuado, ni se tendrá que agregar un botón OK, ni se ocupara usar un if(Checked), porque el usuario ya indico cual es su decisión o selección.
Recordar que para programar este evento OnClick, solo hacer un dobleclick, dentro del componente.
Este método es el mejor porque evita código de mas y cada componente solo tiene asociado el código que ocupa.
Es su propiedad Caption donde se pone el texto que identifica el propósito del botón, es su propiedad Checked quien refleja el cambio( True , False ),también su evento onclick es activado automáticamente cada vez que es seleccionado el RadioButton por el usuario.
Recordar también que cuando el usuario selecciona un RadioButton, todos los demás RadioButton en el objeto(forma o ventana) son deseleccionados automáticamente esto es por que dos RadioButton son mutuamente excluyentes entre si.
Esta ultima situación deberá resolverse por parte del programador, es decir se supone un programa donde el usuario debe seleccionar uno de entre dos sexos y uno de entre cinco municipios, en este caso se ocupan ocho RadioButton, pero como todos son mutuamente excluyentes entre si, cuando el usuario seleccione uno de ellos, todos los demás se desmarcaran automáticamente.
Para resolver este problema se deberá usar los ya ampliamente conocidos y practicados componentes de agrupamiento, como son el componente Panel y el componente GroupBox.
Es decir se deberá encerrar en su propio panel o GroupBox todos los RadioButton lógicos, es decir en un Panel los de sexo, en otro Panel los de municipios, etc.
De esta manera BORLAND DELPHI los evalúa por separado y se puede tener seleccionado un RadioButton en cada Panel.
Un componente u objeto RadioGroup es una caja especial que solo contiene componentes RadioButton, también cuando el usuario marca o selecciona uno de ellos, todos los demás se desmarcan o deseleccionan .
Para añadir los RadioButton a el componente RadioGroup, solo editar la propiedad Items en el Inspector de Objetos, que entonces nos muestra el minieditor de strings ya visto y practicado en el tema de ListBox, solo recordar que cada renglón en el editor corresponderá a un RadioButton dentro del RadioGroup.
Para procesar o programar el RadioButton seleccionado por el usuario, solo usar la propiedad ItemIndex que queda cargada con el numero de RadioButton seleccionado por el usuario.
Este código deberá usarse dentro del evento OnClick de un componente Button(OK).
ejemplo
if(Form5.RadioGroup3.ItemIndex==4){ código a ejecutar si el usuario selecciono el RadioButton 4 del RadioGroup 3 etc. };
También se pueden desplegar los botones en una o mas columnas, usando la propiedad Columns en el Inspector de Objetos, para indicarle cuantas columnas de RadioButton se quieren manejar.
Cuando se pone este componente en una forma, se deberá entender que form1 ahora mostrara o desplegara una barra de menú, tal como si fuese una ventana normal de Windows.
Para construir un programa de selección de menú;
Un ejemplo;
Recordar que este componente PopupMenu se tiene que pegar a otro componente, por ejemplo un Label o un Edit, etc.
Para crear un PopupMenu, solo seleccionar el componente PopupMenu en la barra de componentes y ponerlo en una parte de la forma donde no estorbe (también queda flotando).
Para cargarlo de opciones solo dobleclick en dicho componente e igual que en componente MainMenu, sale el minieditor, click en la parte donde va la opción escrita y escribir la palabra en la propiedad Caption del Inspector de Objetos.
Para cargarle el código a cada opción , solo dobleclick en la opción correspondiente.
Para salirse del minieditor, solo click en la [X] de arriba.
Por ultimo y muy importante, recuerde que se tiene que pegar a un componente cualesquiera, para esto solo seleccionar el componente y click en la propiedad popup del componente, sale la lista con todos los componentes PopupMenu que ya se hayan construidos.
for VARCONTROL := ValorInicial to ValorFinal do
begin instrucciones; end;
ejemplo:
FOR x :=1 TO 10 DO
BEGIN Label4.Caption := ‘pato’; END;
Casos Particulares;
for x := 5 to 15 DO begin etc...
for x := -3 to 8 do etc...
for x := 1 to 20 do begin inst(es) x := x + 3 if x? 20 then x x:=19 etc..
ejemplo: desplegar los números enteros, comprendidos entre el 10 y el 20.
Ocupamos ahora un componente que pueda almacenar y desplegar un conjunto de los 10 resultados, el único componente visto hasta ahora con esta capacidad es el componente ComboBox, sin embargo existe otro componente llamado ListBox(Standard), muy similar a ComboBox, excepto que no tiene encabezado y todos sus elementos los mantiene a la vista del usuario, no ocultos como el ComboBox, dicho componente ListBox se analiza a fondo en la siguiente unidad, pero es el que de momento permite resolver el problema del for (desplegar un conjunto de datos o resultados a la vez).
Tanto ComboBox como ListBox permiten cargar todos sus elementos o valores, dentro de un programa, usando un método llamado Add(valor) en su propiedad Items, como se ve en el siguiente programa ejemplo;
Para este problema se ocupa poner en Form1, un componente Button OK que en su evento OnClick contiene el for y la carga del componente ListBox, con el siguiente;
Pantalla de diseño
Programa
Este procedimiento y método igualmente trabaja con un componente ComboBox.
Recordar que todos los componentes visuales analizados hasta ahora, en sus propiedades text o caption, entran y salen puras strings.
Por eso en el programa se uso la funcion IntToStr(variable entera) para cargar una string en el componente LISTBOX.
Practicar hasta conseguir tener esta pantalla de salida o de ejecución, cuando se consiga entonces ya se esta listo para lo siguiente.
Su formato general es :
Cargar o inicializar variable de condicion;
programa ejemplo;
Corrida
While puede llevar dos condiciones, en este caso inicializar 2 variables de condición y cuidar que existan 2 de rompimiento de ciclo.
El grupo cierto de instrucciones puede ser una sola instrucción o todo un grupo de instrucciones.
La condición puede ser simple o compuesta.
A este ciclo también se le conoce también como ciclo de condición de entrada prueba por arriba, porque este ciclo evalúa primero la condición y posteriormente ejecuta las instrucciones.
También se le conoce por esta razón como ciclo de condición de salida.
Su formato general es :
cargar o inicializar variable de condición;
programa ejemplo:
Corrida
Otra diferencia básica con el ciclo while es que, aunque la condición sea falsa desde un principio, el cuerpo de instrucciones se ejecutara por lo menos una vez.
Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o si el programa de alguna manera puede calcularla usar for.
Si se desconoce la cantidad de veces a repetir el ciclo o se quiere mayor control sobre la salida o terminación del mismo entonces usar while.
Si se quiere que al menos una vez se ejecute el ciclo entonces usar repeat until .
En programación tradicional siempre se manejan dos tipos de arreglos, los arreglos tipo listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados, matrices o bidimensionales, en ambos casos son variables que permiten almacenar un conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas que cada uno de estos tipos contiene, como en los siguientes ejemplos;
Juan
18 ? Edad[1]
CIA ACME
INST TECN DE TIJUANA
Como se observa, la diferencia principal entre un arreglo tipo lista, y un arreglo tipo tabla, son las cantidades de columnas que contienen.
NOTA IMPORTANTE.- LOS CONCEPTOS MANEJADOS AQUI ESTAN ENFOCADOS A LOS SISTEMAS DE INFORMACION CONTABLES FINANCIEROS ADMINISTRATIVOS.
EN ALGEBRA MATRICIAL, SI SON IMPORTANTES LOS CONCEPTOS DE VECTORES Y MATRICES, PERO LAS OPERACIONES Y METODOS SON PRECISAMENTE LOS DEL ALGEBRA MATRICIAL Y NO ES PROPOSITO O LUGAR INDICADO PARA TRATAR PROBLEMAS Y OPERACIONES CON MATRICES.
Un arreglo tipo lista se define como una variable que permite almacenar un conjunto de datos del mismo tipo organizados en una sola columna y uno o mas renglones.
También reciben el nombre de vectores en álgebra, o arreglos unidimensionales en programación.
Los procesos normales con una lista o con sus elementos, incluyen declarar toda la lista, capturar sus elementos, desplegarlos, realizar operaciones con ellos, desplegarlos, etc.
Para declarar una lista se usa el siguiente formato;
VAR
ejemplos;
VAR
Nota: en caso de listas de strings observar que la string se le asigna un tamaño especifico.
Notas:
Declaración.- Es necesario recordar, que la declaración de un arreglo tipo lista se puede hacer en dos lugares diferentes, dependiendo de si solo se usa un botón de ordenes en la pantalla, o si dos o mas botones de ordenes, estarán procesando el arreglo, el segundo caso, es el mas común.
El dato capturado, proviene de momento de un componente visual escalar y por tanto para capturas se usan algunas variables de control como lo muestra el siguiente programa ejemplo, para capturar y procesar cuatro edades, el código y pantalla se es;
Programa ejemplo;
Pantalla de corrida
Notas:
La declaracion del arreglo y la variable de control renglon se realiza en la parte VAR del PROGRAMA no las partes verdes de var que se han puesto dentro del procedimiento buttonclick como se ha realizado en todos los programas que se han construido hasta la fecha.
Recordar que estas variables son globales o compartidas por todos los procedimientos o eventos del programa.
Se uso un componente nuevo el ShowMessage(’MENSAJE’); para desplegar un mensaje de lista llena.
Para el caso de operaciones y comparaciones con todos los elementos de la lista a la vez, se deberá usar un ciclo for con una variable entera llamada renglón, misma que también se usara como índice de la lista como se hizo en el problema ejemplo.
Recordar que todos los datos internos de la lista estarán almacenados en la memoria ram del computador, para despliegues se usa un componente visual que permite manipular un conjunto de datos a la vez, el ListBox, pero se tiene que usar un ciclo for() para ir añadiendo o agregando elemento por elemento como se observa en el problema ejemplo que se ha venido desarrollando.
Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados en dos o mas columnas y uno o mas renglones.
Para declarar un arreglo de este tipo se usa el siguiente formato:
VAR
Para procesar ( recordar solo operaciones y comparaciones) internamente todos los elementos de la tabla se ocupan dos ciclos for uno externo para controlar renglón y uno interno para controlar columna.
Solo recordar que en capturas, se deberán usar logica de control ya sea con variables globales o se pueden usar controles o componentes ocultos de tipo label o edit y en despliegue usar un ListBox como lo muestra el programa ejemplo.
Programa delphi
Pantalla de salida
Este componente permite procesar visualmente un conjunto de elementos de tipo string.
Este componente hereda muchas de las propiedades y métodos de TStringList y TStrings, que son las clases bases de las cuales hereda propiedades y metodos, mas algunas propiedades y métodos propios tales como:
Como se observa contiene muchas propiedades y métodos que facilitan grandemente el trabajo con los elementos de una lista.
Se puede añadir, eliminar e insertar ítems en la lista usando los métodos Add, Delete, Insert con la propiedad Items, que también es de tipo TStrings.
Si se quiere que ListBox presente varias columnas, solo cambiar el valor de la propiedad Columns, para ordenar o clasificar los ítems, usar la propiedad Sorted.
Se puede permitir que un usuario realice una selección múltiple, poniendo la propiedad MultiSelect en true, la propiedad ExtendedSelect determina como se realiza la selección múltiple.
Para determinar cual ítem en particular esta seleccionado solo validar la propiedad Selected, para conocer cuantos ítems se han seleccionado revisar los valores de la propiedad SelCount.
Propiedades:
Métodos:
En la practica para cargar o capturar sus elementos, se deberá usar el método Add, ya que no se permite cargar directamente sus datos o elementos por el usuario del programa, solo usar código como el analizado en los temas anteriores ;
Recordar que se pueden usar todos los métodos, para insertar, eliminar, contar, etc.
Si los valores son de tipo “numérico”, se pueden efectuar procesos con ellos de dos maneras:
Pasando los valores de ListBox a una variable numérica de tipo arreglo y procesando esta ultima variable.
Usar instrucciones directamente de proceso con las funciones INTTOSTR y STRTOINT.
Si es necesario pasar el contenido de ListBox1 a ListBox2, solo usar la propiedad Text en ambas, ej.; (ListBox2.Text := ListBox1.Text).
LO MAS IMPORTANTE A TOMAR EN CUENTA Y RECORDAR ES QUE A DIFERENCIA DE ARREGLOS TRADICIONALES LISTBOX EMPIEZA SU PRIMRE INDICE O RENGLON EN 0 ( CERO ) COMO ES COMUN EN EL LENGUAJE DE PROGRAMACION C++, RECORDAR AJUSTAR SUS CICLOS DE PROCESOS Y SUS CONTADORES DE CONTROL PARA QUE TOMEN ESTA NOTA EN CONSIDERACION.
Ejemplo con ListBox, para este caso se pide capturar 5 edades en un ListBox, luego sumarle 3 años a cada una usando el mismo ListBox, y desplegarlas en un segundo ListBox convertidas a meses.
Pantalla de diseño:
Código:
Pantalla de salida:
Este componente es de los mas importantes, para el procesamiento de muchos datos, permite concentrar, procesar y mostrar gran cantidad de información para la vista del usuario.
Este componente presenta, manipula y procesa conjuntos de datos de tipo strings en forma tabular, es decir en forma de tablas, matrices, cuadros concentrados, ejemplo;
CIA ACME
Recordar que son los datos numéricos internos quienes se procesan (es decir, se capturan, se realizan operaciones con ellos, se despliegan, etc.), es la información externa quien le da sentido.
Y RECORDAR QUE SUS INDICES EMPIEZAN EN RENGLON=0 y COLUMNA=0.
Algunas de sus propiedades y métodos mas interesantes son:
ColCount.- Determina la cantidad de columnas que contendrá la tabla.
Recordar que para efectos de programación, la primera de ellas es la columna 0.
RowCount.- Determina la cantidad de renglones que contendrá la tabla.
Recordar que para efectos de programación, el primero de ellos es el renglón 0.
Fixedcol , Fixedrow.- Determinan la cantidad de columnas y renglones fijos o de encabezado, estas propiedades ponerlas en 0.
+Options, goediting = true; Para que permita editar o capturar datos al usuario.
+Options, gotab = true; Para que el usuario pueda navegar entre celdas usando la tecla del tabulador.
Cells[columna,renglón], Es la propiedad mas importante, porque es la que permite el acceso a cualquier celda de la tabla, ej.
StringGrid1.Cells[1,1] := ‘PATO’;
Edit1.Text=StringGrid1.Cells[0,0];
Las demás propiedades investigarlas en la ayuda del borland delphi .
Para procesar todos los elementos de la tabla, solo recordar que se deben usar dos ciclos for uno externo para controlar columnas y uno interno para controlar renglón ( observar que es lo inverso de las tablas o arreglos normales).
Ejemplo capturar una tabla de 3 * 4 enteros, y restarles 4 después;
Pantalla de Diseño: (inspector objetos)
FORM1:
Programa;
Pantala de corrida:
CIA ACME
En este ejemplo aparte de la tabla se ocupan 4 listas, dos para totales y dos para promedios.
El código en C++ es sencillo, pero cambiarlo a borland delphi, recordarlo y aprenderlo para siempre:
En general existen dos modelos de almacenamiento de datos en los sistemas de información.
El modelo tradicional de archivos que se construye con los siguientes elementos:
También se pueden definir como representaciones simbólicas y programaticas de entidades lógicas de información, ejemplos de variables registros son alumnos, empleados, clientes, proveedores, productos, autos, etc.
Esta variables registros, también ocupan programas o rutinas de programas para procesarlas, por ejemplo un procedimiento, modulo o subrutina, se encargara de capturar los datos que contendrá la variable registro, otro procedimiento para corregir los datos que ya contiene, otro procedimiento para desplegarlos en pantalla ya cuando ha sido capturada y así sucesivamente.
Igualmente los archivos ocupan su propios programas o subrutinas o procedimientos especializados por ejemplo, procedimientos para crear los archivos, para almacenar o dar de altas los registros en el archivo, procedimientos para buscar un registro determinado, procedimiento para dar de baja un registro, etc.
Salta a la vista que construir un sistema de información por ejemplo para una tienda de vídeo o para un refaccionaría, etc. involucra un gran cantidad de trabajo de programación, puesto que hay que programar muchas variables registros, muchos archivos en disco, y una o varias aplicaciones.
Este modelo se usa todavía en la actualidad, pero es obvio que mejores maneras, mas rápidas, seguras y eficientes existen en la actualidad para resolver estos problemas, y esto nos lleva al segundo modelo de datos.
Tablas es una combinación de las variables registro y de los archivos del modelo anterior.
Es decir cuando un programador moderno define o declara una tabla en un programa, realmente esta haciendo dos cosas por el precio de una, es decir crea una variable registro en memoria que almacenara los datos y al mismo tiempo ya esta creando un archivo en disco que se llamara igual que la tabla o variable registro y que automáticamente se convertirá en un espejo de la tabla en memoria, es decir cuando se cargan los datos en la tabla en memoria, también se estarán cargando ala vez en disco.
Otra vez cuando el programador escribe código para capturar los datos y mandarlos a la tabla en pantalla-memoria, realmente también lo esta haciendo para darlos de alta en disco.
Aplicación, que tiene la misma función que en el modelo anterior.
No confundir este concepto de tablas en base de datos con el concepto de tablas, vistos en el capitulo de arreglos, aunque en la practica se parecen mucho la diferencia es que los datos no se van a disco.
Como se observa en este modelo, es mas sencillo construir sistemas de información con el, puesto que la parte programatica se reduce ampliamente.
Una Tabla simple, representa una unidad de información de una entidad lógica de información:
Tabla Empleado:
Clave Empleado
Tabla Proveedor:
Clave Proveedor
Tabla Autos:
Numero de Serie
Observar que cada tabla, empieza con una clave generalmente de tipo numérica.
Todos los elementos de la tabla, solo hacen referencia hacia el mismo ente o sujeto de información.
Cada elemento solo representa o debe contener un solo dato de información.
No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas al tiempo de programación.
Existe una segunda forma o manera de representar las tablas, ejemplo:
Tabla: Camisas
NumCamisa Marca Estilo Medida Color Material
Tabla: Clientes
NumCliente NomCliente DirCliente TelCliente
Recordar siempre, una tabla almacena o representa un conjunto de datos relacionados entre si, la tabla de alumnos es para almacenar y manipular muchos alumnos, la tabla de productos es para almacenar y manipular muchos alumnos, en resumen si en un problema de información solo se presenta una instancia o renglón de una entidad lógica, entonces no es tabla, es un encabezado.
El trabajo correcto con bases de datos relaciónales, se divide en dos grandes pasos o etapas bien diferenciadas entre si:
En la primera etapa se diseña la tabla , con sus campos, llaves y condiciones especiales, luego se usa un paquete o programa de software especializado en la construcción, mantenimiento y administración de la base de datos, este software se usa para convertir la tabla o tablas ya bien diseñadas en un archivo en disco.
Estos paquetes, o software reciben el nombre de DBMS(DATA BASE MANAGEMENT SYSTEM) o sistema administrador de bases de datos.
Este software se especializa en la creación, mantenimiento, seguridad, privacidad, etc. de un conjunto de tablas o mejor dicho una base de datos, los DBMS mas comunes son Oracle, SqlServer, Informix, Sysbase, etc.
Borland la compañía que fabrica C++Builder, proporciona junto con el BORLAND DELPHI , un mini DBMS llamado DataBase Desktop, mismo que se encuentra en el mismo folder o subdirectorio que el BORLAND DELPHI, y que también se usara para construir las tablas y/o archivos físicos.
La segunda etapa consiste en construir la aplicación o aplicaciones que ya tendrán acceso o podrán manipular los datos contenidos en la tabla, estas aplicaciones se escriben usando ya sea lenguajes clásicos de programación como BASIC, PASCAL, COBOL, CBUILDER, DELPHI, etc., o también se pueden accesar paquetes comunes de manipulación de archivos o bases de datos como DBASE, CLIPPER, VISUALFOX, ACCESS, etc.
DISEÑO Y CREACION DE UNA TABLA
A estos atributos o campos especiales se les conoce como claves o llaves secundarias, que internamente generan otra tabla especial llamada tabla o archivo de índices, (tabla o archivo que contiene dos campos,
el primero es la clave secundaria ordenada y el segundo la posición o renglón donde se encuentra en la tabla original).
Escribir restricciones y condiciones apropiadas para ciertos atributos , por ejemplo el número de empleado deben comenzar en 500, la edad no debe ser mayor de 150 años, etc.
Ya listo el diseño de la tabla, se pasa a el programa correspondiente para su creación y almacenamiento, dicho programa que se encuentra dentro de el folder o subdirectorio de BORLAND DELPHI.
No es un componente de la barra de herramientas, es el icono de un programa que se encuentra en el mismo folder o directorio que el C++Builder.
El procedimiento completo para construir la tabla, es:
Primero crear un folder o subdirectorio especial en el disco duro C:, para guardar o almacenar las tablas o base de datos (conjunto de tablas), esto se hace con un click en My Computer, luego click en disco C;, luego File, New Folder, y renombrarlo por ejemplo a Datos1, o Tablas o Base de Datos (Win95 permite directorios con espacios en blanco intermedios).
La pantalla de entrada es:
Tomar nota de las dos áreas del editor, la primera de ellas es el field roster y la segunda área es la de propiedades de la tabla.
Como se observa existen muchos e interesantes tipos de datos, de momento solo usar los mas comunes, enteros, short, numéricos, y alpha para el caso de strings.
La opción size(tamaño) solo se usa cuando el campo es de tipo string ( ALPHA) y se tiene que dar el tamaño de la string, por ejemplo en campo Dirección el size o tamaño es 30.
La opción Key, es para marcar un atributo o campo, como llave primaria, o llave principal de las instancias o renglones u objetos diferentes de la tabla, para marcar un campo como llave primaria, solo dobleclick en esta opción Key.
Todas y cada una de las propiedades, se definen abajo en la parte de propiedades del editor de tablas, es decir la propiedad validity check tiene como elementos:
[ ] campo requerido
[ ] valor mínimo
[ ] valor máximo
[ ] valor de default
[ ] picture(mascarilla de edición)
La propiedad siguiente tiene sus propios elementos y así sucesivamente.
De momento solamente dejar las propiedades o sus partes en blanco.
Ya creada la tabla, es conveniente cargarle unos cuantos renglones registros o datos para pruebas, esto se hace con:
Ejemplo de una tabla;
Recordar que como la clave es de tipo AUTOINCREMENT en mi ejemplo, no se ocupa capturarla, solo capturar el resto del renglon y cambiarse de renglon, para que database desktop la cargue.
Recordar que todos los cambios hechos a una, añadir, insertar, eliminar, modificar, etc quedan grabados automáticamente en disco, este hecho es la razón por lo que no existe una opción de grabar un renglón o registro cualesquiera.
Ahora si, ya creada, declarada o definida la tabla, es tiempo ahora de construir la aplicación, para esto se usara nuevamente el BORLAND DELPHI
Básicamente una aplicación consiste de un programa o forma que permite accesar, manipular, editar, procesar, etcétera, los datos, registros, o renglones de una tabla, es decir es la aplicación la que constituye, la vista sobre la que trabaja el usuario del programa.
Como ya se explico en el modelo tradicional de almacenamiento de datos, existían muchos procesos, tanto para la manipulación de registros en memoria, capturas, modificaciones, etc., como para el almacenamiento de todos ellos en archivos en disco, el famoso ABC de un sistema de archivos (altas, bajas, consultas, modificaciones, etc.) y todos ellos había que construirlos programarlos a mano, era terrible la situación de los programadores de antaño.
En el modelo relacional visual de datos, mucho de este trabajo no existe, solo se construye una forma, y se pegan unos cuantos componentes para que aparezcan las propias tablas y componentes para que se procesen los datos que contendrán la tablas.
Recordar también que la aplicación ya no deberá preocuparse, donde se almacenan los datos, de validar las condiciones y restricciones impuestas en ellos, etc., todo este trabajo ahora es responsabilidad del miniDBMS que usado, el DataBase Desktop.
En Borland Delphi existen dos maneras sencillas de construir aplicaciones, la primera de ellas es presentarle al usuario un solo renglón de información para su proceso y manipulación y la segunda es presentarle toda la tabla a la vez, también para su manipulación y proceso.
Para construir una aplicación, presentándole un solo renglón al usuario para su procesamiento en Borland Delphi solo se ocupa una forma (Form1) y cuatro componentes diferentes de acceso y manipulación de tablas, estos cuatro componentes son:
PROCEDIMIENTO Y COMPONENTES
Este componente Table, sirve de enlace físico entre la tabla real que se creo con el DataBase Desktop y el resto de los componentes que se usaran para la construcción de la aplicación.
Sus tres propiedades mas importantes son:
Este Componente actúa como el enlace físico entre el Componente Table y el resto de componentes que procesan los datos de la tabla, es decir el componente Table apunta a la tabla real en disco, el componente DataSource apunta al componente Table, y el resto de los componentes apuntan a DataSource.
Su única propiedad a modificar es:
Propiedad DataSet = Click a un lado y seleccionar el componente Table al que se quiere enlazar, por ejemplo Table1.
First Regreso al primer registro o renglón de la tabla.
Prior Regreso a registro o renglón anterior.
Next Avanza al siguiente renglón.
Last Avanza a el ultimo renglón.
Insert Inserta un nuevo renglón en la tabla.
Delete Borra o elimina el renglón o registro actual.
Edit Pone el registro actual en estado de edición para su modificación
Post Graba el registro o renglón actual en la tabla en disco.
Cancel Cancela modo edición y restaura los datos anteriores que tenia el renglón.
Refresh Refresca o regraba toda la información.
Recordar poner unos cuantos componentes Label arriba de los botones del navegador para su aclaración, uso y manejo al usuario.
Sus dos propiedades mas importantes son:
Con estos cuatro componentes ya se construye una aplicación, ejemplo;
Pantalla de Diseño:
Pantalla de ejecución:
En este tipo de aplicación, al usuario se le presenta toda la tabla completa a la vez para su procesamiento y manipulación.
Para construir esta tipo de aplicación, solo se ocupan tres componentes y dos de ellos ya son conocidos, estos componentes son:
Componente Table ( Data Access)
Componente DataSource ( Data Access)
Componente DBGrid ( Data Controls)
Este componente le presenta todos los renglones a la vez al usuario para su procesamiento, en un formato muy similar al visto en el componente StringGrid.
Su propiedad mas común es:
Una característica interesante, es que este componente DBGrid, trae asociado un editor de columnas, solo poner el componente DBGrid en la forma, enlazarlo al DataSource y luego doble click dentro del DBGrid y aparece el siguiente editor:
Primero usar el botón Add All Fields para cargar todos los campos columnas a la primera ventana y de esta ventana ir seleccionando el campo o columna a procesar, observar que se pueden agregar nuevas columnas, o eliminar columnas existentes y para cada columna que se vaya seleccionando ya funciona la segunda parte del editor.
Componente DBNavigator( Data Access)
Aunque este componente no se ocupa en este tipo de aplicación, puesto que el usuario puede realizar todos los procesos básicos directamente dentro de la tabla, es conveniente poner un navegador para darle una segunda opción o manera de realizar los procesos básicos.
Un ejemplo de aplicación con esta estructura es:
Pantalla de Diseño
Pantalla de ejecución:
OPERACIONES CON CAMPOS
Corrida:
Como se observa se puede accesar y manipular los componentes DBEdit usando la propiedad Text, tanto para leerlos como para cargarlos.
Un problema muy común en los sistemas de información basados en bases de datos es el de búsquedas en estos casos el usuario proporciona un dato, generalmente la clave del registro, para que se localice toda la información pertinente.
Para resolver este problema, solo se ocupa:
corrida:
Los parámetros del método Locate(), son;
Locate(”Columna de búsqueda” ,”Dato a buscar” , [loCaseInsensitive, loPartialKey]);
cuando opción = loCaseInsensitive ? ignora diferencia entre mayúsculas y minúsculas
cuando opción = loPartialKey ? resultado parcial, ejemplo si se busca “ju” se posesiona en el primer renglón donde ese campo empiece con “ju”, ejemplo Juan, juvenal, etc.
Un filtro es una condición que permite desplegar solo determinada información de una tabla.
Es decir, en ocasiones solo se quiere desplegar información condicionada al usuario, por ejemplo de la tabla de clientes solo desplegar aquellos que sean de la ciudad de Tijuana, de la tabla de autos, solo desplegar aquellos de modelo 1990 en adelante.
Como se observa, filtrar una tabla, es condicionar uno o mas campos o columnas.
Filtros o condiciones se tendrán que programar tomando en cuenta a como Pascal maneja las constantes strings, los operadores relaciónales y los operadores lógicos.__
Existen dos maneras de poner filtros o condiciones para una tabla, ellas son:
= ClaveCliente < 3
= Ciudad <> ‘Tijuana’
= ClaveCliente > 2 and Ciudad = ‘Tijuana’
onclickbutton1()
{
Table1.Filter = Edit1.Text;
Table1.Filtered = true;
}
Campos de gráficos o de imágenes, se han convertido en una de las grandes atracciones y características de las bases de datos modernas.
En borland delphi el manejo de dichos campos es muy fácil solo:
onclickbutton1()
Recordar que para usar estos métodos, el Clipboard de Windows ya debe estar cargado con la imagen, para pruebas sencillas, minimizar la aplicación, cargar el PaintBrush o Paint, cargar un archivo grafico por ejemplo un BMP, seleccionarlo luego Edit Copy, cerrar el Paint o PaintBrush y maximizar la aplicación y aplicar cualquiera de los dos métodos.
Es evidente que también se pueden usar CTRL C, CTRL X, CTRL Del(ver edit de cualquier ventana), CopyToClipboard() (ver ayuda de DBImage), etc., para diferentes procesos.
Recordar además que la tabla física no actualiza el campo correspondiente con su imagen, si no se avanza de renglón, o se usan los botones Next, Refresh, Update del navegador.
OnClickButton1()
Ya debe estar en el directorio o folder datos dicho archivo grafico y además otra vez recordar, que aunque la imagen ya esta en la pantalla, todavía no se manda a la tabla a disco si no se ejecuta un avance de renglón o un Next, etc.
Imprimir tablas o construir reportes sobre las mismas, es también una tarea común en los sistemas de información basados en bases de datos.
Lo bueno es que se tiene un folder o pestaña llamada QReport cargada de componentes visuales especializados en la impresión de reportes, esta librería de componentes, no es hecha por Borland, es hecha por una compañía llamada QSOFT™
QReport
Practica para construir un reporte que contiene la cédula de un y solamente un cliente de la tabla de clientes.
Los componentes y propiedades a usar son:
Es el componente principal para impresión.
Toma la forma y tamaño de una hoja de impresora dentro de Form1.
Sus propiedades a usar son:
Se usara para crear un rectángulo para encabezados de la cédula de un cliente.
Son varios tipos o formas las que existen de QRShape, rectángulos, líneas, círculos, etc., rectángulo es default, y la propiedad para cambiar de forma es Shape.
Acomodarlo y expanderlo en la parte superior de la hoja de impresión (QickRep1).
Sus propiedades a usar son:
Similar a label, contienen textos o mensajes estáticos.
Colocarlo dentro del rectángulo o sección de encabezado.
Propiedades:
Componente especiales que contienen datos fijos de impresión, tales como numero de pagina, fecha, hora, etc.
Colocarlo también dentro de la sección o banda de encabezado.
propiedades:
Otro del anterior, colocarlo dentro de la banda de encabezado, propiedad
Data = click a un lado y seleccionar qrsPageNumber
Con este se forma ahora un sección, rectángulo o banda principal.
Cuando un reporte, imprime mas de un renglón, por ejemplo todos los clientes, esta parte de la hoja recibe el nombre de banda de detalle.
Propiedades:
Colocar varios dentro de la banda de detalle, con caption apropiado, ejemplo, clave, nombre, foto, etc.
Componente para desplegar cada dato de una celda o campo o columna de una tabla, es similar a DBEdit pero es estático, es decir solo despliega.
Se deberán poner tantos componentes QRDBText en esta banda o sección de detalle, como columnas de datos existan o se quieran desplegar de la tabla.
Propiedades:
Componente para desplegar e imprimir campos de tipo Graphics ( BMP, ICO, WFW).
Propiedades:
Notas:
solo una de las dos }
ejemplo:
Button1Click(TObject *Sender)
// -------------------------------------
bueno parte de ella.
Primero se deberá quitar el filtro en la tabla y segundo entender lo que tienen en común todas las hojas de impresora que se ocupan para imprimir la tabla.
Primero todas las hojas ocupan un mismo encabezado o un mismo pie de pagina, donde puede ir por ejemplo la fecha o el numero de pagina.
La primera hoja de todo el reporte, cuando menos debe llevar una banda de titulo, con el nombre de la compañía, el titulo y propósito de la tabla, la fecha, etc.
Todo los renglones de la tabla, ocuparan muchas hojas de impresora para desplegarse, incluyendo un encabezado para todas las columnas que están en la hoja, repito necesitamos un encabezado para columnas y que aparezca en todas las paginas.
Probablemente, en la hoja final, seria conveniente añadir algunos contadores y acumuladores, por ejemplo la cantidad de renglones, algún acumulado de alguna columna numérica en especial, etc.
QReport, usa este modelo de bandas para la construcción de reportes, es decir, en la practica anterior se uso un componente QRShape, para dividir el reporte en dos partes, secciones o bandas, pero QReport trae incorporado un componente llamado QRBand que permite dividir en partes, secciones o bandas todo el reporte.
Este componente QRBand, en su propiedad BandType, permite construir los siguientes seis tipos importantes de banda.
BANDA NOTAS
PAGE HEADER Banda de encabezados de paginas.
Aparece en todas las hojas impresas.
Poner dentro componentes para numero de pagina, etc.
TITLE Banda de Titulo o encabezados del Reporte.
Solo aparece en la primera hoja impresa.
Poner componentes qrlabel con el nombre de la compañía, el propósito de la tabla, fecha, etc.
COLUMM HEADER Banda de o para encabezados de columnas.
Aparece en todas las hojas impresas.
Poner dentro componentes qrlabel con el encabezado que lleva cada columna de la tabla.
DETAIL Banda de detalle.
Es la mas importante, porque es la que contiene los datos de los renglones de la tabla.
Es la que constituye el grueso de las hojas impresas.
Solo colocar dentro de esta banda los componentes de datos impresos, QRDBText y QRDBImage
SUMMARY Banda de resumen.
Solo aparece en la hoja final de impresión.
Poner dentro de ella componentes de operaciones como es QRExpr y estudiarlo en la ayuda, para conocer sus métodos (funciones) y aplicarlas.
PAGE FOOTER Banda de pie de pagina.
Aparece en todas las hojas impresas.
Su función es similar a la banda de encabezado.
De hecho, en un reporte solo se usa la b banda de encabezado o la banda de pie de pagina, pero no las dos.
Solo poner dentro de esta banda, componentes de numero de pagina, o de fechas, o de hora, etc.
Lo mas importante a tomar en cuenta es cada componente QRBand que se ponga dentro de un reporte, se deberá definir usando su propiedad BandType, como una cualquiera de los seis tipos de bandas, es decir,
QRBand1 = banda de encabezado,
En general el procedimiento completo es:
Lo primero que vamos a hacer es crear el alias de la base de datos. Para esto debemos seguís los siguientes pasos:
Inicio -> Configuración -> Panel de Control -> Herramientas Administrativas -> Orígenes de Datos ODBC:
Hacen click en Agregar…
Aparece la siguiente ventana:
Seleccionan MySQL ODBC 3.51 Driver y hacen click en Finalizar.
Aparecerá la ventana que se muestra a continuación:
En donde completamos los siguientes datos:
Data Source Name: El Alias, es decir el nombre con el que haremos referencia nuestra base de datos.
Data Base Name: El nombre con el que creamos la base de datos en MySQLFront. Aquí debe aparecer el nombre de uno de los directorios que se encuentran en C:\Archivos de programas\ EasyPHP1-8\mysql\data.
Recuerden que aquí se crea un directorio para cada base de datos.
User y Password: Nombre de usuario y contraseña. Podemos dejarlo en blanco por razones prácticas.
Botón Test Data Source: Hacer click para probar la conexión.
Si ponemos un nombre de una base de datos inexistente aparece la siguiente ventana de error:
Lo que nos indica que no se conoce la base de datos.
Colocando el nombre correcto de la base de datos, y probando una vez más tenemos que ver lo siguiente:
Lo cual indica que todo salió bien. Hacemos click en los botones Aceptar y OK en las ventanas sucesivas y cerramos el panel de control.
Listo.
Si tienen corriendo Delphi deberán cerrarlos y ejecutarlo de nuevo para que se tomen los cambios.
Ahora creamos una nueva aplicación Delphi. Creamos un módulo de datos. Colocamos en el los componentes de Table y DataSource.
En el componente de tabla elegimos el alias de la base de datos, el nombre de la tabla, la activamos, etc., tal como lo vimos anteriormente.
De aquí en más nos olvidamos que estamos trabajando con MySQL. Todos los métodos tradicionales para insertar, modificar y eliminar registros van a funcionar bien.
Código de Altas
Código de Bajas
Código de Modificación
Código de Consultas
Y para el cruel que me arranca
Te espero en: wilucha@gmail.com
Esta page está en: www.wilocarpio.com.ar
13/10/2010
Construir un primer programa que consiste en un forma que contenga los cinco datos mas importantes de un automóvil, y uno de esos datos solo deberá aparecer cuando el usuario haga click en el botón de ejecución o de orden o de OK.
- Observar que Caption se carga como si fuese una variable de tipo “string”, dentro de un programa, es decir entre apostrofes ( ' ).
- Observar que atrás del editor esta Form1, si se selecciona con un click, este procedimiento lo regresa a la forma para seguir arreglando o colocando nuevos elementos.
- Otra manera de estarse intercambiando entre forma y editor ( ahora lo llamaremos Unit1.cpp), es decir entre form1 y Unit1, es usar el icono Toggle Form/Unit que se encuentra en la barra de componentes arriba y a la izquierda.
- Usar la opción Run que esta arriba en la barra de menús.
- Usar icono “run” en barra de herramientas.
Este componente es el mas importante componente visual de Borland Delphi, su función principal es manejar todos los procesos de entrada y salida (input/output) al programa.
procedure TForm1.Button1Click(Sender: TObject);
var
temp:Real;
begin
temp := StrToFloat(Edit1.Text)* StrToFloat(Edit2.Text);
Edit3.Text:=Format('%0.2f',[temp]);
end;
- IntToStr( dato o variable integer);
- StrToInt( variable string o propiedad text de un componente visual);
- FloatToStr( dato o variable real);
- StrToFloat(variable string o propiedad text de un componente visual);
procedure TForm1.Button1Click(Sender: TObject);
var
temp:Real;
begin
temp := StrToFloat(Edit1.Text)* StrToFloat(Edit2.Text)/ 2;
Edit3.Text:=Format('%0.2f',[temp]);
end;
Pantalla de ejecución o de salida
Este componente es muy similar en su uso al componente Edit, excepto que proporciona una mascara especializada para el formato de datos, es decir se puede usar para que el usuario proporcione datos con formatos bien definidos, como son valores numéricos que incluyan puntos y comas por ejemplo 3,345.87, o que incluyan símbolos como el de $, o para el caso de fechas que lleven su propio separador como por ejemplo 02/28/97.
Si el usuario del programa tiene que proporcionar datos que provienen de un conjunto finito y muy pequeño de posibles respuestas, esto significa que cada vez que se ejecute el programa, el usuario estará proporcionando las mismas respuestas.
Como ya se empieza a notar en los programas construidos, la cantidad de datos e información empiezan a amontonarse en la ventana simple que se ha venido construyendo.
Es el componente mas sencillo y común de agrupamiento, se utiliza para poner un panel o un cuadro o marco dentro de una ventana.
Este componente es otra forma standard de agrupamiento de componentes de programas en Windows, se usa para agrupar componentes relacionados dentro de una forma. También se utiliza para separar áreas lógicas dentro de una ventana de Windows.
El siguiente problema común, con el manejo de programas en borland delphi, es el de poder crear, controlar y administrar mas de dos formas o ventanas a la vez.
a) Form5.Edit3.Text := Form1.Edit2.Text;
// se esta pasando el texto de edit2 de primera
// ventana al texto de edit3 de la quinta ventana
b) REAL alfa := StrToFloat(Form2.Edit4.Text);
// se esta poniendo en una variable real el contenido
// de la caja cuatro de la tercera ventana
como se observa, procesar los elementos de dos ventanas, es sencillo pero además existen ciertas condiciones que deberán cuidarse para que estos procesos funcionen, estas condiciones son:
- Form2.Visible := true;
- Form2.Show(); // similar a la anterior(pero mas corta)
3) Form2.ShowModal(); // no permite accesar la primera ventana, hasta que se cierra(X) la segunda ventana.
Este componente visual permite realizar en forma fácil toda una serie de tareas comunes en Windows.
desplegar “rico”
si no
desplegar “pobre”
fin-si
imprime mujer
si no
imprime hombre
fin-si
-------> si condición entonces
/ grupo cierto de instrucciones
/
Instruccion Condicional -------> sino
\ grupo falso de instrucciones
\
-------> finsi
Operador Significado
= Igual que
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
<> No es igual o es diferente que
IN Pertenece A
Para el caso de objetos de tipo string, los operadores mencionados arriba funcionan, es decir es valido usar la siguiente condición:
if condición Then
begin
grupo cierto de instrucciones;
end
else
begin
grupo falso de instrucciones;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
temp,error:integer;
begin
Val(Edit1.Text,temp,error);
if temp >= 1000 then
begin
Label2.Caption := 'RICO';
end
Else
begin
Label2.Caption := 'POBRE';
end
end;
Si es necesario presentar mas de una condición para su evaluación al computador. Por ejemplo que el computador muestre la boleta de un alumno, si este estudia la carrera de medicina y su promedio de calificaciones es mayor de 70.
OPERADOR SIGNIFICADO
AND “Y” LOGICO
OR “O” LOGICO
NOT “NO” NEGACION
Para que el computador evalúe como CIERTA una condición compuesta que contiene el operador lógico “and”, las dos condiciones simples deben ser ciertas.
1cs 2cs Eval
C F F
F C F
F F F
1cs 2cs Eval
C F C
F C C
F F F
1cs ‘y’ 2cs Eva Parcial ‘o’ 3cs Eva final
C C c F c
C F f C c
C F f F f
F C f C c
F C f F f
F F f C c
F F f F f
Existen ocasiones o programas donde se exige evaluar muchas condiciones a la vez, en estos casos, o se usan una condición compuesta muy grande o se debe intentar convertir el problema a uno que se pueda resolver usando la instrucción case;
CASE var int o char OF
const1: begin instrucción(es); end;
const2: begin instrucción(es); end;
const3: begin instrucción(es); end;
else begin instrucción(es); end
END;
procedure TForm1.Button1Click(Sender: TObject);
begin
case Edit1.Text[1] of
'a': begin Label2.Caption := 'AGUILA'; end;
'b','B': begin Label2.Caption := 'BECERRO'; end;
'c': begin Label2.Caption := '5 ' + 'CABALLOS'; end;
else begin Label2.Caption := 'No Hay' end;
end
end;
Las instrucciones if y case, nos permiten tomar decisiones o realizar seleccionase dentro del código de un programa.
Permite seleccionar una opción al usuario del programa o tomar una decisión, directamente en pantalla.
procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckBox1.Checked Then
Begin Label1.Caption := 'CALIENTE' end
else begin Label1.Caption := ' '; end;
if CheckBox2.Checked Then
Begin Label2.Caption := 'FRIO' end
else begin Label2.Caption := ' '; end;
if CheckBox3.Checked Then
Begin Label3.Caption := 'TEMPLADO' end
else begin Label3.Caption := ' '; end;
end;
- Observar que por cada checkbox en la forma se ocuapara un if.
- La propiedad Checked estara cargada con TRUE o FALSE al ejecutarse el programa y por tanto la instruccion IF ejecutara la parte cierta o la parte falsa de instrucciones apropiada, es decir se uso CHECKBOX.CHECKED directamente en la instruccion porque seria equivalente a CHECKBOX.CHECKED = TRUE.
Se utilizan para presentar al usuario un conjunto de opciones mutuamente excluyentes entre si, es decir si el usuario selecciona un componente RadioButton todos los demás componentes RadioButton en la forma, se desmarcan solos, o se deseleccionan solos, como mejor se entienda.
Aunque es común agrupar un conjunto de RadioButton dentro de componentes Panel Y RadioGroup, BORLAND DELPHI proporciona este componente RadioGroup que esta especializado en la agrupación de RadioButton.
Con este componente se forman las barras de menú normales en cualquier programa de Windows (la barra que contiene File, Edit, etc.) junto con sus opciones correspondientes.
- Poner un componente MainMenu en una parte de la forma donde no estorbe (esto es porque este componente queda flotando dentro de Form1 y solo activa o se convierte en barra de menú al momento de ejecución del programa).
- Para cargarle las opciones, no del código que ejecutara cada opción, solo dobleclick dentro de este componente para que aparezca el siguiente diseñador de menús.
Este componente encapsula propiedades, métodos y eventos de un menú popup, este minimenu se activa cuando el usuario hace un click derecho en muchos componentes que lo pueden contener.
Instrucciones para ciclos, resuelven el problema de repetir todo el programa, o cierta parte del programa mas de una vez.
Este ciclo es uno de los mas usados para repetir una secuencia de instrucciones, sobre todo cuando se conoce la cantidad exacta de veces que se quiere que se ejecute una instrucción simple o compuesta. Su formato general es:
procedure TForm1.Button1Click(Sender: TObject);
var
x:integer;
begin
For x:= 10 to 20 do
begin ListBox1.Items.Add(IntToStr(x));
end;
end;
La pantalla de salida debe ser igual o parecida a la siguiente;
En este ciclo el cuerpo de instrucciones se ejecuta mientras una condición permanezca como verdadera, en el momento en que la condición se convierte en falsa el ciclo termina.
while ( condicion ) do
begin
instrucciones;
instruccion de salida de ciclo ;
end;
var
x:integer;
begin
x:=1;
while (x<=10) do
begin
ListBox1.Items.Add(IntToStr(x)+' pato');
x:=x+1;
end;
end;
Su diferencia básica con el ciclo while es que la prueba de condición es hecha al finalizar el ciclo, es decir las instrucciones se ejecutan cuando menos una vez, porque primero ejecuta las instrucciones y al final evalúa la condición;
repeat
instrucciones ;
instruccion de salida del ciclo
until (condicion) ;
procedure TForm1.Button1Click(Sender: TObject);
var
x:integer;
begin
x:=1;
repeat
ListBox1.Items.Add(IntToStr(x)+' gato');
x:=x+1;
until (x>=10);
end;
Dado un problema cualesquiera en borland delphi , cual ciclo se debe usar se resuelve con:
Pedro ? Nombres[2]
José
Ana ? Nombres[4]
Carmen
20
25
30 ? Edad[4]
ING MENS VTAS
(MILES DE $)
ENE FEB MAR ABR MAY
SUC A 10 12 15 10 9
SUC B 8 7 5 9 6
SUC C 11 18 20 14 17
CONCENTRADO DE CALIF
MAT FIS QUIM HIST
JUAN 5 5 5 5
JOSE 4 4 4 4
PEDRO 3 3 3 3
ANA 9 9 9 9
nomlista :array [1..n] of Integer;
Edades : array[1..12] of integer;
Sueldos : array[1..10] of Real;
Municipios : array[1..5] of string[20];
var
Form1: TForm1;
edad : array[1..5] of integer;
ren:integer=1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if ren <= 5 then
begin
edad[ren]:=StrToInt(Edit1.Text);
ListBox1.Items.Add(IntToStr(edad[ren]));
ren := ren + 1 ; Edit1.Text :=' ';
end;
if ren = 6 Then ShowMessage ('LISTA LLENA');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
r:integer;
begin
for r := 1 to 5 do
begin
ListBox1.Items.Add(IntToStr(edad[r] * 12));
end;
end;
Nomtabla: array[1..1,1..c] of Integer;
var
Form1: TForm1;
calif : array[1..3,1..4] of integer;
ren:integer=1;col:integer=1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Label2.Caption:=IntToStr(ren);
Label3.Caption:=IntToStr(col);
calif[ren,col]:=StrToInt(Edit1.Text);
col := col+1;
Edit1.Text :=' ';
if (col=5) then
begin ren:=ren+1; col:=1;
end;
if (ren=4)
then
begin
ShowMessage('TABLA LLENA');
Edit1.Visible := false;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
r:integer;c:integer;
temp:string;
begin
for r := 1 to 3 do
begin
for c:= 1 to 4 do
begin
// operaciones calif + 10 puntos
calif[r,c]:=calif[r,c]+10;
// juntando columnas para desplegar
temp:= temp + IntToStr(calif[r,c])+ ' ';
end;
// desplegando
ListBox1.Items.Add(temp);
temp:='';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add(Edit1.Text);
Edit1.Text := '';
end;
procedure TForm1.Button2Click(Sender: TObject);
var
r, temp :integer;
Begin
for r:=0 to ListBox1.Items.Count - 1 do
begin
temp := StrToInt(ListBox1.Items.Strings[r]) * 12;
ListBox2.Items.Add(IntToStr(temp));
end;
end;
INGRESOS POR VENTAS MENSUALES
MILLONES DE PESOS
ENE FEB MAR ABR
SUC A 1 2 3 4
SUC B 5 6 4 5
SUC C 6 7 8 9
procedure TForm1.Button1Click(Sender: TObject);
var
c,r,temp:integer;
begin
for c:=0 to 2 do begin
for r:=0 to 3 do
begin
temp:= StrToInt(StringGrid1.Cells[c,r])-4;
StringGrid1.Cells[c,r] := IntToStr(temp);
end; end; end;
INGRESOS MENSUALES
(MILES DE PESOS)
ENE FEB MARZO TOTALSUC PROMSUC
SUC A 1 2 3 6 2
SUC B 4 5 6 15 5
SUC C 7 8 9 24 8
SUC D 10 11 12 33 11
TOTMES 22 26 30
PROMMES 5.5 6.5 7.8
//declaración
float tabla[4][3], totsuc[4], promsuc[4];
float totmes[3], promes[3];
//observar tamaños de listas que referencian renglón
// listas que referencian columnas, se supone que la tabla // ya esta capturada.
//código para operaciones para totales y promedios //renglones por sucursal:
for(reng=0;reng<=3;reng++)
for(col=0;col<=2;col++)
{ totsuc[reng]=totsuc[reng]+tabla[reng][col]; };
for(reng=0;reng<=3;reng++) promsuc[reng]=totsuc[reng] / 3.0 ;
// operaciones para totales y promedios por mes
for(reng=0;reng<=3;reng++)
for(col=0;col<=2;col++)
{totmes[col]=totmes[col]+tabla[reng][col]; };
for (col=0;col<=2;col++) prommes[col]=totmes[col]/4.0;
Nombre Empleado
Dirección Empleado
Edad Empleado
Teléfono Empleado
etc. Empleado
Nombre Proveedor
Empresa Proveedor
Teléfono Proveedor
Fax Proveedor
Celular Proveedor
etc. Proveedor
Modelo
Marca
Tipo
Color
Capacidad
etc.
1 Jeans Manga Corta Grande Azul Algodón
2 Voláis Camiseta Mediana Negra Poliester
3 Genérica Manga Larga Chica Morado Rayón
etc. etc. etc. etc. etc. etc.
1 Juan Pérez Av. aba 121212
2 Luis Pérez calle zeta 898989
3 José Pérez cjon sss 000000
etc. etc. etc. etc.
El primer paso antes de usar el paquete correspondiente a esta tarea, es diseñar la tabla completamente, esto exige:
Analizaremos ahora algunos procesos también básicos que pueden realizarse con los dos tipos de aplicaciones y que además no están contemplados en algunos de los botones del navegador.
Para el caso de aplicaciones construidas con componentes DBEdit, recordar que comparte muchas propiedades y métodos con el componente edit, así que es valido por ejemplo en una aplicación donde la tabla tiene el campo edad en DBEdit3) poner un componente edit1 para desplegarlos en meses y realizar la siguiente operación en el onclick de un botón apropiado como lo muestra el siguiente programa ejemplo
procedure TForm1.Button1Click(Sender: TObject);
var
meses:integer;
begin
meses := StrToInt(DBEdit3.Text) * 12;
Edit1.Text := IntToStr(meses);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
temp:integer;
opcion:TLocateOptions;
begin
Table1.Locate('NOMBRE',Edit1.Text,[]);
end;
Si el renglón o registro ya esta cargado con su imagen respectiva, al hacer la navegación entre renglones este componente DBImage las va desplegando.
{ DBImage1.PasteFromClipboard(); }
{ DBImage1.Picture.LoadFromFile(’C:\datos\mifoto.jpg’); }
OnClickButton1() {
QuickRep1.Preview();
o QuickRep1.Print();
--------------------------
QuickRep1.Preview();
QRBand2 = Banda de titulo,
QRBand3 = Banda de detalle, etc.
A este componente QRBand, cambiarle propiedades de font, frame, color, etc.
procedure TForm1.botonaltasClick(Sender: TObject);
begin
panelbajas.Visible:= False;
botonautores.enabled:=false;
botsalir.enabled:=false;
panelmodif.Visible:= False;
panelbuscar.Visible:= False;
panelaltas.Visible:= True;
pgrilla.Visible:= false;
mconsultas.enabled:=false;
editaltacodigo.setfocus;
marchivo.Enabled:=false;
end;
procedure TForm1.botonbajasClick(Sender: TObject);
begin
botonautores.enabled:=false;
botsalir.enabled:=false;
panelaltas.Visible:= false;
panelbajas.Visible:= True;
editejemplareli.setfocus;
panelmodif.Visible:= False;
panelbuscar.Visible:= False;
puedeborrar:= False;
pgrilla.Visible:= false;
mconsultas.enabled:=false;
marchivo.Enabled:=false;
end;
procedure TForm1.botonmodificacionesClick(Sender: TObject);
begin
panelaltas.Visible:= false;
panelbajas.Visible:= false;
panelmodif.Visible:= true;
panelbuscar.Visible:= False;
puedeborrar:= False;
pgrilla.Visible:= false;
mconsultas.enabled:=false;
botonautores.enabled:=false;
botsalir.enabled:=false;
editmodificarcodigo.clear;
editmodificarnombredepelic.clear;
editmodificargenero.clear;
editmodificaredicion.Clear;
editmodificarcodigo.Enabled:=true;
editmodificarcodigo.SetFocus;
marchivo.Enabled:=false;
end;
procedure TForm1.busquedacomboClick(Sender: TObject);
begin
panelbuscar.visible:= True;
botonautores.enabled:=false;
botsalir.enabled:=false;
mconsultas.enabled:=false;
editbuscarcodigo.setfocus;
marchivo.Enabled:=false;
end;
procedure TForm1.busquedagrillaClick(Sender: TObject);
var
registro: peliculas;
contadorfila: integer;
begin
botonautores.enabled:=false;
botsalir.enabled:=false;
pgrilla.Visible:= True;
panelmodif.Visible:=false;
panelbajas.Visible:=false;
panelaltas.Visible:=false;
grilla.Cells[0,0]:= 'Codigo';
grilla.Cells[1,0]:= 'Nombre de pelicula';
grilla.Cells[2,0]:= 'Genero';
grilla.Cells[3,0]:= 'Edicion';
Seek(asArchivo,0);
contadorfila:= 1;
mconsultas.enabled:=false;
marchivo.Enabled:=false;
while not(eof(asArchivo)) do
begin
read(asArchivo,registro);
if registro.borrado= False then
begin
grilla.Cells[0,contadorfila]:= floattostr(registro.ejemplar);
grilla.Cells[1,contadorfila]:= registro.Nombre;
grilla.Cells[2,contadorfila]:= registro.Autor;
grilla.Cells[3,contadorfila]:= floattostr(registro.Edicion);
contadorfila:= contadorfila + 1;
Grilla.RowCount:= contadorfila;
end;
end;
end;
La ignorancia niega o agrede o critica
La ciencia duda..!!
Wilucha
Lenguaje
Gramática
Autómata
Laplace
Series
Ecuación
Operador
Cultivo una rosa blanca
..en julio, como en enero
para el amigo sincero
que me da su mano franca..!!
el corazón con que vivo,
cardo ni ortiga cultivo;
..cultivo una rosa blanca..!
José Martí