manuel Suarez
22-07-2005, 21:18:07
Antes que nada, muchas gracias por tomarse la molestia de leer este mensaje, espero me puedan ayudar lo mas pronto posible. Gracias…
Estoy haciendo un programa de BD utilizando SQL Server 2000, Delphi 7 y ADOs para la conexión, hasta el momento todo funciona bien, pero quisiera hacer una rutina que me muestre una barra de progreso al momento de establecer la conexión y tener un botón para que al pulsarlo me cancele la conexión.
Cuando inicio el programa, solo indico la dirección IP el servidor y se conecta rápido, pero cuando no se puede conectar por "x" cosa, se tarda mucho y en ese tiempo no puedo hacer nada (se traba el programa) hasta después de cierto tiempo, me responde con un mensaje de error. Ya he intentado muchas cosas y estuve viendo unos ejemplos de hilos por que creo que por ahí va la cosa, pero no le entiendo muy bien. Hice una pequeña prueba con hilos pero no funciona, ocurre lo mismo, si no se conecta, se tarda mucho y se traba.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, DBCtrls, StdCtrls, DB, Grids, DBGrids, ADODB,
XPMan;
type
TMiBarra = class(TThread)
private
public
Constructor Create(a:TADOConnection;b:TADODataSet);
Procedure IncrementaPosicion;
Procedure Execute; Override;
end;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
DBNavigator1: TDBNavigator;
ProgressBar1: TProgressBar;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MiBarra: TMiBarra;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{{ TMiDibujo }
constructor TMiBarra.Create(a:TADOConnection;b:TADODataSet);
begin
Inherited Create(True);
//queremos que sea creado el hilo y suspendido (parámetro true)
end;
procedure TMiBarra.IncrementaPosicion;
begin
begin
with Form1 do
begin
try
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;'+
'Persist Security Info=False;Initial Catalog=scm1;Data Source=192.168.0.2';
ADOConnection1.Open;
ADODataSet1.Open;
except
ShowMessage('error en la conexion');
end;
end;
end;
end;
procedure TMiBarra.Execute;
begin
FreeOnTerminate:= True;
{Accederemos de forma segura a los objetos en Form1 a traves
del método Synchronize( )}
Synchronize(IncrementaPosicion);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=true;
Application.ProcessMessages;
MiBarra:= TMiBarra.Create(ADOConnection1,ADODataSet1); //creación del hilo
MiBarra.Resume; //lanzamiento del mismo
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MiBarra.Terminate; //Finalizamos el hilo de ejecución
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProgressBar1.StepIt;
end;
end.
Estoy haciendo un programa de BD utilizando SQL Server 2000, Delphi 7 y ADOs para la conexión, hasta el momento todo funciona bien, pero quisiera hacer una rutina que me muestre una barra de progreso al momento de establecer la conexión y tener un botón para que al pulsarlo me cancele la conexión.
Cuando inicio el programa, solo indico la dirección IP el servidor y se conecta rápido, pero cuando no se puede conectar por "x" cosa, se tarda mucho y en ese tiempo no puedo hacer nada (se traba el programa) hasta después de cierto tiempo, me responde con un mensaje de error. Ya he intentado muchas cosas y estuve viendo unos ejemplos de hilos por que creo que por ahí va la cosa, pero no le entiendo muy bien. Hice una pequeña prueba con hilos pero no funciona, ocurre lo mismo, si no se conecta, se tarda mucho y se traba.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, DBCtrls, StdCtrls, DB, Grids, DBGrids, ADODB,
XPMan;
type
TMiBarra = class(TThread)
private
public
Constructor Create(a:TADOConnection;b:TADODataSet);
Procedure IncrementaPosicion;
Procedure Execute; Override;
end;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
DBNavigator1: TDBNavigator;
ProgressBar1: TProgressBar;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MiBarra: TMiBarra;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{{ TMiDibujo }
constructor TMiBarra.Create(a:TADOConnection;b:TADODataSet);
begin
Inherited Create(True);
//queremos que sea creado el hilo y suspendido (parámetro true)
end;
procedure TMiBarra.IncrementaPosicion;
begin
begin
with Form1 do
begin
try
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;'+
'Persist Security Info=False;Initial Catalog=scm1;Data Source=192.168.0.2';
ADOConnection1.Open;
ADODataSet1.Open;
except
ShowMessage('error en la conexion');
end;
end;
end;
end;
procedure TMiBarra.Execute;
begin
FreeOnTerminate:= True;
{Accederemos de forma segura a los objetos en Form1 a traves
del método Synchronize( )}
Synchronize(IncrementaPosicion);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=true;
Application.ProcessMessages;
MiBarra:= TMiBarra.Create(ADOConnection1,ADODataSet1); //creación del hilo
MiBarra.Resume; //lanzamiento del mismo
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MiBarra.Terminate; //Finalizamos el hilo de ejecución
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProgressBar1.StepIt;
end;
end.