Fórum Onde está o erro? (thread) #264196
04/01/2005
0
[color=darkblue:0f7324a407]type
T2 = class(TThread)
private
procedure Execute; override;
procedure chamar_imp;
end; { of class declaration }
procedure Tfrmconcluiravista.btconcluirClick(Sender: TObject);
begin
//registra a venda
(...)
//associa os itens da cesta à venda
(...)
//e já aproveita para alterar o estoque
(...)
//dá baixa no caixa
(...)
//solicita a impressao de cupom
t2.Create(false); //impressão de cupom com thread
close;
end;
procedure t2.chamar_imp;
begin
//a linha abaixo que imprime o cupom
manip_reg.impressaodecupom(codvenda,dados.tbconfiguracoeslargura_cupom.Value,qtdeimpressao);
end;
procedure T2.Execute;
begin
Synchronize(chamar_imp);
end;[/color:0f7324a407]
Da maneira que está acima o cupom não está sendo impresso. (obs.: coloquei um showmessage(´qualquercoisa´) em chamar_imp e a mensagem ´qualquercoisa´ foi exibida, ou seja ele está indo até este procedimento.
Agradeço qualquer ajuda.
Alfadesign
Curtir tópico
+ 0Posts
04/01/2005
Dopi
http://delphiforum.icft.com.br/forum/viewtopic.php?t=52380
Usei uma Thread com finalidade semelhante... pode ser que ajude...
Usando a Thread citada no tópico vc poderia imprimir cada Linha com um Timeout predefinido... Exemplo:
Imprimir( ´LINHA A SER IMPRESSA´, #0, 2000); { Timeout = 2000 milisegundos (2seg) } Gostei + 0
04/01/2005
Massuda
De onde surgiu [b:594b966d36]manip_reg[/b:594b966d36]?
Existe uma ´pegadinha´ com o TThread... se ocorrer uma exceção em TThread.Execute é bem possível que você nem fique sabendo, pois TThread.Execute é executada dentro de um bloco try..finally.
Dependendo de onde você colocou o ShowMessage, pode ser que você tenha visto que chamar_imp é iniciada, mas seria interessante checar se chamar_imp está sendo terminada.
Gostei + 0
05/01/2005
Alfadesign
De onde surgiu [b:4a5cb0defe]manip_reg[/b:4a5cb0defe]?
Existe uma ´pegadinha´ com o TThread... se ocorrer uma exceção em TThread.Execute é bem possível que você nem fique sabendo, pois TThread.Execute é executada dentro de um bloco try..finally.
Dependendo de onde você colocou o ShowMessage, pode ser que você tenha visto que chamar_imp é iniciada, mas seria interessante checar se chamar_imp está sendo terminada.[/quote:4a5cb0defe]
Manip_reg é o nome da unit que contem a procedure, esta já esta declarada em uses. Quanto ao local onde coloquei o showmessage foi assim:
procedure t2.chamar_imp;
begin
//a linha abaixo que imprime o cupom
manip_reg.impressaodecupom(codvenda,dados.tbconfiguracoeslargura_cupom.Value,qtdeimpressao);
showmessage(´qualquercoisa´);
end;
Gostei + 0
05/01/2005
Massuda
Gostei + 0
05/01/2005
Alfadesign
procedure impressaodecupom(codvenda, largura, n_copias : integer);
var i, s, nc, venda_antiga : integer; //nc = numero de colunas que a impressora aceita
F : TextFile;
x : string;
begin
if largura = 0 then
nc := 70
else
nc := largura;
if n_copias > 0 then
begin
AssignFile(F,dados.porta_impressora);
Rewrite(F);
venda_antiga := dados.tbvendacd_venda.Value;
if dados.tbvenda.Locate(´cd_venda´,codvenda,[]) then
for i := 1 to n_copias do
begin
x := centraliza(´ ´,´ ´, nc);
insere(x,inttostr(i) + ´ª via´,´R´,nc);
writeln(F,X);
imprime(F,nc,1,´ ´,centraliza(´=´,´=´,nc));
imprime(F,nc,1,´ ´,centraliza(´ ORCAMENTO - VENDA ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ orcamento sem validade fiscal ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ exija a nota fiscal ao efetuar sua compra ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´=´,´=´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoesempresa.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoesendereco.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoescidade.Value + ´ tel.: ´ + dados.tbconfiguracoestelefone.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
imprime(F,nc,1,´ ´,´CD_VENDA: ´ + formatfloat(´00000´,dados.tbvendacd_venda.Value));
if dados.tbvendacd_clientes.Value 0 then
begin
//montagem da linha clientes
x := centraliza(´ ´,´ ´,nc);
insere(x,´Cliente: ´+ ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.Value,´nome´)),´L´,1);
insere(x,´Cod: ´ + formatfloat(´00000´,dados.tbvendacd_clientes.Value),´L´, nc-10);
imprime(F,nc,1,´ ´,trim(x));
end
else
imprime(F,nc,1,´ ´,´Cliente: Venda balcao´);
if dados.tbvendacd_clientes.Value 0 then
begin
x := ´´;
if ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´endereco´)) ´´ then
imprime(F,nc,1,´ ´,ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´endereco´)));
if ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´bairro´)) ´´ then
begin
x := ´´;
x := ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´bairro´)) + ´ - ´ ;
x := x + ConvString(dados.tbclientes.Lookup(´cd_clientes´,dados.tbvendacd_clientes.value,´cidade´));
imprime(F,nc,1,´ ´,x);
end;
end;
//montagem da linha funcionario
x := centraliza(´ ´,´ ´,nc);
insere(x,´Vendedor: ´+ ConvString(dados.tbsenha.Lookup(´cd_func´,dados.tbvendacd_func.value,´login´)),´L´,1);
insere(x,datetostr(dados.tbvendadata.Value),´L´, nc-10);
imprime(F,nc,1,´ ´,trim(x));
//
imprime(F,nc,1,´ ´,centraliza(´_´,´_´,nc));
//montagem do cabecalho de produtos
x := centraliza(´ ´,´ ´,nc);
insere(x,´COD. ´,´L´,1);
insere(x,´PRODUTO ´,´L´,6);
insere(x,´QTDE ´,´L´,nc-20);
insere(x,´UNIT.´,´R´,nc-8 );
insere(x,´TOTAL´,´R´,nc);
imprime(F,nc,1,´ ´,trim(x));
//
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
//montagem dos produtos
dados.tbdesc_venda.First;
while not dados.tbdesc_venda.Eof do
begin
x := centraliza(´ ´,´ ´,nc);
insere(x,formatfloat(´0000´,dados.tbdesc_vendacd_produto.Value),´L´,1);
insere(x,copy(dados.tbdesc_vendanome_prod.Value,1,nc-26),´L´,6);
insere(x,floattostr(dados.tbdesc_vendaqtde.Value),´R´,nc-16);
insere(x,format(´¬2f´,[dados.tbdesc_vendavalor.Value]),´R´,nc-8 );
insere(x,format(´¬2f´,[dados.tbdesc_vendasub.Value]),´R´,nc);
imprime(F,nc,1,´ ´,TrimRight(x));
dados.tbdesc_venda.Next;
end;
//
imprime(F,nc,1,´ ´,centraliza(´_´,´_´,nc));
//
x := centraliza(´ ´,´ ´,nc);
insere(x,´QTDE DE PRODUTOS: ´ + inttostr(dados.tbdesc_venda.RecordCount),´L´,1);
insere(x,´TOTAL.....:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendatotal.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
x := centraliza(´ ´,´ ´,nc);
insere(x,´DESC......:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendadescontos.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
x := centraliza(´ ´,´ ´,nc);
insere(x,´ACRESC....:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendadespesas.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
x := centraliza(´ ´,´ ´,nc);
insere(x,´A PAGAR...:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendatotal.Value - dados.tbvendadescontos.Value + dados.tbvendadespesas.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
x := centraliza(´ ´,´ ´,nc);
insere(x,´PAGO......:´,´L´,nc-23);
insere(x,format(´¬2f´,[dados.tbvendapago.Value]),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
dados.qrtemp.Close;
dados.qrtemp.SQL.Clear;
dados.qrtemp.SQL.Add(´select * from receber where cd_venda = ´ + inttostr(codvenda));
dados.qrtemp.Open;
if dados.qrtemp.RecordCount > 0 then
begin
x := centraliza(´ ´,´ ´,nc);
insere(x,´DEBITO....:´,´L´,nc-23);
insere(x,inttostr(dados.qrtemp.RecordCount) + ´x´ + formatfloat(dados.formato_decimal,dados.tbreceber.Lookup(´cd_venda´,codvenda,´valor´)),´R´,nc);
imprime(F,nc,1,´ ´,copy(x,1,nc));
end;
//carne de pagamento
if (dados.tbconfiguracoescarne_cupom.Value = 1) and (dados.qrtemp.RecordCount > 0) then
begin
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ VENCIMENTOS ´,´-´,nc));
dados.qrtemp.First;
s := 1;
while not dados.qrtemp.Eof do
begin
imprime(F,nc,1,´ ´,centraliza(´VENC ´ + inttostr(s) + ´: ´ + datetostr(dados.qrtemp.FieldByName(´vencimento´).AsDateTime) + ´ PGTO.: ____/____/________ ´,´ ´,nc));
dados.qrtemp.Next;
s := s + 1;
end;
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
end;
dados.qrtemp.Close;
//
if trim(dados.tbvendaobs.Value) ´´ then
begin
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ observacao da venda ´,´-´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbvendaobs.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
end;
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(dados.tbconfiguracoesmensagem.Value,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´-´,´-´,nc));
imprime(F,nc,1,´ ´,centraliza(´ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´___________________________________________ ´,´ ´,nc));
imprime(F,nc,1,´ ´,centraliza(´ASSINATURA DO RECEBIMENTO´,´ ´,nc));
//impressao do espaco em branco final (para
//que o papel seja ejetado em branco
//automaticamente
for s := 1 to dados.tbconfiguracoessaltos.value do
imprime(F,nc,1,´ ´,´ ´);
Writeln(F,#3); //fim do texto (isto faz parar de puxar o papel
end //for
else
showmessage(´Código de venda não encontrado´);
CloseFile(F);
if not dados.tbvenda.Locate(´cd_venda´,venda_antiga,[]) then
showmessage(´Erro: Venda inicial nao encontrada´);
end;
end;
procedure imprime(var arquivo : textfile; tamanho, alinhamento : integer; caracter, texto: string);
var palavra, palavratemp : string;
final, i : integer;
begin
if length(texto) mod tamanho > 0 then
final := length(texto) div tamanho + 1
else
final := length(texto) div tamanho;
//
for i := 1 to final do
begin
palavra := ´´;
palavra := copy(texto,tamanho*(i-1)+1,tamanho);
{tipos de alinhamento:
1 = esquerdo
2 = centralizado
3 = direito
}
case alinhamento of
1 : writeln(arquivo,palavra);
2 : writeln(arquivo,centraliza(palavra,caracter,tamanho));
3 : begin
palavratemp := centraliza(´´,´ ´,tamanho);
insere(palavratemp,palavra,´r´,tamanho);
writeln(arquivo,palavratemp);
end;
end;
end;
end;
function centraliza(palavra, character : string;largura_linha : integer):string;
var
i : integer;
x : string;
begin
x := ´´;
for i := 1 to (largura_linha - length(palavra)) div 2 do
x := character + x;
centraliza := x + palavra + x;
end;
procedure insere(var palavragrd : string;palavrapq: string; alinhamento : char ; pos : integer);
begin
if upcase(alinhamento) = ´L´ then
insert(palavrapq,palavragrd,pos);
if upcase(alinhamento) = ´R´ then
insert(palavrapq,palavragrd,pos- length(palavrapq));
end;
Gostei + 0
05/01/2005
Massuda
Uma pergunta boba :oops: as variáveis [b:1e555f8f9a]codvenda[/b:1e555f8f9a] e [b:1e555f8f9a]qtdeimpressao[/b:1e555f8f9a] possuem valores válidos quando t2.chamar_imp é executada?
Gostei + 0
05/01/2005
Alfadesign
Tá tudo certinho, se eu não usar thread ela imprime normalmente, a impressão so não funciona se eu usar thread (na verdade eu estou tentando aprender a usar thread) por isso acho que o erro esta na forma da implementação do mesmo.
Gostei + 0
05/01/2005
Massuda
Geralmente uma grande fonte de dor de cabeça em threads é o uso de [b:b3cf686002]variáveis globais[/b:b3cf686002]. Por exemplo...
procedure Tfrmconcluiravista.btconcluirClick(Sender: TObject); begin // ... //solicita a impressao de cupom t2.Create(false); //impressão de cupom com thread close; end;
você pode evitar o uso de variáveis globais assim:
type T2 = class(TThread) private procedure chamar_imp; protected procedure Execute; override; public CodigoDaVenda: Integer; QuantasCopias: Integer; end; procedure Tfrmconcluiravista.btconcluirClick(Sender: TObject); begin // ... //solicita a impressao de cupom with T2.Create(True) do begin CodigoDaVenda := codvenda; QuantasCopias := qtdeimpressao; Resume; end; Close; end; procedure t2.chamar_imp; begin //a linha abaixo que imprime o cupom manip_reg.impressaodecupom(CodigoDaVenda, dados.tbconfiguracoeslargura_cupom.Value, QuantasCopias); end;
Uma outra coisa... se você estiver usando [b:b3cf686002]Delphi 6 sem as atualizações[/b:b3cf686002], existe um bug em TThread.Synchronize; nesse caso, é melhor atualizar seu Delphi.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)