Curso Delphi. Lección 07B  

Send By: Ariel Bustamante
Web : N.A.
Email: N.A.
Date: 30/12/02

Tip accessed 834 times

 


Segunda parte de la leccion 7

Ya puedes ejecutar el proyecto y ver como el DBGrid te muestra las diferentes
tablas ordenadas por el índice asignado por nosotros y el BEdicion nos
devuelve la tabla original para introducirle o borrarle registros, un agregado
que podríamos hacerle es que todas las tablas menos TablaCoches sean
de solo lectura, así solo se podrá modificar la TablaCoches una
vez clicado BEdicion, para ello al Evento OnClick de todos los botones (menos
BEdicion) deberíamos agregarle esta sintaxis.



 DBGrid1.ReadOnly := True;


U otra forma sería pasar la Propiedad/ReadOnly de todas las Table a
True y al BEdicion escribirle este código:



 DM.TablaCoches.ReadOnly := False;


Ahora colocaremos otro GroupBox y en su Caption pondremos: Buscar por…..,
dentro de el colocaremos cuatro Buttons.































Name



Caption



Button1



BXTipo



Tipo



Button2



BXMarca



Marca



Button3



BXCombustible



Combustible



Button4



BXUbicacion



Ubicación



En el mismo GroupBox y debajo de los cuatro botones colocaremos tres Labels
alineadas horizontalmente


 






















Caption



Label1



Intruduzca



Label2



xxxxxxxx



Label3



a buscar






Y debajo de estas un Edit al cual le borraremos el Text, como presumirás
el Caption de Label2 no es más que una reserva de espacio para ayudarte
en el alineado de las tres una vez acabado ya puedes borrar el Caption y dejarlo
vacío. Alinea los GroupBox lo más abajo posible y estira el DBGrid
para que ocupe todo el espacio restante de la Form hasta un Height de 560. Por
último colocaremos un RichEdit que tendrá un Height de 170 y ocupará
la parte inferior del DBGrid.

Quítale el texto a RichEdit y pásale la Propiedad/Visible a False.

Vamos a escribir todas las sintaxis para BXTipo, el texto que continúa
es completo con la línea del procedure incluída:



 procedure TForm1.BXTipoClick(Sender: TObject);
 begin
 Label2.Caption := 'Tipo';
 DBGrid1.DataSource := DM.DSTipo;
 Edit1.SetFocus;
 RichEdit1.Visible := True;
 with DM.TablaXTipo do
 begin
 RichEdit1.Lines.Clear;
 First;
 if FindKey ([Edit1.Text]) then
 Repeat
 RichEdit1.Lines.Add (FieldByName('Tipo').AsString + ('      ')+
 (FieldByName('Marca').AsString + ('       ') +
 (FieldByName('Modelo').AsString + ('       ')+
 (FieldByName('Año').AsString + ('       ')+
 (FieldByName('Combustible').AsString)+
 ('         ') + (FieldByName('Ubicación').AsString)+ ('      ')+
 (FieldByName('Color').AsString)))));
 Next
 Until (FieldByName('Tipo').AsString <> Edit1.Text)
 or EOF
 end;
 end;


Una rudimentaria "traducción" de lo escrito. Al clicar el
botón; que el Caption de Label2 sea "Tipo", que el DataSource
del DBgrid sea DSTipo, que el Edit1 tome el foco para escribir sobre él,
que el RichEdit se haga visible y a continuación un bloque de código
encerrado entre with y do.

