PDA

Ver la Versión Completa : ¿Como hago mi conexion por programacion?


Antuan
06-08-2005, 13:23:52
Estoy aprendiendo con un ejemplo ya hecho y me gustaria que me dijerais como tengo que sustituir unos componente que tiene hechos por diseño y cambiarlos a programacion directa.
Mediante un boton en el form principal se llama a un form3 en en cual hay un un TDBGrid, un DataSource y 2 Tables. Por Diseño
Que codigo tengo que poner en
procedure TForm3.FormShow(Sender: TObject);
para que el DataSource y los 2 Tables esten presentes sin poner los componentes en el formulario.
y tambien que codigo tengo que hacer para poner las propiedades de los tables por codigo.
-----------------------------
En las propiedades del table1 tengo en
Active True
DatabaseName c:\ejemplo
Name Table1
TableName auxiliar.db
-----------------
En las propiedades del table2 tengo en
Active True
DatabaseName c:\ejemplo
Name Table2
TableName ventas.db
--------------------------
El DBGrid
DataSource DataSource1
Name DBGrid1

Y lo que quiero es quitar los componentes visuales del DataSource y los 2 tables y ponerlos por programacion directa.
Pero no se como se hace.
Gracias

Lepe
06-08-2005, 16:00:40
Pues necesitas 3 variables, una de cada tipo



TForm1 = class(Tform)

private
ElDatasource:TDataSource;
Tabla1:TTable;
Tabla2:TTable;
dbGrid2:Tdbgrid;
...
end;

implementation

procedure TForm1.FormShow(Sender: TObject);
begin
Tabla1 := TTable.Create(Form1);
//Creo la tabla, y le asigno como dueño el Form1,
// al liberar el Form1, se libera de la memoria
// tambien la tabla1

//En las propiedades del table1 tengo en
with tabla1 do
begin
DatabaseName := 'c:\ejemplo';
Name := 'Table1';
TableName :='Auxiliar.db';
Active := True;
// logicamente antes de poner en activo la tabla, todas
// las propiedades deben estar establecidas.
end;

//El DBGrid
ElDatasource := Tdatasource.Create(Form1);
ElDatasource.Dataset := Tabla1;

// Hombre, ya puestos, tambien creamos el Grid;
DBGrid2 := TDBGrid.Create(Form1);
DBGrid2.SetBounds(0,40,Form1.Width, Form1.Height-40);
DBGrid2.Parent:= Form1;
DBGrid2.Visible:= True;


DBgrid2.Datasource := ElDatasource;
tabla1.Open;

end;


Yo he usado Form1, así que cambia las referencias a Form3

Un detalle: Si ya has puesto los Datsources y ttables en tu ventana, delphi ha añadido los uses automaticamente, por tanto, este ejemplo se compila sin problemas.

Si partes de un formulario totalmente vacio, cuando pongas :
tabla1 : TTable;
el compilador se quejará porque no sabe que es el TTable, entonces, haz clic sobre la palabra "TTable" pulsa F1 y la ayuda de delphi te dirá que se encuentra en:

Unit

DBTables


Por tanto ya sabes que tienes que poner "uses DBTables;" para poder continuar.

Edito: este mensaje ha sido comprobado en delphi.

Un saludo.

Antuan
06-08-2005, 20:23:26
He creado este ejemplo con lo que tu me has dicho y me funciona.
Asi que me gustaria si algo esta mal me lo corrijas.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBGrids, DB, DBTables;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{ Private declarations }
DataSource1:TDataSource;
Table1:TTable;
DBGrid1:TDBGrid;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
// Creo el DataSource, el Table y el DBGrid y lo asigno al Form1
Datasource1 := Tdatasource.Create(Form1);
Table1 := TTable.Create(Form1);
DBGrid1 := TDBGrid.Create(Form1);
//En las propiedades del table1 tengo en
with table1 do
begin
DatabaseName := 'e:\ejemplo';
Name := 'Table1';
TableName :='Clientes.dbf';
Active := True;
Datasource1.Dataset := Table1;
// logicamente antes de poner en activo la tabla, todas
// las propiedades deben estar establecidas.
end;
//En las propiedades del Grid1 tengo en
with DBGrid1 do
begin
DBGrid1.SetBounds(0,40,Form1.Width, Form1.Height-40);
DBGrid1.Parent:= Form1;
DBGrid1.Visible:= True;
DBgrid1.Datasource := DataSource1;
end;
// Abro el Table1
table1.Open;
end;
end.

