Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    Quickreport

    Sem querer interferir, mas só para ir adiantando, você poderia utilizar o mesmo conceito do item 2 neste post Abraços
  2. Crie uma query com uma consulta +/- assim (tem que ajustar o nome dos campos e tabela): Essa query você liga ao seu DBGrid. Antes de abrir ela, você iniciliza o parâmetro com utilizando a função Date: ... QryVencidos.Close; QryVencidos.SQL.Clear; QryVencidos.SQL.Add('select nome, numero do boleto, valor, vencimento'); QryVencidos.SQL.Add('from boleto'); QryVencidos.SQL.Add('where vencimento < :DataAtual'); QryVencidos.ParamByName('DataAtual').AsDateTime := Date; QryVencidos.Open; ...Após aberta, os dados devem estar visíveis no DBGrid. Abraços
  3. Não tem como fazer isso como QuickReport, então você terá que utilizar outro componente com essa característica (teria que fazer uma impressão em modo caracter - não gráfico - direto para a impressora). Quem sabe algum outro colega pode lhe ajudar com isto. Pelo exemplo que você postou, "olhando assim por cima", acho que você teria que utilizar os eventos BeforePrint da banda detalhe para totalizar os dados que você quer (em variáveis no form) e depois movê-los para os respectivos campos na sua banda sumário. Abraços
  4. Micheus

    Botões

    ArchimedS-S, alterar o arquivo .dfm do preview é uma opção, entretanto, convém lembrar que esta alteração se refletirá em outros projetos em que você utilize o QuickReport - é bom ter atenção a este fato. E não esqueça de fazer um backup do arquivo original antes! ;) Abraços
  5. Micheus

    Novato Delphi.

    Aqui você tem um problema a resolver. Se o byte 0 (zero) do buffer out é sempre 0 (zero), o primeiro caracter que você moveu de txt é perdido! Acredito que você tenha que adicionar 1 ao indexador do buffer (FBufferOut[n +1]) também, troquen:= 0; while n <= BufferOutSize do begin FBufferOut[n] := 0; inc(n); end; porFillChar(FBufferOut, SizeOf(FBufferOut), 0) Se no buffer de entrada a posição 0 (zero), também, tem sempre o valor 0 (zero) então não vai funcionar mesmo. É como citei em minha primeira resposta: 'Uma coisa a levar em conta é se nesta sequência, poderá estar incluso um caracter nulo(#0)...'. Mas se, e somente se, o primeiro caracter vier com o 0 (zero), você ainda poderá fazer desta forma:na Saída FillChar(BufferOut, SizeOf(BufferOut), 0); // inicializa buffer com #0 ou 0 StrPLCopy(@BufferOut[1], Edit1.Text, SizeOf(BufferOut) -1); na Entrada: Edit1.Text := PChar(@BufferIn[1])+#0; Estamos pulando o caracter 0 (zero) que está na posição 0 (zero) do seu buffer. Abraços
  6. Micheus

    Novato Delphi.

    O uso do PChar como lhe propus é justamente para não ter nada de loop: na Saída FillChar(BufferOut, SizeOf(BufferOut), 0); // inicializa buffer com #0 ou 0 StrPLCopy(@BufferOut, Edit1.Text, SizeOf(BufferOut)); na Entrada: Edit1.Text := PChar(@BufferIn)+#0; Não é isso que você disse estar querendo fazer? Abraços
  7. Micheus

    1ª Linha -dbgrid

    Eder, Isto verifica se é a primeira linha do DataSet, não do DBGrid. Mas, apesar da resposta à minha pergunta, acho que é isto que o Bruninn realmente quer. Abraços
  8. José, infelizmente estas questões me fogem ao escopo - realmente não saberia lhe informar, mas acredito que outros colegas aqui no forum possam lhe "dar alguma luz". Abraços p.s. você já percebeu que nesta nova versão do forum, você pode escrever Moçambique sem que se torne Maiorçambique?
  9. José, não seria através das opções do projeto, na guia "Application" - tem o botão "Load icon..."? Abraços
  10. É impressão minha, ou sua primeira opção no combo é apenas informativa (Escolha). Se for, observe que no Edit1Change você não está levando em conta esta opção e se por acaso você estiver permitindo que o usuário digite algo no Edit1 com a 1ª opção do combo selecionado, ao executar a query e o campo "Escolha" não existindo na tabela resultará em erro de execução! Mancada minha . O método DefaultDrawColumnCell pertence ao componente DBGrid, logo, você deve utilizar desta forma: BGridDados.DefaultDrawColumnCell(Rect, DataCol, Column, State); Outra coisa, acho que as máscaras corretas seriam CPF 999\.999\.999-99 e CNPF 99\.999\.999\/9999-99 (não estou 100% certo - confira). Se você observar, o uso da lógica com os if..then..else, permitem que você não tenha que utilizar o Abort. Uma boa aplicação do Abort seria no evento BeforePost de uma tabela, aonde o processo seria interrompido, sem efetivação da gravação (após algum tipo de validação é claro). Para uma situação como esta eu recomendaria o uso de EXIT que desviará o fluxo do programa para o end final do procedimento. Veja que há diferença entre suas procedures (do help): "Abort raises a special "silent exception" which operates like any other exception, but does not display an error message to the end user. Abort will redirect execution to the end of the last try .. finally block." "Exit will cause the calling procedure to continue with the statement after the point at which the procedure was called." A título de exemplo, você pode observar que não seria necessário o uso do Abort ou mesmo do Exit:procedure TCClientes.BitBtnGravarClick(Sender: TObject); begin QryClientes2.Close; QryClientes2.Sql.Clear; QryClientes2.SQL.Add('Select * from Clientes where CPF_CNPJ = '+''''+DBEditCPF_CNPJ.Text+''''+''); QryClientes2.Open; if QryClientes.State in [dsInsert] then begin if not QryClientes2.Eof then //já existe cadastro ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); else begin QryClientes.Post; ShowMessage ('Cadastrado efetuado com sucesso!'); end end else if QryClientes.State in [dsEdit] then if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then begin QryClientes.Post; ShowMessage ('Alteração efetuada com sucesso!'); end else if not QryClientes2.Eof then //já existe cadastro - Aqui está dando erro, está gravando mesmo assim. ShowMessage ('Já existe Cadastrado com este CPF/CNPJ. Pesquize!'); end; Voce está dizendo que ele está: cancelando a gravação (post); movendo o foco para o componente com o texto incompleto, mas não está mostrando a mensagem que deveria ter sido executada antes de tudo isso? Abraços
  11. O erro está no fato de você utilizar a propriedade State após o post. Neste momento ele não será outro que não dsBrowse! você deve salvá-lo em uma variável local antes de executar o post, para então testar essa variável em seus "if's". Eu sugeriria utilizar um case em seu lugar:LocalState := QryClientes.State; QryClientes.Post; case LocalState of dsInsert : ShowMessage ('Cadastrado com sucesso!'); dsEdit : ShowMessage ('Alteração efetuada com sucesso!'); end; você consegue isso utilizando o LIKE na query. Já tem bastante post's sobre isso aqui no forum, dê uma buscar por "LIKE" ou "autocompletar", mas vou adiantar um - Link você poderia fazer isso ao pintar o DBGrid (Link), aonde você ferifica se o campo a desenhar é o cpf_cnpj, e sendo ele você faz algo como: procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if Column.Field.FieldName = 'CPF_CNPJ' then // aqui tem que colocar o campo tipo cliente da sua tabela e testar se é física // e estará sendo testada a linha que estiver sendo pintada, então "don't worry" if DBGrid1.DataSource.DataSet.FieldByName('Tipo de Cliente').Value = 'Fisica' then begin DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top, FormatMaskText('999.999.999-99;0;', Column.Field.AsString)) Exit; end; DefaultDrawColumnCell(Rect, DataCol, Column, State); end;mas ainda tem coisas a se preocupar, como se a linha/coluna está selecionada, pois tem que utilizar a cor de fundo para esta situação. Outra opção, é utilizar o evento OnGetText do campo CPF_CNPJ adicionado ao seu dataset (componente) ligado ao DBGrid. Acho essa melhor, mas pode ter algun efeito colateral de você utilizar este dataset para edição também. Abraços
  12. Micheus

    Botões

    Você fala dos botões do Preview, certo? Normalmente para modificar aquela tela o que se faz é criar um novo preview.Mas como você disse que "viu em um certo tutorial um exemplo em que os botões de load report e save report, foram removidos(escondidos)...", talvez se você indicar tal tutorial as uma possível correção no seu procedimento poderá ser mais fácil. ;) Abraços
  13. quando você utiliza: VAL_STR := Modulo.valor.asstring; a conversão será feita conforme você definir a propriedade DisplayFormat, se você não define nada, seria equivalente a utilizar a função FloatToStr, se você define, seria equivalente a utilizar a função FormatFloat, sendo que a melhor opção seria definir a propriedade DiplayFormat = '0.00', que é suficiente para retornar um número formatado com 2 casas decimais. Ex.: 20,4 -> 20,40; 0,3 -> 0,30 Aparentemente a conversão seria feita da forma como coloquei logo acima ou a sugerida pelo colega paulobergo. Mas se você espera ao final que seja retirada a vírgula e mantidas as duas casas que existiam após ela, então não seria melhor multiplicar por 100 e utilizar apenas a parte inteira? Abraços
  14. Não esqueça do backup do que você tem hoje em funcionamento (mesmo que precário). ;)
  15. overbits, é meio complicado achar/sugerir uma solução deste tipo quando não se tem a situação em mãos, mas vou tentar explicar algo que penso poderia ser uma alternativa.Neste exemplo, o dataset que você mostra no DBGrid seria uma query (QryConsulta). Então, criaríamos alsguns procedimentos: procedure TForm1.PreparaFiltro1; begin QryConsulta.Close; QryConsulta.SQL.Clear; QryConsulta.SQL.Add('SELECT *'); QryConsulta.SQL.Add('FROM NOME_TABELA'); QryConsulta.SQL.Add('WHERE CONDICAO_1 = :Condicao1'); // ... outras condições iniciais, se houver, adicionar aqui end; procedure TForm1.PreparaFiltro2; begin // prepara o filtro inicial PreparaFiltro1; // inclui o novo filtro sobre o primeiro resultado QryConsulta.SQL.Add(' AND DAT_CONDICAO_2 BETWEEN :DAT_INICIO AND :DAT_TERMINO'); end; procedure TForm1.PreparaOrdenacao(SortFields :string); begin // verifica se a última linha da query contém a cláusula ORDER BY if Pos(QryConsulta.SQL[QryConsulta.SQL.Count -1]) > 0 then // se já existe, altera o conteúdo QryConsulta.SQL[QryConsulta.SQL.Count -1] := 'ORDER BY '+SortFields else // se não existe, adiciona QryConsulta.SQL.Add('ORDER BY '+SortFields); end; Ao aplicar o 1º filtro:procedure TForm1.... begin PreparaFiltro1; PreparaOrdenacao('CAMPO_ORDENAR'); // se hover mais que um, basta concatenar separando com "," QryConsulta.ParamByName('Condicao1').Value := VALOR_CONDICAO1; QryConsulta.Open; end; Ao aplicar o 2º filtro:procedure TForm1.... begin PreparaFiltro2; PreparaOrdenacao('CAMPO_ORDENAR'); // se hover mais que um, basta concatenar separando com "," QryConsulta.ParamByName('Condicao1').Value := VALOR_CONDICAO1; QryConsulta.ParamByName('DAT_INICIO').AsDateTime := VALOR_DAT_INICIO; QryConsulta.ParamByName('DAT_TERMINO').AsDateTime := VALOR_DAT_TERMINO; QryConsulta.Open; end; Ao mudar a ordenação, teria que ser verificado que filtros já forma aplicados. O parâmetro 'CAMPO_ORDENAR' passado em PreparaOrdenacao seria uma variável que é inicializada quando um campo é selecionado, deste modo ao modificar a ordenação, após inicializar esta variável, basta verificar que filtro foi aplicado e chamar o respectivo procedimento (que não defini nome) para ser aplicado do 1º ou 2º filtro; Espero que isso possa lhe auxiliar numa solução. Abraços
  16. Micheus

    Novato Delphi.

    Acredito não seja muito problemático.Uma coisa a levar em conta é se nesta sequência, poderá estar incluso um caracter nulo(#0). Como este caracter é terminador de string, ao aparecer na sequência, uma simples conversão (que é fácil de obter) resultaria numa string truncada. Neste caso, acho que o mais conveniente seria a apresentação da sequência no formato hexadecimal (como vemos em alguns sistemas similares). No caso de seu array of byte não conter nulo em qualquer posição, não é necessário nem criar uma função para isto, basta que você faça algo como: var Buffer :array[1..64] of byte; Txt :String; Idx :Integer; begin // inicializando para gerar o exemplo for Idx := 1 to 64 do Buffer[Idx] := 42+Idx; // e demonstrando como transformar o array of byte em PChar (essa a parte que lhe interessa) Txt := PChar(@Buffer)+#0; // Mostrando o texto convertido - você pode concatenar, adicionar a memo // qualquer coisa apenas utilizando PChar(@Buffer)+#0 (não necessita da variável) ShowMessage(Txt) end; Abraços
  17. Micheus

    1ª Linha -dbgrid

    Voce quer saber quando for a 1ª linha do DBGrid ou quando for a 1ª linha do dataset ligado ao DBGrid? Se for a segunda opção, que tipo de dataset você está utilizando? (TTable, TQuery, CDS, ...) Abraços
  18. De forma simplista, basta você definir image3 com a altura suficiente para armazenar as duas (altura3 = altura1 +altura2), dai você pode utilizar o canvas da image1 para desenhar no retângulo superior (correpondente a image1) da image3, depois utiliza o canvas da image2 para desenhar no retângulo inferior (onde o top é altura image1 +1) da image3. Ao final, image3 terá as duas imagens "concatenadas". Acho que com o que você já questionou/aprendeu sobre thumbnails aqui no forum, você irá conseguir implementar o código. Abraços
  19. No código da filtragem das datas eu coloquei assim: (No evento onclick de um botão qualquer) begin inherited; if (Edit_Data_Inicial.Text <> ' ') and (Edit_Data_Final <> ' ') then begin inherited; Table1.IndexName:= ´SI_DataDePagamento´; Table1.SetRange([Edit_Data_Inicial.text], [Edit_Data_Final.Text]); Table.Filtered:= True; end; end; Daí mostra no DBGrid o resultado da filtragem sem problemas em ordem cronológica... Lembrando que já havia feito uma filtragem antes dessa acima, por um campo quanquer da tabela e esse resultado também estava na DBGrid, daí quando clico no botão ele não faz uma nova filtragem não... Ele pega o que já está como resultado na DBGrid e realiza a filtragem com o valor dad datas que eu informei em Edit_Data_Iniciall e Edit_Data_Final... Daí criei mais 3 botôes pra realizar uma ordenação depois dessa filtragem por datas, Por Nome... Por Valor... Por Tipo... E ao invés de continuar efetuando o processo com o resultado mostrado na DBGrid ele faz na tabela inteira... Eu queria ordenar o resultado de uma filtragem anterior, com o resultado mostrado e não na tabela toda... Essa form que criei é como uma central de pesquisa no prgrama inteiro... Mas consegui fazer isso usando uma Table só, um DataSource só... Já tentei de tudo e só falta isso pra finalizar.. Se tiver que colocar um componente Query tudo bem pra cada botão que eu quizer pra ordenar... Já aé implementei isso..Mas continua me voltado o resultado da tabela completa (5800 registros) e não uma filtragem por mês que eu fiz anteriormente. overbits, não ficou claro ainda se você utiliza a propriedade Filter, apesar de você ativar o filtro ((Table.Filtered:= True;). O uso de SetRange está vinculado ao índice que você está utilizando. Eu não estou certo, mas aplicado o Range e setando o filtro (Filter := 'CAMPO >= VALOR ...'), a combinação de ambos deveria funcionar. Voce está utilizando a propriedade Filter também? Como você está inicializando ela? De qualquer modo, já que você pretende aplicar filtro sobre filtro, acho que a melhor opção seria implementar isso utilizando uma query. Abraços
  20. Micheus

    Web Update

    Churc, o ideal que seja testado, porque meus tests foram meio limitados (criei uma situação hipotética). Então só com um casso "real" é que vai dar para ver se a forma como pensei é prática ou não. Se alguém puder testar e fazer algum comentário, seria muito bom. Abraços p.s. Despois da atulização do site não estou conseguindo utilizar o botão de "Quote"(ele pula para o post #1 - parece erro no link) e até acessar alguns post's. Isso está ocorrendo com você também?
  21. Micheus

    Web Update

    "Não é assim uma Brastemp", mas acho que pode ser um ponto de partida. :unsure: Então, se interessar, dêem uma espiada neste código que adaptei de um que utiliza FTP. Ele faz uso do componente TIDHTTP (Indy) sugerido pelo colega CorN_Sk8; A filosofia é: no source do projeto, antes de iniciar os forms, faz a "checkagem" no site para verificar se há uma atualização disponível. Se não houver, segue normalmente, mas se houver, põe o programa de update em operação e não carrega o form de modo que o programa principal simplesmente fecha (encerra). Por sua vez, o programa de atualização, após executada a mesma, procede a carga do programa atualizado e "se fecha". - tem que ajustar algumas variáveis (estão indicadas nos comentários), para o correto funcionamento; - estas, variáveis podem ser carregadas de arquivos INI ou registro do Windows, mediante implementação no código; - como o programa de atualização recebe o arquivo a atualizar como parâmetro, possibilita seu reaproveitamento para "n" projetos. Também, com alguns ajustes, pode ser adiconada uma chamada na chave de registro Windows/Run para verificação durante a inicialização do Windows. Se realmente estiver funcionando e acharem que o programa pode ser realmente útil, sugestões/críticas serão bem vindas, assim melhoramos o código e compartilhamos com os demais. Abraços
  22. Micheus

    Resize?

    José, observando as imagens, dá até para perceber que o Grid está ancorado porque ele se mantém ajustado às margens em qualquer resolução. Entretando, observando a imagem 1680x1050.bmp (parece-me a que você desenhou em seu telão :D), acho que é apanas uma questão esquematizar o posicionamento dos componentes, levando em conta as diferentes resoluções. Em se tratando de "ajuste vertical", no caso do seu Grid estar se sobrepondo aos componentes de data, ao observar as figuras, é possível notar que ele tem sempre a mesma altura, donde parece que você definiu anchors Left, Botton e Right = True e Top = False. Se você desenhasse a tela levando em conta os monitores padrões, você deveria posicionar o Top do Grid de tal modo que ele ficasse abaixo dos componentes data e fixar anchor Top = True. Faça isso e observe que o grid irá ajustar-se as diferentes resoluções, sem sobrepor-se aos componentes de data. Com os componetes que você colocou lado-a-lado ("ajuste horizontal"), pelo menos no seu exemplo, a coisa pode ser um pouco mais complicada, mas acredito que também dá para achar um meio de ajustar. você deve observar que está desenhando no modo wide (+/- 16:9) e pretende ajustado para o modo "quadrado" (4:3), e acho que talvez o melhor seria o contrário, ou até mesmo manter a proproção (aspect ratio) baseado nos monitores padrões. Abraços
  23. Não, não é a mesma coisa.Quando você cria o bitmap (TBitmap.Create) ele tem as dimensões 0x0 e sempre que você desenha(usa o canvas) algo além do tamanho do bitmap, o excesso pode ser truncado (depende da propriedade autostretch), mas neste caso não teria jeito mesmo. Para o seu caso (desenhar no bitmap após criá-lo) você tem que definir o tamanho dele configurando sua largura(Width) e altura(Height). Quando você carreta a imagem de um arquivo ou faz o assign, isto não é necessário porque estes métodos se encrarregam de fazer isso. Abraços
  24. Micheus

    Resize?

    José, não entendi direito qual seria o problema. Seria uma questão de redimensionar seu form simplesmente, ou de escalar todo o form para a resolução da tela - tipo aumentando/diminuindo o tamanho dos fontes e caixas de edição? você poderia mostrar como tem feito e exemplificar como gostaria que fosse o resultado (um exemplo)
  25. Micheus

    Loop Infinito

    Por acaso o evento AfterPost não seria o da tabela tbCaixa, seria? Se for, este não é o lugar para você editar ela. Pelo que parece ser a função do seu código, eu lhe diria que o procedimento normal seria algo como: tbCaixa.First; // <= Posiciona no primeiro registro da tabela (normalmente "filtrada") while not tbCaixa.Eof do begin total_anterior := tbCaixaTOTAL.AsFloat; tbCaixa.Edit; tbCaixaTOTAL.AsFloat := total_anterior + tbCaixaCREDITO.AsFloat - tbCaixaDEBITO.AsFloat; tbCaixa.Post; tbCaixa.Next; // <= Avança para próximo registro end; tbCaixa.Close; tbCaixa.Open;
×
×
  • Criar Novo...