Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Para relatórios, você pode ir dando uma olhada neste tópico em Tutoriais & Dicas: Criando Um Relatório no QuickReport Passo a Passo Quanto ao instalador, acho que o InnoSetup seria uma boa opção. Dê uma olhada nestes links retornados pelo Google. Abraços.
  2. bom, acho que isto você tem que ver, você nem menciona que erro ocorre, mas acho que você deve conseguir resovê-lo. com isso, e o que eu já comentei, acho que você já responde a este seu questionamento inicial: ou seja, você já sabe quando chamou uma inclusão ou edição.
  3. Acho difícil achar um guia para algo tão completo. No site Planeta Delphi tem um sistema exemplo de Controle de Estoque (usando tabelas paradox), só que você tem que se registrar para baixá-lo - link para download. Quem sabe partindo deste projeto, você consegue montar o seu. ;)
  4. robinhocne, quando falei sobre perguntar apenas antes da impressão, naquele seu exemplo, era no sentido de que ficasse algo mais ou menos assim: With DtmIza.qryIza do Begin ConsultaRegistros ('Empresa', 'Empresa, Endereco, Numero, Cnpj, Bairro, Cidade', 'Codigo>=' + txtMat.Text); if (not pergunta('Deseja Imprimir o Contrato de Prestação de Serviço?')) then exit; With TFrmRelContrato.Create (Application) do try QuickRep1.Preview; finally free; end; End;ao menos era como eu tinha entendido: você faz a tal consulta/alteração no registro e depois (após gravada) fazer a pergunta se deseja imprimir ou não o tal contrato. Quanto a 2ª questão, acho que a sugestão é fácil de entender, a implementação não deveria ser problema, mas eu conseguir ajudar pode ficar meio extenso. Em algum momento você coloca os dados em seus edits (em uma alteração) ou inicia o form com os edits vazios (em uma inclusão). É neste ponto que você vai poder saber quando está incluindo ou alterando para, então, inicializar uma variável (booleana por exemplo) declarada no form de onde você faz a chamada para os respectivos procedimentos e que você irá utilizar para em seu retorno (saída do procedimento, provavelmente quando o cara gravou os dados) imprimir. Muito provavelmente você deve ter um procedimento similar ao que você postou há algum tempo (post). Nele aparece a chamada a um procedimento IncluirRegistro( 'Praticas', vCpo, vVlr ), imagino que você tem algo parecido para Empresas. Assim, neste momento você saberá que está fazendo uma inclusão e deve haver um outro procedimento em que você sabe que está alterando.
  5. robinhocne, não seria porque a pergunta deveria estar depois da sua chamada a Consulta Registros? Você quer dizer apenas quando está incluindo? Se for, como você não utiliza os métodos convencionais (datasets em modo inserção/edição), então sugiro que você utilize uma variável em algum lugar (só você vai saber qual o melhor) para indicar quando o registro está sendo incluído ou quando está sendo alterado. Daí você só chama o procedimento para o relatório após verificar esta variável. se você utiliza QuickReport, a dica é utilizar o TQRComposite, veja este post e veja se você consegue utilizá-lo em seu relatório (é bem simples, principalmente se os dois QuickReps estiverem no mesmo form). Abraços
  6. Micheus

    Contador De Tempo

    Jhonas, como o programa que ele está fazendo é para uma lan-house, o mais provável é que sejam jogos que rodam sob DirectX ou OpenGL. Não estou certo de que ele conseguirá colocar algo sobre a janela de um destes jogos quando operando em Full Screen. Abraços ------------------- Inclusão: 1) DirectDraw applications can take control of the screen by putting themselves into full-screen exclusive mode. As long as the application remains open it can retain complete control of the entire display (msdn) 2) No caso de a aplicação em DirectX ser sua e desejar mostrar uma caixa de diálogo, daí tem meio conforme este artigo no msdn - Displaying a Window in Full-Screen Mode então, parece que não vai dar mesmo. :(
  7. Joaze, se a cópia foi realizada com sucesso, qualquer mensagem de erro não pode ter origem na execução da Query - não acha?! Se o erro estivesse na execução da query, uma exceção ocorreria e os dados não teriam sido incluídos, já que é isto que sua instrução SQL faz. Este erro é típico de uma atribuição como esta: var NumDocumento :string; begin DMMain.Query1.Open; NumDocumento := DMMain.Query1.FieldByName('NUM_DOCUMENTO').Value; // Value é do tipo Variant DMMain.Query1.Close; end;onde você tem uma variável ou propriedade de componente, do tipo String, para a qual você está atribuindo uma variável/propriedade de componente que seja do tipo Variant e que está com valor NULO. Por acaso, quando este erro ocorre, o fluxo do programa não é desviado para dentro do editor do Delphi? Se sim, quais linhas estão exatamente antes da linha em que o cursor pára?
  8. Walter Gazzarrini Neto, então aproveite para se registrar (é só ler as regras, concordar e clicar em Registrar) Abraços
  9. Vivendo&Aprendendo, veja se com este exemplo (bem simples) você (e quem mais se interessar) entende o que eu quis explicar lá no post #4. O exemplo não é um relatório, é em form com 3 DBGrid's cascateados (Cliente -> Saídas -> Itens de Saída). Voce vai ver que praticamente não há código, tem comentários na tela e basta que você clique em qualquer linha dos DBGrid's para que os DBGrid's dependentes sejam atualizados - isto é resultado da ligação via DataSource e uso de parametrização! Para montar o relatório, você não deverá ter qualquer dificuldade, já que o procedimento é similar, exceto que ao invés de DBGrid's, você terá bandas. Supondo uma consulta onde você traga as Saídas, esta ficaria "vinculada" a banda Detail, e os itens da Saída a uma banda SubDetail; (seria como visualizar o que ocorre na tela como a 2ª e 3ª consulta nos DBGrids). p.s. Evite criar post's "nulos" como os dois últimos que você postou - podem ser considerados UP's e isto é proibido no forum (ver regras) ;) ADO_Mestre_Detalhe.zip
  10. Obrigado pelo post, mas eu sei do que se trata o assembler. Também já tive oportunidade de fazer algumas coisas utilizando dela. Entretanto, minha pergunta deve-se ao fato de que o acesso direto a disco em ambiente Windows NÃO deve ser feito por este tipo de procedimento. Que eu saiba, o acesso ao disco deve ser feito via controles IOCTL via função API DeviceIoControl. E a unidade deve ser "lockada" enquanto acessada (coisa assim). Apenas lí a respeito - nunca implementei nada em Windows. Bom, evidentemente não lembro onde li, mas pesquisando encontrei alguns comentários a respeito para Windows: - How can I write to floppy disk sector? (tem exemplo de acesso ao disquete em Delphi) - Reading/Writing disk sectors on non-standard file systems Mesmo a utilização do assembler (respeitando as questões do ambiente windows) poderia ser utilizado, já que você pode carregar as instruções da API em código assembler também. Já em ambiente DOS, ai sim, você poderia fazer o que quizesse com o HD já que trata-se de um ambiente Mono-tarefa (só teria sua aplicação acessando o disco). Exemplo em DOS: - Absolute Disk Sector Reader (programa em ASM) Para este tipo de ambente, eu cheguei a implementar varredura no disco para verificação/validação de Bad-Clusters, modificações na FAT, Diretórios, variáveis do Setor de Boot, dentre outras tantas coisas que realmente podem ser feitas utilizando as interrupções da BIOS para acesso a disco (principalmente a $13) via códificação assembler, C e pascal. É importante ficar claro que para manipular dados diretamente no disco, você tem que ter conhecimentos sobre as estruturas de armazenamento (FAT12, FAT16, NTSC,...), setores lógicos e físicos. Também deve ter em mente o risco que estará correndo ao fazer algum tipo de operação incorreta (comum quando se está implementando) - o que pode ser irreversível. E por ai vai.... Nesta página do Torry's, é possível encontrar (procure na página por): - Physical Disk Access v.1.0 - Raw Disk Access v.1.1 - TDiskIO v.2.0 Para quem quizer se arriscar... Abraços
  11. ahhh!!!!então estamos falando de outro form, não mais aquele que tem o DBGrid. Bom, se é para mudar o label para qualquer peça em que a Qtdfinal_estoque é inferior a 10, então acho que você deve fazer uma consulta exclusivamente para isto, algo como: SELECT peca FROM estoque WHERE Qtdfinal_estoque <= 10 obs: você tem que ajustar o nome do campo e tabela no select porque eu não sei o nome deles (você não informou) Um select deste tipo irá lhe retornar todas as peças que a Qtdfinal_estoque esteja inferior a 10. Daí, se você quer listar no label o nome ou código (sei lá o quê) destas peça, você varre esta consulta e vai concatenando o valor do campo em questão no label: Form37.label2.caption := ''; dm.ZQryQtd.Open; while not dm.ZQryQtd.EOF do begin Form37.label2.caption := Form37.label2.caption + dm.ZQryQtd.FieldByName('Peca').AsString +'; '; dm.ZQryQtd.Next; end; dm.ZQryQtd.Close; ou se preferir utilizar a consulta que é mostrada no DBGrid: Form37.label2.caption := ''; dm.ZTpecas.First; while not dm.ZTpecas.EOF do begin if dm.ZTpecas.FieldByName('Qtdfinal_estoque').value <= 10 then Form37.label2.caption := Form37.label2.caption + dm.ZTpecas.FieldByName('Peca').AsString +'; '; dm.ZTpecas.Next; end; Veja se era isto.
  12. Não fique "zangado"... (alusão ao ícone do post) Enquanto não fica claro o que você quer, é difícil acertar. ;) Veja bem, você tem um DBGrid onde muitas linhas são mostradas. Para cada linha, tem uma coluna chamada "Qtdfinal_estoque". E voce quer que apareça num label um texto conforme o valor desta coluna. Não está meio estranho? Ou eu entendi errado? Se o texto tem que ser mostrado para cada item no DBGrid, então você deveria ter uma coluna para mostrar este texto - neste caso seria indicado o uso de um campo calculado.
  13. quando você fala deste assembler a que se refere? Utilizar interrupções da BIOS para acessar o disco fisicamente?
  14. Naquele outro tópico, você queria alterar ele via programação, e esta alteração seria válida para sua aplicação apenas. Mas o processo para saber, qual o local utilizado é praticamente o inverso - basta ler o conteúdo antes de alterá-lo (ou mesmo que não vá alterálo): if Session.NetFileDir <> 'c:\' then ShowMessage('Net dir apontando para outro lugar...'); Se você não alterou ele em momento algum, quando você lê esta propriedade ele lhe mostrará o Path atualmente configurado no BDE!
  15. Tetzner, você está respondendo/perguntando ao Jhonas ou a mim? O que eu postei, significa que você vai estar trabalhando com a imagem original - nada mais que isso.
  16. Eu acho que estes itens podem ser problema sim. Uma pequena variação na tonalidade de uma cor, através de comparação pura, pode resultar em uma interpretação errada. neste link tem um exemplo que não é muito diferente do que aquele que o Jhonas propôs (comparar os bytes do arquivo - char), mas que "consegue" lhe mostrar quantos pontos coincidem e não coincidem nas duas imagens. Ele, não vai resolver o problema, mas pode dar uma métrica de que uma comparação de imagens não é algo tão simples como parece exposto até aqui. a cor azul em hexa-decimal $FF0000, com uma pequena nuance (este azul) $FF100F, tem valores bem diferentes: $FF0000 -> separando em bytes -> FF=255; 00=0; 00=0 $FF100F -> separando em bytes -> FF=255; 10=16; 0F=15 então uma comparação simples não resolveria. Abraços
  17. Não!Observe que sua imagem tem o tamanho "X" e o que o componente faz é ajustar ele para caber dentro da área de visualização que você tem (a janela do componente), visto que você utiliza o stretch. É apenas uma definição de visualização. Para visualizar no tamanho que deseja (como você faz hoje), mas querendo acessar toda a imagem ao utilizar a propriedade Pixels você deve utilizar as dimensões da imagem (tbitmap, tjpgimage, ou seja da propriedade Picture) e não a do componente. Assim, seu for deverá utilizar algo como: for Largura := 0 to Image1.Picture.Width-1 do begin for Altura := 0 to Image1.Picture.Height -1 do begin ... end; end; Abraços
  18. Jhonas, não entendi. :huh: Um arquivo excluído, simplesmente vai para a pasta RECYCLER. Se você habilitar a visualização de arquivos ocultos no Windows Explorer, vai encontrar uma pasta destas em cada unidade que você possuir. O problema pode ser referente a questões de acesso, já que cada lixeira está vinculada ao usuário logado. Observe a imagem da pasta na minha unidade D: aqui na empresa. Veja que há apenas um ícone com a figura da lixeira - esta é a única pasta que consigo visualizar seu conteúdo: E abrindo ela, é possível ver o nome dos arquivos excluidos: Então, seria uma questão de utilizar funções da API (Shell32). Veja alguns exemplos do site Aboult.com: Delete files with the ability to UNDO (apagar arquivo com possibilidade de recuperação) Programmatically Empty Windows Recycle Bin from Delphi (limpar a lixeira programaticamente) Tem um exemplo em VB onde dá para encontrar alguns objetos/comandos que podem ser utilizados para chegar aonde você deseja: How to programmatically use the Recycle Bin (CodeProject) Esta questão de mais baixo nível, estaria mais associado no caso de uma recuperação em que fosse feita uma pesquisa física no disco - eu acho. Abraços
  19. Micheus

    Relatórios

    Não sei o que fazer :unsure: Este erro é executando o exemplo que lhe passei? Ou você já adaptou ao seu projeto e este erro está aparecendo?
  20. Bom, acho que está meio confuso, mas fazer o programa por você está fora do escopo deste forum. Então, já que você tem em mente o que precisa para começar, você já chegou a fazer a tela, pelo menos? Com estes botões e tal? Se não, dê uma olhada neste 1.htm" target="_blank">artigo (até o item 1.4; existem vários tópicos, basta mudar o número da pagina até a delphi_8.htm) para se familiarizar com os componentes. Para alterar o relógio do sistema, voce vai precisar fazer uso de funções para manipular data e hora - veja este post. Para mostrar um relógio no seu programa, você vai precisar implementar algo baseado nesta dica. é isso aí, você começa e a gente vai ajudando. ;)
  21. B3co.ol, este processo é feito através da alteração da propriedade NetFileDir da classe TSession. Então, a menos que você tenha um componente TSession em seu projeto, basta que você altera a propriedade do objeto Session default, no seu form principal ou em outro ponto do programa, desde que antes de acessar as tabelas: procedure TMainForm.FormCreate(Sender :TObject); begin Session.NetFileDir := 'D:\ProgSID'; // ex. para uma pasta no micro local Session.NetFileDir := '\\SRV-DATA\ProgSID'; // ex. para uma pasta de rede end; Você vai precisar ter acesso de escrita na pasta (diretório) escolhida.
  22. Sabe o dataset (table ou query) que você ligou ao seu DBEdit, via propriedade DataSource? Então, você deve encontrar nele um evento chamado OnNewRecord e escreve neste evento o código para inicializar o tal campo com o valor zero (por exemplo). Mas, fora questão levantada pelo colega Mayron Cachina, duas considerações: 1) sobre este tipo de atribuição: qtda:=strtoint(edit1.Text); - havendo a possibilidade de a propriedade Text de seu edit conter um valor nulo (ou mesmo inválido - texto), o ideal é que você faça algum tratamento deste conteúdo antes de utilizá-lo em qualquer operação. Assim, você emite uma mensagem apropriada ao usuário e evita as "exceptions"; Pode também fazer uso da função StrToIntDef(num_texto, valor_default). 2) sobre este tipo de atribuição: qtdc:=strtoint(dbedit2.Text); - uma vez que seu DBEdit está vinculado a um campo (field) de um dataset (table ou query), seria mais apropriado e vantajoso acessar este campo e não a propriedade Text. Vamos supor que o nome do dataset em questão seja TabItens e que o nome do campo seja QTD. Se você adicionou os campos ao seu dataset em design-time, então você terá como acessar o campo diretamente através do componente TFieldInteger adicionado ao seu form e, neste caso, ele se chamaria TabItensQTD. Então, nenhuma conversão seria necessária, ou seja, sua linha de código: qtdc := strtoint(dbedit2.Text); passaria a ser escrita apenas assim: qtdc := TabItensQTD.Value Mas, se você não adicionou o campo em design-time, poderia ainda utilizar o método FieldByName para retornar um TField em run-time, referente ao seu campo no dataset. Neste caso, a linha de código ficaria: qtdc := TabItens.FieldByName('QTD').AsInteger Obs: utilizando o AsInteger, você está forçando a conversão do conteúdo do campo para um INTEGER, e caso o campo esteja NULO, ainda assim, seria retornado um ZERO. Já se utilizasse Value, estaria sujeito a exceptions já que neste caso, Value seria do tipo Variant Observe ainda, que utilizando o field, não haveria sequer a necessidade da declaração de variável auxiliar, já que você poderia utilizá-lo diretamente nas operações. Esta abordagem, ainda pode evitar algumas "dores de cabeça" com conversões como a comentada neste post. Abraços
  23. Bom, nem penso no uso do Vista por enquanto, mas para tentar lhe ajudar, coloquei na linha de busca do Google: "delphi 7" "windows Vista" Veja o que aparece no 1º resultado - Google: "delphi 7" "windows Vista" Boa sorte
  24. José Rodrigo, aconselho você a dar uma olhada em apostilas de SQL para evitar que erros como este aconteçam. Tem que se procurar saber com o que estamos lidando. Veja neste link qual é a sintax do comando SELECT. Observe que há uma seqüência para que as cláusulas apareçam. Veja que GROUP BY vai aparecer após a cláusula WHERE, entretanto você a colocou antes da mesma. Na seção de Apostilas Gratuitas, tem uma apostila que recomendo a quem não está acostumado com o tal SQL. Abraços
  25. Micheus

    Relatórios

    Como assim?Eu baixando ele tem lá dentro do zip: RelTeste.dpr, RelTeste.res, uMainForm.dfm, uMainForm.pas, uRelResumo.dfm, uRelResumo.pas e EMPLOYEE.FDB. Tenta baixar ele do 4Share (RelTeste.zip)
×
×
  • Criar Novo...