Con (with) la TablaXTipo hacer (do), comenzamos (begin) limpiando el texto de
RichEdit 1 (si lo tuviera como consecuencia de una búsqueda anterior)
y primero (first) si (if) encuentra la clave escrita (FindKey) en el texto de
Edit1 entonces (then) agregue las siguientes líneas a RichEdit (RichEdit.Lines.Add)
para el campo nombre Tipo (FieldByName) como cadena de texto (AsString) más
(+) dos comillas vacías separadas entre sí por cuatro espacios;
estas son simplemente para separar el texto de este campo con el del campo siguiente
(puedes separarlas más o menos a tu gusto una vez que observes el resultado
en tiempo de ejecución.

A continuación viene otro más (+) para que nos ponga en el RichEdit
el registro del campo Marca, otro espacio y así sucesivamente vamos escribiendo
todos los registros correspondientes a los diferentes campos. Luego vienen cinco
parentisis uno por cada registro agregado sin contar el primero y a continuación
Next y Until (hasta) que el campo Tipo siga coincidiendo con el texto de Edit1
o (or) la búsqueda haya llegado al final. Ejecuta el proyecto, clica
el botón Tipo escribe uno de los tipos que hayas introducido en la tabla
clica otra vez Tipo y verás el listado de vehículos coincidente
con ese tipo que aparecerán en el RichEdit. Cuando vuelvas a fase de
diseño a BEdición escríbele una línea de código
en su evento OnClick para hacer desaparecer al RichEdit. También podríamos
poner un botón o un menú para imprimir el resultado de la búsqueda
, yo no lo haré así que no lo busquen en el bloque de código,
pero si lo queréis hacer, con ir a la Lección 5 ya lo tenéis
solucionado. Ahora vamos a escribir el código para el evento OnClick
de BXMarca, que no es otra cosa que el escrito anteriornente con unas pequeñas
variantes:



 procedure TForm1.BXMarcaClick(Sender: TObject);
 begin
 Label2.Caption := 'Marca';  //aquí cambió antes era Tipo
 DBGrid1.DataSource := DM.DSMarca;  //aquí cambió antes era Tipo
 Edit1.SetFocus;
 RichEdit1.Visible := True;
 with DM.TablaXMarca do  //aquí cambió antes era Tipo
 begin
 RichEdit1.Lines.Clear;
 First;
 if FindKey ([Edit1.Text]) then
 Repeat
 RichEdit1.Lines.Add (FieldByName('Marca').AsString + ('      ')+  //aquí cambió antes era Tipo
 (FieldByName('Tipo').AsString + ('       ') +  //aquí cambió antes era Marca
 (FieldByName('Modelo').AsString + ('       ')+
 (FieldByName('Año').AsString + ('       ')+
 (FieldByName('Combustible').AsString)+
 ('         ') + (FieldByName('Ubicación').AsString)+ ('      ')+
 (FieldByName('Color').AsString)))));
 Next
 Until (FieldByName('Marca').AsString <> Edit1.Text)  //aquí cambió antes era Tipo
 or EOF
 end;
 end;


Para evitarnos clicar dos veces el mismo botón podríamos agregar
esta línea debajo del begin de cada procedure:



 BXMarca.Default := True;


Y así con cada botón para que después de introducir en
el Edit el valor a buscar con solo presionar Intro nos devuelva la lista de
los registros coincidentes. Después de señalarte donde se producen
los cambios, para el BXCombustible y el BXUbicacion dejo por tu cuenta escribir
el código correspondiente (este no aparecerá en el bloque final).
Como habrás observado cuando trabajamos con tantos componentes (tablas,
DataSource, botones y además índices) el simplificar el nombre
de cada uno nos facilita mucho la tarea, por eso elegí nombres como BXUbicación,
TablaXUbicacion, DSUbicacion y el índice Ubicación.

Si aún no has agregado el botón BAgregar hazlo ahora, colócalo
donde mejor te parezca, Name BAgregar, Caption Agregar y el evento OnClick será:



   FEditor.Show;
   DM.TablaCoches.Append;


Ahora crearemos a FEditar, MenúFile/New Form, a esta forma le damos
el Name de FEditor y de Caption le ponemos " Agregar nuevo registro",
Menu/File/Save all y guardamos la Unit como UnitEditor, el Width para FEditor
será de 900 y el Height será de 100. En FEditor colocaremos un
Button ubicado a la derecha de la misma, Name BCerrar2 y Caption Salir en su
Evento/OnClick pondremos:



 FEditor.Close


Ahora compilaremos todo, aparecerá el aviso de agregar UnitEditor a
la cláusula uses y guardamos todo. Vamos a la Pestaña/DataControls
y de allí tomaremos un DBEdit que colocaremos en FEditor , colócalo
bien a la izquierda de FEditor centrado verticalmente, sobre este colocaremos
una Label con el Caption "Marca", a la dercha del DBEdit colocaremos
de la Pestaña/DataControls un DBComboBox sobre este una Label con el
Caption "Tipo", continuamos con otro DBComboBox que le daremos un
Width de 65 y sobre este una Label con el Caption "Año" y seguimos
con otro DBEdit y la Label de encima ha de llevar el Caption "Color",
siguen otros dos DBComboBox, achícales un poco el Width hasta que quepan
y la Label sobre el primero ha de tener el Caption "Combustible" y
sobre el segundo "Ubicación". A continuación el listado
para las propiedades DataSource y DataSet de cada uno.









































DataSource



DataField



DBEdit1



DM.DSCoches



Marca



DBComboBox1



DM.DSCoches



Tipo



DBComboBox2



DM.DSCoches



Año



DBEdit2



DM.DSCoches



Color



DBComboBox3



DM.DSCoches



Combustible



DBComboBox4



DM.DSCoches



Ubicación



Ahora vamos DBComBox1 y en su Propiedad/Items abrimos el editor de código
y le escribimos las siguientes líneas:


Turismo

Furgoneta

Coupé

Cabrio

Familiar

TodoTerreno


En el DBComboBox2 agregaremos tantas líneas como nos ocupe el escribir
años desde 1980 hasta 2002. En el DBComboBox3 pondremos dos líneas:


Gasolina

Gas-oil


Y en el DBComboBox4 pondremos:


Agencia 1

Agencia 2

Agencia 3


Ahora ubica a FEditor más o menos en el centro de la pantalla, guarda
todo y ejecuta. Clica el botón Agregar y aparecerá FEditor , en
el primer Edit escribe una marca y clica Tab, la marca ya aparecerá en
la tabla y el cursor se habrá trasladado a DBComboBox1, allí abre
la lista y selecciona un tipo de coche una vez seleccionado clica Tab y así
sucesivamente hasta que acabes de introducir todos los datos, si quisieras introducir
un nuevo coche con solo clicar Agregar se limpiarían los DBEdits y los
DBCombos y recomenzarías, el DBEdit1 debería tomar el foco al
presionar BAgregar; ya sabes que código agregarle a este botón,
nada más recuerda que el DBEdit está en FEditor.


Con esta lección y la anterior ya tienes muchísimas cosas practicadas
con respecto al manejo de una tabla e incluso estás en disposición
de crear tu propio proyecto con tablas, pero este es solo un mínimo paso
con respecto a lo que puede hacer una aplicación Delphi con tablas. Este
tema no se acaba aquí ni mucho menos, en la próxima veremos algunos
trucos de Trucomanía para base de datos, entraremos en la parte teórica
de las mismas para cimentar estas prácticas y trabajaremos con dos tablas
enlazadas. La Lección 8 queda para el 2003 porque con vuestra anuencia
me tomaré unas vacaciones.

Feliz Navidad a todos.


Ariel Bustamante para Trucomanía.


A continuación el código fuente de la lección.



 unit Main;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ExtCtrls, DBCtrls, StdCtrls, Grids, DBGrids, ComCtrls;

 type
   TForm1 = class(TForm)
     DBGrid1: TDBGrid;
     BCerrar: TButton;
     DBNavigator1: TDBNavigator;
     GroupBox1: TGroupBox;
     BTipo: TButton;
     BMarca: TButton;
     BCombustible: TButton;
     BUbicacion: TButton;
     BEdicion: TButton;
     GroupBox2: TGroupBox;
     BXTipo: TButton;
     BXMarca: TButton;
     BXCombustible: TButton;
     BXUbicacion: TButton;
     Edit1: TEdit;
     Label1: TLabel;
     Label2: TLabel;
     Label3: TLabel;
     RichEdit1: TRichEdit;
     BAgregar: TButton;
     procedure BCerrarClick(Sender: TObject);
     procedure FormActivate(Sender: TObject);
     procedure BTipoClick(Sender: TObject);
     procedure BMarcaClick(Sender: TObject);
     procedure BCombustibleClick(Sender: TObject);
     procedure BUbicacionClick(Sender: TObject);
     procedure BEdicionClick(Sender: TObject);
     procedure BXTipoClick(Sender: TObject);
     procedure BXMarcaClick(Sender: TObject);
     procedure BAgregarClick(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   Form1: TForm1;

 implementation

 uses Unit2, UnitEditor;

 {$R *.DFM}

 procedure TForm1.BCerrarClick(Sender: TObject);
 begin
 Close;
 end;

 procedure TForm1.FormActivate(Sender: TObject);
 begin
 DBGrid1.DataSource := DM.DSCoches;
 DBNavigator1.DataSource := DM.DSCoches;
 DBGrid1.SetFocus;
 end;

 procedure TForm1.BTipoClick(Sender: TObject);
 begin
 DBGrid1.DataSource := DM.DSTipo;
 DBNavigator1.DataSource := DM.DSTipo;
 DBGrid1.SetFocus;
 DBGrid1.ReadOnly := True;
 end;

 procedure TForm1.BMarcaClick(Sender: TObject);
 begin
 DBGrid1.DataSource := DM.DSMarca;
 DBNavigator1.DataSource := DM.DSMarca;
 DBGrid1.SetFocus;
 DBGrid1.ReadOnly := True;
 end;

 procedure TForm1.BCombustibleClick(Sender: TObject);
 begin
 DBGrid1.DataSource := DM.DSCombustible;
 DBNavigator1.DataSource := DM.DSCombustible;
 DBGrid1.SetFocus;
 DBGrid1.ReadOnly := True;
 end;

 procedure TForm1.BUbicacionClick(Sender: TObject);
 begin
 DBGrid1.DataSource := DM.DSUbicacion;
 DBNavigator1.DataSource := DM.DSUbicacion;
 DBGrid1.SetFocus;
 DBGrid1.ReadOnly := True;
 end;

 procedure TForm1.BEdicionClick(Sender: TObject);
 begin
 DBGrid1.DataSource := DM.DSCoches;
 DBNavigator1.DataSource := DM.DSCoches;
 DBGrid1.SetFocus;
 RichEdit1.Visible := False;
 end;

 procedure TForm1.BXTipoClick(Sender: TObject);
 begin
 Label2.Caption := 'Tipo';
 DBGrid1.DataSource := DM.DSTipo;
 Edit1.SetFocus;
 RichEdit1.Visible := True;
 BXTipo.Default := True;
 with DM.TablaXTipo do
 begin
 RichEdit1.Lines.Clear;
 First;
 if FindKey ([Edit1.Text]) then
 Repeat
 RichEdit1.Lines.Add (FieldByName('Tipo').AsString + ('      ')+
 (FieldByName('Marca').AsString + ('       ') +
 (FieldByName('Modelo').AsString + ('       ')+
 (FieldByName('Año').AsString + ('       ')+
 (FieldByName('Combustible').AsString)+
 ('         ') + (FieldByName('Ubicación').AsString)+ ('      ')+
 (FieldByName('Color').AsString)))));
 Next
 Until (FieldByName('Tipo').AsString <> Edit1.Text)
 or EOF
 end;
 end;
 procedure TForm1.BXMarcaClick(Sender: TObject);

 begin
 Label2.Caption := 'Marca';
 DBGrid1.DataSource := DM.DSMarca;
 Edit1.SetFocus;
 RichEdit1.Visible := True;
 BXMarca.Default := True;
 with DM.TablaXMarca do
 begin
 RichEdit1.Lines.Clear;
 First;
 if FindKey ([Edit1.Text]) then
 Repeat
 RichEdit1.Lines.Add (FieldByName('Marca').AsString + ('      ')+
 (FieldByName('Tipo').AsString + ('       ') +
 (FieldByName('Modelo').AsString + ('       ')+
 (FieldByName('Año').AsString + ('       ')+
 (FieldByName('Combustible').AsString)+
 ('         ') + (FieldByName('Ubicación').AsString)+ ('      ')+
 (FieldByName('Color').AsString)))));
 Next
 Until (FieldByName('Marca').AsString <> Edit1.Text)
 or EOF
 end;

 end;

 procedure TForm1.BAgregarClick(Sender: TObject);
 begin
 DM.TablaCoches.Append;
 FEditor.Show;
 FEditor.DBEdit1.SetFocus;
 end;

 end.


 -------------------------------------------------------------------------------------

 unit UnitEditor;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, DBCtrls, Mask;

 type
   TFEditor = class(TForm)
     BCerrar2: TButton;
     DBEdit1: TDBEdit;
     Label1: TLabel;
     DBComboBox1: TDBComboBox;
     Label2: TLabel;
     DBComboBox2: TDBComboBox;
     Label3: TLabel;
     DBEdit2: TDBEdit;
     Label4: TLabel;
     DBComboBox3: TDBComboBox;
     DBComboBox4: TDBComboBox;
     Label5: TLabel;
     Label6: TLabel;
     procedure BCerrar2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   FEditor: TFEditor;

 implementation

 {$R *.DFM}

 procedure TFEditor.BCerrar2Click(Sender: TObject);
 begin
 FEditor.Close;
 end;

 end.


 unit Unit2;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   Db, DBTables;

 type
   TDM = class(TForm)
     TablaCoches: TTable;
     TablaXTipo: TTable;
     TablaXMarca: TTable;
     TablaXCombustible: TTable;
     TablaXUbicacion: TTable;
     DSCoches: TDataSource;
     DSTipo: TDataSource;
     DSMarca: TDataSource;
     DSCombustible: TDataSource;
     DSUbicacion: TDataSource;
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   DM: TDM;

 implementation

 {$R *.DFM}

 end.