Ver Mensaje Individual
  #17  
Antiguo 22-08-2011
Jack Jack is offline
Miembro
 
Registrado: may 2003
Posts: 57
Reputación: 22
Jack Va por buen camino
Post Gracias por responder

Cris cambie todo el código al metodo execute del hilo.
Gracias por la puntualización del método create del thread, seguro que me servirá para futuras ocasiones.
Ahora se me ha quedado como te indico abajo, pero además he cambiado los componentes de la conexión a los zeos creo que es la versión 6 y además he cambiado de firebird a mssql y tampoco me funciona. No se que pasa, estaría conformado si no se pudiera hacer en ningún caso pero es que he leído que hay algunos programadores que consiguen realizar justamente lo que yo necesito. Me encuentro un poco frustrado llevo muchos días con este problema y no le veo la punta por ningún lado.
Ahí te pongo el nuevo código a ver si me dais alguna pista.
He puesto un timer y dos conexiones con nombre diferente para asegurarme que los componentes son diferentes y se ejecutan los dos a la vez.
El método vermensaje me indica justa en que linea se para el código , en este caso devuelve un error de dirección de memoria.
Muchas gracias de antemano.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Button2011, IBDataBase, IBCustomDataSet, ExtCtrls,
  ZConnection, Db, ZAbstractRODataset, ZAbstractDataset, ZDataset;


type
  THilo = class(TThread)
    private
           DataBase: TZConnection;
           Tabla: TZQuery;
           DataBase1: TZConnection;
           Tabla1: TZQuery;
           procedure ActualizaMemo;
           procedure PonTag;
           procedure VerMensaje;
    public
          CadenaMostrar: string;
    constructor Create( Suspendido: Boolean );
    procedure Execute; override;
  end;



type
  THPrueba = class(TForm)
    Button20111: TButton2011;
    Memo1: TMemo;
    Timer1: TTimer;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    procedure Button20111Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  HPrueba: THPrueba;

implementation

{$R *.DFM}

procedure THilo.Execute;
begin
     // Aqui no tengo mu claro lo que tengo que poner
     while Self.Terminated = False do begin
           if HPrueba.Tag = 0 then begin
              Synchronize( PonTag );
           DataBase := TZConnection.Create( nil );
           DataBase.Protocol := 'mssql';
           DataBase.DataBase := 'BASE2011QO';
           DataBase.HostName := 'NUEVOJACK\SQLEXPRESS';
           DataBase.LoginPrompt := False;
           DataBase.Password := '';
           DataBase.User := '';
           DataBase.Connected := True;
           //
           Tabla := TZQuery.Create( nil );
           Tabla.Connection := DataBase;
           Tabla.SQL.Clear;
           Tabla.SQL.Add( 'select * from Articulo' );
           Tabla.Active := True;
           while not Tabla.Eof do begin
                 CadenaMostrar := Tabla.Fields[ 0 ].AsString + ' ' +
                                          Tabla.Fields[ 1 ].AsString;
                 Synchronize( ActualizaMemo );
                 sleep( 1000 );
                 Tabla.Next;
           end;
           end
           else begin
           Cadenamostrar := 'ooooooo';
           Synchronize( ActualizaMemo );
           DataBase1 := TZConnection.Create( nil );
           DataBase1.Protocol := 'mssql';
           DataBase1.DataBase := 'BASE2011QO';
           DataBase1.HostName := 'NUEVOJACK\SQLEXPRESS';
           DataBase1.LoginPrompt := False;
           DataBase1.Password := '';
           DataBase1.User := '';
           DataBase1.Connected := True;    // Aqui se cuelga

           Synchronize( Vermensaje );
           //
           Tabla1 := TZQuery.Create( nil );
           Tabla1.Connection := DataBase;
           Tabla1.SQL.Clear;
           Tabla1.SQL.Add( 'select * from Articulo' );
           Tabla1.Active := True;
           while not Tabla1.Eof do begin
                 CadenaMostrar := Tabla1.Fields[ 0 ].AsString + ' ' +
                                  Tabla1.Fields[ 1 ].AsString;
                 Synchronize( ActualizaMemo );
                 sleep( 1000 );
                 Tabla1.Next;
           end;
           end;
     end;
end;


constructor THilo.Create( Suspendido: Boolean );
begin
     inherited Create( True );
     // Quizas tuviera que crear un objeto TList con un database, transaction y tabla
     // para cada ejecución del hilo
end;

procedure THilo.ActualizaMemo;
begin
     HPrueba.Memo1.Lines.Add( CadenaMostrar );
end;

procedure THilo.PonTag;
begin
     HPrueba.Tag := 1;
end;

procedure THilo.VerMensaje;
begin
     showmessage( 'pp' );
end;




procedure THPrueba.Button20111Click(Sender: TObject);
          var Hilo: THilo;
begin
     Hilo := THilo.Create( True );
     Hilo.FreeOnTerminate := False;
     Hilo.Resume;
     Timer1.Enabled := True;
end;

procedure THPrueba.Timer1Timer(Sender: TObject);
begin
     Button20111Click( Self );
     Timer1.Enabled := False;

end;

end.

Última edición por Casimiro Notevi fecha: 22-08-2011 a las 18:50:10. Razón: Poner etiquetas [delphi] [/delphi]
Responder Con Cita