Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Enviar direto para impressora


João Paulo Taraciuk

Pergunta

Olá a todos, estou encontrando dificuldade para enviar um arquivo para a impressora deixando ele alinhado em colunas, ele fica assim

Descricao

Qtd--------x Unitario =-----Total

1000----------x----3,00 =-----30,00

1----------x----99,00 =-----99,00

O código está assim

Writeln(Texto,''+ZQuery3.FieldByName('Quantidade').AsString + '       '+ 
     'x'+'   '+formatFloat('#0.00',ZQuery3.FieldByName('Unitario').AsFloat)+
    ' =    '+formatFloat('#0.00',ZQuery3.FieldByName('Total').AsFloat));

e sai assim, fora de ordem, gostaria de saber também como faço para aumentar a fonte nas impressora 40 colunas Bematech

Se alguém puder me dar uma dica, eu agradeço

Valeu!!!

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Olá a todos, estou encontrando dificuldade para enviar um arquivo para a impressora deixando ele alinhado em colunas, ele fica assim
Descricao

Qtd--------x Unitario =-----Total

1000----------x----3,00 =-----30,00

1----------x----99,00 =-----99,00

O código está assim

Writeln(Texto,''+ZQuery3.FieldByName('Quantidade').AsString + '       '+ 
     'x'+'   '+formatFloat('#0.00',ZQuery3.FieldByName('Unitario').AsFloat)+
    ' =    '+formatFloat('#0.00',ZQuery3.FieldByName('Total').AsFloat));
e sai assim, fora de ordem,
você teria que formatar os números e texto, completando com espaços à esquerda para que cada coluna tenha o tamanho correto. Daí sua linha sendo enviada para a impressora teria sempre a mesma largura e as colunas estaria na mesma posição. Fazendo uso desta função:
// Source = a string passada para ser formatada
// Ch = caracter a ser utilizado para preencher à esquerda
// Size = tamanho da string que deve ser retornada (largura da coluna)
function FormatStrSize(Source :string; Ch :char; Size :byte) :string;
begin
  Result := RightStr(StringOfChar(Ch, Size) +Source);
end;
voce poderia organizar melhor sua concatenação, tornando-a clara alterações.
var
  Buffer :String;
begin
  ...
  Buffer := FormatStrSize(ZQuery3.FieldByName('Quantidade').AsString, ' ', 4); // formata o número para 4 caracteres
  Buffer := Buffer +StringOfChar(' ', 5); // gera uma string de 5 espaços
  Buffer := Buffer +'x';
  Buffer := Buffer +StringOfChar(' ', 3); // gera uma string de 3 espaços
  Buffer := Buffer +FormatStrSize(formatFloat('#0.00', ZQuery3.FieldByName('Unitario').AsFloat), ' ', 5);
  Buffer := Buffer +' = ';
  Buffer := Buffer +FormatStrSize(formatFloat('#0.00',ZQuery3.FieldByName('Total').AsFloat), ' ', 5);
  Writeln(Texto, Buffer);
  ...
end;

Veja se você entendeu a idéia.

gostaria de saber também como faço para aumentar a fonte nas impressora 40 colunas Bematech
Já que usa esta impressora, porque você não utiliza os recursos oferecidos no site deles. Dá uma olhada na sessão download da Bematech - tem exemplos em Delphi. Acho que valeria a pena. Voce pode facilmente utilizar negritos/itálicos...

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, está dando erro na função FormatStrSize, assim

function Tfrm_vendas.FormatStrSize(Source: string; Ch: char;
  Size: byte): string;
begin
Result := RightStr(StringOfChar(Ch, Size) +Source);
end;

Dá o error

There is no overloaded version of 'RightStr' that can be called with these arguments

Eu utilizo Delphi 7.

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus, está dando erro na função FormatStrSize, assim

function Tfrm_vendas.FormatStrSize(Source: string; Ch: char;
  Size: byte): string;
begin
Result := RightStr(StringOfChar(Ch, Size) +Source);
end;

Dá o error

There is no overloaded version of 'RightStr' that can be called with these arguments

Eu utilizo Delphi 7.

João Paulo Taraciuk, desculpe-me, esqueci de por o último parâmetro da função RightStr - Size:

Result := RightStr(StringOfChar(Ch, Size) +Source, Size);

E também não havia mencionado (apesar que você já colocou): é necessário adicionar a unit StrUtils na cláusula uses.

Observei que você adicionou a função como um método do form. Isto não é necessário - é uma função independente do form, logo se você tiver uma unit onde colocas funções deste tipo (funções úteis de aplicação em vários projetos), coloque-a lá e adicione este sua unit na cláusula uses. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Funcionou aqui Micheus, Obrigado.

Primeiro eu testei enviando para um txt(Economia antes de tudo), aí,no txt ainda saiu desalinhado, mas aí, mandei Direto para a impressora e saiu alinhadinho, perfeito.

Obrigado, não sei o que faria sem a ajuda de vocês, porque, algumas coisas, a gente até consegue fazer sozinho, mas tem outras que só com a ajuda dos profissionais na área (Que em breve pretendo me tornar um :D )

Abraço!!!

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

  • 0
Primeiro eu testei enviando para um txt(Economia antes de tudo), aí,no txt ainda saiu desalinhado, mas aí, mandei Direto para a impressora e saiu alinhadinho, perfeito.

João Paulo Taraciuk, para que você veja este arquivo corretamente em um editor de texto, você deverá mudar o fonte dele para um onde os caracteres tenham tamanho fixo - é o caso do Courier.