Me falta ordenar la tabla. Supongo que lo sacare.
Habras visto que soy novato total
Pero me gusta esta forma de aprender.
Me puedes decir como hago para que el hilo salga bonito como el tuyo?

vtdeleon
06-08-2005, 20:58:54
Saludos
Guía de Estilo de los foros (http://www.clubdelphi.com/foros/guiaestilo.php)
Aprendé la etiqueta CODE (http://www.clubdelphi.com/foros/misc.php?do=bbcode#code) Dale a esos enlaces. El 2do enlace te ense~a como hacerlo;)

Lepe
06-08-2005, 23:44:33
Antuan, Tengo que comentar un fallo en el código que he posteado; Como yo no tengo tu tabla llamada Auxiliar, he usado una tabla que tenia a mano llamada 'Clientes.dbf', y se me olvídó modificarlo al pegar el mensaje.

Donde dice :

TableName := 'Clientes.dbf'

deberás cambiarlo por:
TableName := 'Auxiliar.db'

Con eso ya debería tirar de lujo, siento las molestias.

Por cierto, para el "código salga bonito" usa esto:

[ delphi ]
aqui vuestro codigo fuente
[ /delphi ]

(sin espacios dentro de los corchetes) Así consigues que respete el identado y aparezca las palabras reservadas en negrita y colores.

Un saludo

Antuan
07-08-2005, 13:16:56
Me va todo muy bien y gracias por tu atencion para que aprenda.
Solo me queda en este ejemplo y que no soy capaz de poder hacer que tome la base de datos la misma ruta donde tengo la aplicacion.

with table1 do
begin
DatabaseName := 'ExtractFilePath(ParamStr(0))' //esto no lo se poner
TableName :='Auxiliar.db';
Name := 'Table1';
Active := True;
Datasource1.Dataset := Table1;
// logicamente antes de poner en activo la tabla, todas
// las propiedades deben estar establecidas.
end;

La base de datos esta en la misma carpeta que la aplicacion.
De nuevo muchas gracias por tu atencion.

Lepe
07-08-2005, 14:35:37
Puedes usar:



DatabaseName := ExtractFilePath(Application.ExeName);


Es otra forma, pero es exactamente lo mismo que paramstr(0)

Aunque yo te sugiero que las tablas las coloque en una SubCarpeta, ya que son muchos archivos los que se crean, ficheros de tablas, indices, validaciones, campos memos (si los utilizas), etc;
Crea la carpeta "tablas" dentro del .EXE, y despues añades esto:

DatabaseName := ExtractFilePath(Application.ExeName)+'tablas';


Advertencia: Ten cuidado con las rutas extremadamente largas, yo situaría el programa con esta estructura de carpetas:

c:
|-----Mi Programa
|--------- Archivo .Exe
|--------- Tablas
|--------- auxiliar.DB
|--------- Otratabla.DB



Edito: Acabo de probarlo con la ruta:

C:\Archivos de programa\Borland\Delphi6\Projects\tablas

y funciona, pero recuerdo que en algun momento usando muchos niveles de carpetas, el BDE se quejó.

Un saludo

vtdeleon
07-08-2005, 15:53:32
Saludos Solo me queda en este ejemplo y que no soy capaz de poder hacer que tome la base de datos la misma ruta donde tengo la aplicacion.Es Extra~o, Como sabes que no lo esta tomando? Te da algun Error? y si es asi, que error?

Antuan
08-08-2005, 05:35:00
Con esto funciona perfectamente
DatabaseName := ExtractFilePath(Application.ExeName)+'tablas';
Muchas gracias