 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
rzzanatta Novato

Registrado: Segunda-Feira, 18 de Setembro de 2006 Mensagens: 63
|
Enviada: Qui Mar 08, 2012 9:48 am Assunto: mensagem de espera usando Thread. |
|
|
Ola galera, estou fazendo uma rotina de pesquisa no banco, e queria colocar uma mensagem de espera(seria outro form com gif animado mostrando 'Aguarde, em processamento'), mas ela trava enquanto nao termina a pesquisa, e estava mexendo com Thread, mas quando chamo a mensagem de espera que é um form com um gif animado, ele me retorna erro...
"Project ProjectTest.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'.
o que seria esse erro?
chamar tela executando uma Thread nao da certo?
obrigado.. |
|
| Voltar ao Topo |
|
 |
tanure Profissional

Registrado: Segunda-Feira, 7 de Novembro de 2011 Mensagens: 712
|
Enviada: Qui Mar 08, 2012 9:56 am Assunto: |
|
|
poste o código que faz o desenho, este erro
pode ser porque ele está tentando desenhar antes de criar o form
quando vc roda o executavel também da esse erro? |
|
| Voltar ao Topo |
|
 |
rzzanatta Novato

Registrado: Segunda-Feira, 18 de Setembro de 2006 Mensagens: 63
|
Enviada: Qui Mar 08, 2012 10:05 am Assunto: |
|
|
aqui eu monto a Thread em uma Unit:
unit Unit2;
interface
uses Classes,Graphics;
type
TContador = class(TThread)
protected
procedure Execute; override;
end;
implementation
uses Unit1, MsgEspera;
{ TContador }
procedure TContador.Execute;
begin
Priority := tpLower;
//Messagem de espera
MsgEspera.Msg(True,True,'Aguarde, mostrando mensagem de espera...');
end;
end.
aqui eu monto o form da mensagem:
unit MsgEspera;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Gauges, JvExComCtrls, JvProgressBar,
JvExControls, JvAnimatedImage, JvGIFCtrl, JvTimer;
Procedure Msg(AtivaMsg:Boolean;Animacao:Boolean;Msg:String='');
type
TTeste = class(TWinControl);
TdlgMsgEspera = class(TForm)
PMsg: TPanel;
lblMsg: TLabel;
Barra: TJvGIFAnimator;
private
{ Private declarations }
public
{ Public declarations }
end;
var
dlgMsgEspera: TdlgMsgEspera;
implementation
{$R *.dfm}
Procedure Msg(AtivaMsg:Boolean;Animacao:Boolean;Msg:String='');
Var Control:TWinControl;
Begin
If AtivaMsg Then begin
dlgMsgEspera := TdlgMsgEspera.Create(Application);
dlgMsgEspera.lblMsg.Caption := Msg;
dlgMsgEspera.Width := dlgMsgEspera.lblMsg.Width + 50;
If Animacao Then begin
dlgMsgEspera.Height := dlgMsgEspera.lblMsg.Height +
dlgMsgEspera.Barra.Height + 20;
End else begin
dlgMsgEspera.Height := dlgMsgEspera.lblMsg.Height + 44;
End;
dlgMsgEspera.Barra.Visible := Animacao;
dlgMsgEspera.Barra.Animate := True;
dlgMsgEspera.Show;
dlgMsgEspera.PMsg.Refresh;
dlgMsgEspera.lblMsg.Refresh;
End else begin
If ( dlgMsgEspera <> Nil ) Then begin
Screen.ActiveControl.SetFocus;
dlgMsgEspera.Close;
dlgMsgEspera.Free;
dlgMsgEspera := Nil;
//Verifica o controle ativo
Control := Screen.ActiveControl;
//Se houver algum controle ativo volta o foco nele
If ( Control <> Nil ) Then begin
Screen.ActiveForm.DefocusControl(Control,False);
If ( Control.Enabled ) Then begin
Control.ControlState := [];
Control.SetFocus;
End;
End;
End;
End;
End;
end.
aí no form que eu faço o processamento eu chamo em um Button, a unit do Thread:
procedure TForm1.Button4Click(Sender: TObject);
var
ThreadContador: TContador;
begin
ThreadContador := TContador.Create( True);;
ThreadContador.FreeOnTerminate:= true;
ThreadContador.Resume;
end;
se alguem puder me ajudar.... |
|
| Voltar ao Topo |
|
 |