Uma sugestão é abrí-lo com o velho editor em modo caracter (como no DOS) - Edit.com

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Deu certo, ficou alinhadinho, também no txt, agora, sem querer ser muito chato,

Observei que você adicionou a função como um método do form. Isto não é necessário - é uma função independente do form, logo se você tiver uma unit onde colocas funções deste tipo (funções úteis de aplicação em vários projetos), coloque-a lá e adicione este sua unit na cláusula uses.

Como eu poderia fazer esta Unit, pois tem funções que utilizo em vários forms, como esta

function Tfrm_clientes.Novo_Id: integer;
begin
DM_Dados.ZQuery_apoio.Active:=False;
DM_Dados.ZQuery_apoio.SQL.Clear;
DM_Dados.ZQuery_apoio.SQL.Add('select max(id_cliente)from clientes');
DM_Dados.ZQuery_apoio.Active:=true;
Result:=DM_Dados.ZQuery_apoio.FieldByName('id_cliente').AsInteger + 1
end;

e, facilitaria bastante colocá-la em uma Unit e depois somente chamá-la, assim como eu faço com as funções da Bemafi.

Mas eu não sei onde deveria declarar a função em um form diferente.

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

  • 0
agora, sem querer ser muito chato,
Observei que você adicionou a função como um método do form. Isto não é necessário - é uma função independente do form, logo se você tiver uma unit onde colocas funções deste tipo (funções úteis de aplicação em vários projetos), coloque-a lá e adicione este sua unit na cláusula uses.

Como eu poderia fazer esta Unit, pois tem funções que utilizo em vários forms,

João Paulo Taraciuk, esta sua função teria lugar mais apropriado no datamodule(ou mesmo um form) principal (aquele que dura durante toda a aplicação).

Eu tenho a seguinte função em meu projeto:

function TDMMain.GetNewFieldCod(TableName, FieldName :string; WhereOption :string = '') :LongInt;
begin
  Query1.SQL.Text := 'SELECT (MAX('+FieldName+')) AS '+FieldName+' FROM '+TableName;
  if WhereOption <> '' then
    Query1.SQL.Add(WhereOption);
  Query1.Open;
  Result := Query1.FieldByName(FieldName).AsInteger +1;
  Query1.Close;
end;
observe que neste datamodule, eu tenho um componente tipo query (Query1) que é utilizado exclusivamente para isto - ele já está devidamente vinculado ao componente database. Esta função, como dá para observar é genérica, porque eu posso passar o nome da tabela, do campo e alguma condição extra (WhereOption). Eu a uso no evento BeforePost dos datasets que necessitam obter algum código sequencial. Vejamos um exemplo de uso:
procedure TDMDiversos.DstCidadeBeforePost(DataSet: TDataSet);
begin
  if DataSet.State = dsInsert then
    DstCidadeCOD_CIDADE.Value := DMMain.GetNewFieldCod('CIDADE', 'COD_CIDADE');
end;
apenas se estiver no modo inserção é que obtermos o novo código. e um exemplo onde o código é gerado baseado em outro campo:
procedure TDMDiversos.DstEntidadeProgramaBeforePost(DataSet: TDataSet);
begin
  if DataSet.State = dsInsert then
    DstEntidadeProgramaCOD_PROGRAMA.Value := DMMain.GetNewFieldCod('ENTIDADE_PROGRAMA', 'COD_PROGRAMA', 'WHERE COD_ENTIDADE = '+DstEntidadeProgramaCOD_ENTIDADE.AsString);
end;
neste caso, o valor gerado para COD_PROGRAMA é obitido para cada código em COD_ENTIDADE. Ou seja, para entidade 1, posso ter codigo do programa 1, 2, 3,...; para entidade 2, da mesma forma: 1, 2, 3, 4, ...; No caso da outra função que eu havia citado este recurso, você deveria proceder assim: no Delphi7, acessa menu File->New->Unit (cria uma nova unit). O corpo dela será criado assim:
unit Unit1;

interface

implementation

end.
logo após interface, você deverá colocar o cabeçalho das funções e procedimentos a serem exportados para as outras aplicaçãos - funções que não estiverem "declaradas" ali, não estarão disponiveis para sua aplicação. Já, logo após implementation, como o nome diz, vem a implementação dos seus procedimentos ou funções. você deve acrescentar a cláusula Uses para incluir a units que você precisar (fizer uso nesta unit). O exemplo ficaria assim, então:
unit Unit1;
uses
  SysUtils;
interface
  function FormatStrSize(Source :string; Ch :char; Size :byte) :string;
// aqui outras declarações

implementation

// Source = a string passada para ser formatada
// Ch = caracter a ser utilizado para preencher à esquerda
// Size = tamanho da string que deve ser retornada (largura da coluna)
function FormatStrSize(Source :string; Ch :char; Size :byte) :string;
begin
  Result := RightStr(StringOfChar(Ch, Size) +Source);
end;

// ... outras funções

end.

ao gravar você deverá dar um nome a ela. Este será o nome que você utilizará na cláusula uses da sua aplicação.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Micheus, já testei aqui e deu certo, isso vai me ajudar bastante, pois assim, não vou ter que criar a mesma função em cada form que for utilizá-la, crio na nova Unit e somente chamo quando onde for utilizá-la.

E a outra função também, vou acabar implementando aqui no meu Projeto.

Valeu!!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...