Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Ayuda con crear un mismo Form varias veces + Thread

Saludos, necesito una ayudita con un problemita que no e podido resolver.

Tengo Un Form mdi principal y un Form hijo en el cual creo un thread para realizar una serie de procesos incluyendo manejo de bases de datos. de esta forma me funciona bien.

el problema que tengo esque quiero crear el Form hijo varias veces pero el problema esque desde e theread hago referencias apuntando al Form1, por ejemplo Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;

lo cual no me funciona para el segundo Form

espero me ayuden!!! saludos

Aca el Form mdi Principal
Código Delphi [-]
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TFrmMain = class(TForm)
    Panel1: TPanel;
    BtnFrm1: TButton;
    BtnFrm2: TButton;
    procedure BtnFrm2Click(Sender: TObject);
    procedure BtnFrm1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;

implementation

uses Unit1;

{$R *.dfm}

procedure TFrmMain.BtnFrm1Click(Sender: TObject);
begin

Form1:= TForm1.Create(Application);
Form1.Label1.Caption:='Soy el Uno';
Form1.Caption:= 'Soy el Uno';
Form1.show;

end;

procedure TFrmMain.BtnFrm2Click(Sender: TObject);
var
F2: TForm1;
begin
F2:= TForm1.Create(Application);
F2.Label1.Caption:='Soy el Dos';
F2.Caption:= 'Soy el Dos';
F2.show;

end;

end.

Aca el Form1 que quiero crear varias veces
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    BitBtn2: TBitBtn;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;



implementation
Uses Hilos;
var
Hilo:THilo;

{$R *.dfm}

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Hilo:=THilo.Create(True);
Hilo.FreeOnTerminate:=true;
Hilo.Resume;
end;

end.

y aca la unidad del Hilo
Código Delphi [-]
unit Hilos;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons;

type
  THilo = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;


implementation

uses Unit1;

procedure THilo.Execute;
begin
 Form1.ProgressBar1.Position:=0;
 Form1.BitBtn2.Enabled:=false;
repeat

Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
 Sleep(500);
until Form1.ProgressBar1.Position=Form1.ProgressBar1.Max;

 Form1.BitBtn2.Enabled:=true;
end;




end.

Claro esta no es mi aplicacion real, es solo un esquema para lograr mi objetivo



Saludos y espero sugerencias.

Última edición por n03l fecha: 23-12-2013 a las 20:46:13.
Responder Con Cita
  #2  
Antiguo 23-12-2013
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Bueno nunca he usado threads pero podrias probar creando un campo en el thread que haga referencia al formulario y al crear el thread la pasas Self que vendria a ser la referencia al formulario actual. Asi en el codigo del thread solo usarias el campo para hacer tus operaciones.

Espero se me haya entendido

Saludos
Responder Con Cita
  #3  
Antiguo 26-12-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Los accesos desde el thread hacia el formulario (componentes como el progressbar) debes hacerlos utilizando Synchronize, ya que la VCL no es thread-safe.

revisa el método synchronize en la ayuda o algunos de los ejemplos de thread que hay en el FTP del club.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 26-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Ok Gracias, Lo tendre en cuenta!!!.

Aun no e podido lograr lo que quiero. Sin embargo utilizando el Componente JVThread de los JEDI si me funciona perfecto ya que queda todo encapsulado en la misma forma.

saludos
Responder Con Cita
  #5  
Antiguo 27-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Varias cosas:

1.- En las opciones configura TForm1 como no autocreado.
2.- En tu thread implementa un constructor en el que tengas que pasar una referencia a TForm1 y la guardas en una variable privada. El resto de las llamadas en las que intervenga TForm1, las haces con esa variable que apuntará al Form que te interesa en cada momento.
3.- Como dice Neftali, usa Synchronize, para las funciones que hagan uso de TForm1.

Saludos.
Responder Con Cita
  #6  
Antiguo 27-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Ok Voy a investigar como es eso de los constructores ya que nunca lo e usado saludos...

Muchas Gracias de Verdad......
Responder Con Cita
  #7  
Antiguo 27-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Ok, despues de tirar puñaladas al aire y haciendo uso del copy paste e hecho lo siguiente:

En el form
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    BitBtn2: TBitBtn;
    ProgressBar1: TProgressBar;
    Label1: TLabel;
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;



implementation
Uses Hilos;
var
Hilo:THilo;

{$R *.dfm}

procedure TForm1.BitBtn2Click(Sender: TObject);
begin

 //Aqui no se como capturar el nombre del form sin utilizar Form1. ya
 // que el nombre es dinamico
Hilo:=THilo.Create(Form1);
Hilo.FreeOnTerminate:=true;
Hilo.Resume;
end;

end.


y en el hilo me da el siguiente error al tratar de compilarlo
[DCC Error] Hilos.pas(39): E2003 Undeclared identifier: 'ProgressBar1'

el Hilo
Código Delphi [-]
unit Hilos;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons;

type
  THilo = class(TThread)
  private
  FName: TForm;

    { Private declarations }
  protected
    procedure Execute; override;
     public
    constructor Create(Name: TForm);

  end;


implementation

uses Unit1;


constructor THilo.Create(Name: TForm);
begin
  inherited Create(True);
  FName := Name;
  FreeOnTerminate := True;
end;


procedure THilo.Execute;
begin


FName.ProgressBar1.Position:=0;
FName.BitBtn2.Enabled:=false;
repeat

FName.ProgressBar1.Position:=FName.ProgressBar1.Position+1;
 Sleep(500);
until FName.ProgressBar1.Position=FName.ProgressBar1.Max;

FName.BitBtn2.Enabled:=true;
end;


end.
Responder Con Cita
  #8  
Antiguo 27-12-2013
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
FName es de tipo Tform y debe ser de tipo TForm1

Saludos
Responder Con Cita
  #9  
Antiguo 27-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Hola Caminante, ya lo intente y me marca error
[DCC Error] Hilos.pas(11): E2003 Undeclared identifier: 'TForm1'

saludos
Responder Con Cita
  #10  
Antiguo 27-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Tenias razon ya lo solucione poniendo TForm1. el problema era que yo tenenia la referencia a Form1

aqui:
Código Delphi [-]
implementation

//uses Unit1;

lo puse aqui y me funciono
Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons,Unit1;

saludos y gracias a todos los que me colaboraron
Responder Con Cita
  #11  
Antiguo 28-12-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Sigues accediendo al formulario y al progressbar sin usar Synchronize.
Creo que antes o después acabará dándote problemas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #12  
Antiguo 28-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por Neftali Ver Mensaje
Sigues accediendo al formulario y al progressbar sin usar Synchronize.
Creo que antes o después acabará dándote problemas.
n03l escucha la voz de los maestros.


Saludos.
Responder Con Cita
  #13  
Antiguo 29-12-2013
n03l n03l is offline
Miembro
 
Registrado: feb 2007
Posts: 73
Poder: 18
n03l Va por buen camino
Si amigo lo tendre en cuenta en mi aplicacion real
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como evito abrir 2 veces el mismo form? daragor Lazarus, FreePascal, Kylix, etc. 13 14-08-2016 09:37:07
mismo reporte varias veces qreport yossi Impresión 0 20-07-2011 12:13:16
Error Al Crear Varias Veces El Mismo Form ManuelPerez Varios 7 18-09-2007 21:31:02
Quiero liberar my query para usar el mismo varias veces zcatzz Conexión con bases de datos 7 27-01-2007 23:39:45
Abrir varias veces el mismo form Phacko Varios 7 25-09-2004 05:22:01


La franja horaria es GMT +2. Ahora son las 23:21:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi