PDA

Ver la Versión Completa : Ayuda por favor... Urge..!!


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.

el_barto
22-07-2005, 21:31:15
Hago un parentesis a tu pregunta

es algo canson leer tu codigo dado que no usas las etiquetas para estos casos y ademas tu titulo es poco descriptivo, hechate una miradita a la guia de estilo ;)

ContraVeneno
22-07-2005, 23:15:27
pues si es algo cansado leer todo el código y tratar de adivinar que es lo que sería mejor... en fin, supongo que una leída a la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) (como menciona el_barto) sería muy conveniente.

Lo único que te puedo recomendar es que al utilizar el try, no captures todos los errores en el except ya que de esa manera como l o haces no sabes realmente cuál fue el problema. Y además, utiliza la clásula raise, al menos hasta que sepas como controlar ese error. Te recomiendo que leas este hilo. (http://www.clubdelphi.com/foros/showthread.php?t=23338) En particular :

Publicado por Roman
Por otra parte es también un error presuponer, como ya lo indicó mamcx que el código va a fallar por una sola posible causa. Para algo está la construcción:


Código Delphi:
try
...
except on EErrorQueSeComoManejar do begin
.....
end;
end;
En pocas palabras, primero hay que definir exactamente por que no se conecta, luego tal vez alguien te pueda ayudar a resolver ese problema en específico.