rzzanatta Novato

Registrado: Segunda-Feira, 18 de Setembro de 2006 Mensagens: 63
|
Enviada: Sex Mar 09, 2012 3:10 pm Assunto: |
|
|
O que e queria realmente era, fazer q meu sistema quando vai atualizar a versao, mostre ao usuario uma tela que contenha um ProgressBar indicando o andamento e nao trave..
tentei usar Thread, mas nao estou entendendo direito seu funcionamento, acho; eu fiz q ele chame o formulario normalmente e nao deu erro, mas quando eu coloco um ProgressBar nesse formulario ele me retorna um erro..
:a component named progressbar1 already exists
como faço pra montar isso? nao consigo ver algo consistente na net q resolva isso pra mim....
alguem aí tem uma soluçao pratica?
obrigado!!!! |
|
| Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Sex Mar 09, 2012 4:19 pm Assunto: |
|
|
A tela não pode ser criada pela thread. Deve ser criada pela sua aplicação; a thread deve somente alterar seus valores (sempre com synchronize).
Um exemplo bem simples:
UProgress.pas:
| Código: | unit UProgress;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls;
type
TFProgress = class(TForm)
ProgressBar1: TProgressBar;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FPosition: Integer;
public
{ Public declarations }
procedure RefreshForm;
property Position: Integer read FPosition write FPosition;
end;
var
FProgress: TFProgress;
implementation
{$R *.dfm}
uses UThread;
{ TFProgress }
procedure TFProgress.FormCreate(Sender: TObject);
begin
with TFormThread.Create(Self) do
begin
FreeOnTerminate := True;
Start;
end;
end;
procedure TFProgress.RefreshForm;
begin
Self.ProgressBar1.Position := Self.FPosition;
Application.ProcessMessages;
end;
end. |
UThread.pas:
| Código: | unit UThread;
interface
uses Forms, Classes, SysUtils, UProgress;
type
TFormThread = class(TThread)
private
FForm: TFProgress;
public
constructor Create(AForm: TFProgress); reintroduce;
procedure Execute; override;
end;
implementation
{ TFormThread }
constructor TFormThread.Create(AForm: TFProgress);
begin
inherited Create(True);
FForm := AForm;
end;
procedure TFormThread.Execute;
var i: Integer;
begin
// a atividade da thread aqui está representada por um sleep. Troque esse
// loop pelo seu evento;
for i := 1 to 100 do
begin
Sleep(500);
FForm.Position := i;
Synchronize(FForm.RefreshForm);
end;
end;
end. |
|
|
| Voltar ao Topo |
|
 |
DarkPirate Novato

Registrado: Quarta-Feira, 7 de Março de 2012 Mensagens: 18
|
Enviada: Sex Mar 09, 2012 5:15 pm Assunto: Re: mensagem de espera usando Thread. |
|
|
| rzzanatta escreveu: | Ola galera, estou fazendo uma rotina de pesquisa no banco, e queria colocar uma mensagem de espera(seria outro form com gif animado mostrando 'Aguarde, em processamento'), mas ela trava enquanto nao termina a pesquisa, e estava mexendo com Thread, mas quando chamo a mensagem de espera que é um form com um gif animado, ele me retorna erro...
"Project ProjectTest.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'.
o que seria esse erro?
chamar tela executando uma Thread nao da certo?
obrigado.. |
Cria a Thread, manda Startar;
No metodo Execute(); você coloca um
repeat
application.processmessage;
until terminated;
lembrando que quando você acabar de abrir o DataSet com os dados você deve terminar a thread para sair do loop. |
|
| Voltar ao Topo |
|
 |
rzzanatta Novato

Registrado: Segunda-Feira, 18 de Setembro de 2006 Mensagens: 63
|
Enviada: Sex Mar 09, 2012 5:18 pm Assunto: |
|
|
Obrigado marcieldeg, fiz um parecido com o que vc postou aqui e deu tudo certo.....
Valeu.................  |
|
| Voltar ao Topo |
|
 |
anderson_rf Novato

Registrado: Sábado, 9 de Junho de 2007 Mensagens: 10
|
Enviada: Sex Set 28, 2012 10:15 am Assunto: Exemplo |
|
|
| Olá, estou precisando disso tb, teria algum exemplo, pois não entendi muito bem |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|