Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Que eu saiba não. Espero que mais alguém se manifeste a respeito. Mas já que parece ser algo mais complexo do que eu imaginava (envolve desmembrar vários processos), acho que seria interessante você avaliar este artigo: E se fosse modularizado? (ref. ActiveDelphi) Trata da modularização utilizando não DLLs, mas BPLs (que é basicamente uma DLL, mas com características introduzidas pela Borland). Eu acredito que as BPLs também sejam removidas da memória junto com a aplicação principal - é questão de testar. ;) Mas modularizar o projeto é algo que traz algumas vantagens. O Exe fica mais enxuto, a manutenção por vezes mais simples, a atualização pode ser feita apenas no módulo alterado (não todo o programa), pode ser carregados apenas os módulos em uso. E por aí vai... Procurei e achei mais estas outras citadas neste artigo: http://pjtsalina.codigolivre.org.br/pr/clu...hi/package.html Abraços
  2. É eu sei disso. Não era a isso que me referia. Talvez não tenha me expressado bem, já que a grande maioria dos que trabalham com PARADOX o tratam como um Banco de Dados. Mas, supondo que você realmente esteja trabalhando com tabelas PARADOX, o que fica ainda mais claro vendo a mensagem de erro (onde dá para notar que a propriedade DriveName seu TDataBase deve estar configurado para STANDARD, ou que o ALIAS em uso na propriedade DataBasename está assim configurado), sugiro que você tente fazer a alteração que propus: Bem vindo ao PARADOX (*.DB), DBASE e CLIPPER (*.DBF), ... então, faça o que eu disse antes: retire as aspas ou acrescente a extensão. Para não ficar dúvida:- Select SUM(Valor) from Tblancamento where Data between ... - ou, Select SUM(Valor) from "Tblancamento.db" where Data between ... Abraços
  3. Então eu não consigo entender o que você disse no poste anterior :unsure: Na pior das hipóteses, retire as àspas duplas. Elas podem estar confundindo o drive que tenta encontra apenas Tblancamento, quando deveria procurar por Tblancamento.db (é provável que seja isto. Se quiser manter as àspas (e não são necessárias), então inclua a extensão do arquivo. Mas não é uma boa abordagem, porque em muitos bancos você vai usar apenas o nome da tabela no banco - não existe extensão. ;) Abraços
  4. Micheus

    Relatórios Delphi

    apesar de não saber se será possível ajudar, seria interessante que você colocasse aqui o nome desta ferramenta. A ação de criar o menu, deveria ser um recurso oferecido por sua ferramenta. Ela não oferece isto?O fato de aceitar programação pascal, não necessariamente significa que a ferramenta lhe disponibilizará todos os recursos que temos ao utilizar um compilador pascal. Seria interessante averiguar na documentação o que é suportado. A estensão .frm, para relatórios, é comumente utilizado pelo Report Buider. Abraços
  5. TicoO, é um problema de interpretação seu. Ele está correto! Qualquer comando SQL só pode ser realizado sobre as tabelas do banco. Eles não sabem nada sobre componentes externos. Se você quer somar o que aparece em Tblancamento, então você tem que colocar o nome da tabela a que este componente se refere. Caso você faça algum tipo de filtro nele, você terá que filtrar também a sua consulta SQL utilizando a cláusula WHERE. Abraços
  6. nesta consulta tem um campo a mais no SELECT - vd_data. Se a totalização é por vendedor, você não pode incluir algo que vá interferir neste agrupamento - gerando várias linhas para um mesmo vendedor. Resumindo, eu consegui fazer as duas primeiras selects, tentei baixar o exemplo para verificar, mas ele parece em formato .fdb, aí eu não consegui abrí-lo Como eu disse, o exemplo foi feito para INTERBASE/FIREBIRD, mas o conceito seria exatamente o mesmo. Quanto a SALES_REP_<MES_NOME> e <DATA_INICIAL>, o objetivo desta consulta é trazer todas as vendas do <MES> e ano (EXTRACT(YEAR FROM <DAT_INICIAL>)) onde <DATA_INICIAL> seria data do período informado - neste caso havia sido de janeiro a dezembro de determinado ano. Voce parou logo início da explicação. Sugiro que você tente acompanhar ela do início ao fim, para depois ir tentando implementar, porque esta parte inicial é basicamente conceitual - na sequencia eu tento explicar como será traduzida para código final. Se você continuar lendo SALES_REP_<MES_NOME>, você verá que este é apenas uma definição do padrão de nome que irei utilizar na sequencia. Posterior mente as colunas de valores serão renomeadas (aliases criados com o uso de AS) para representar uma coluna para cada mês totalizado. Abraços
  7. Como você já configurou sua transação para read_commited, eu acredito que você não devesse estar tento o problema descrito, mas você poderia fazer um teste, modificando os parâmetros de inicialização da sua transação para uma seqüência customizada. Voce deve ter observado que quando você selecionou read_commited, apareceu no memo ao lado:read_committed rec_version nowait eu lhe sugeriria que você acrescentasse ali outros dois parâmetros, ficando assim: read write read_committed rec_version nowait Teste para ver se resolve seu problema.
  8. Veja este exemplo, que é um esqueleto apenas didático para observar como as coisas ocorrem. Os executáveis estão anexos, então teste eles e confira o código depois. Na aplicação Pai: 1) Há dois botões para carregar/"descarregar" uma aplicação filha tipo EXE. Observe que mesmo que você clique no X da aplicação pai, nós estaremos fechando a filha via evento OnClose. Se você matar a aplicação pai via gerenciador de tarefas, a aplicação filha fica rodando; 2) Há dois botões para carregar/"descarregar" uma aplicação filha tipo DLL. Observe, agora, que clicando no X da aplicação pai, o sistema descarregará a dll filha, mas de forma normal, gerando qualquer evento que a DLL possa processar. Se você matar a aplicação pai via gerenciador de tarefas, a DLL filha é descarregada, mas não será gerado qualquer evento; Abraços Aplicacao_Pai_e_Filha.zip
  9. é acho que tem um "gato" mesmo. Sem querer mexer no seu código, str1 ficou declarado como um ponteiro e o strncpy vai copiar os bytes entrados em texto, sem que haja memória reservada para isso. :blush: A menos que você precise utilizar str1 como ponteiro, você poderia delcará-lo do mesmo tipo que texto, e trocamos a função para strcpy: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <conio.h> int main(int args, char * arg[]) { int i,j,n; char optei; char texto[30]; char str[30]; char *str; str=texto; do { system("CLS"); printf("Entre com o texto a ser codificado:\n"); for (i=0; i<30; i++) { scanf("%c",&texto[i]); if (texto[i] == '.') break; } strcpy(str1,str); n = i; printf("Texto com %d caracteres.\n", n); for (i = 0; i<n; i++) texto[i] = (5*texto[i] + 100) % 256; printf("Texto codificado:\n"); for (i=0;i<n;i++) printf("%c",texto[i]); printf("\n"); printf("Texto decodificado:\n"); printf((char *) str); printf("\n\n"); printf("Continua? (S/N): "); optei = toupper(getche()); } while (optei == 'S'); printf("\n"); system("PAUSE"); return 0; }veja se ficou ok agora. Existem codificações são irreversíveis (normalmente as que envolve deslocamento de bits). No seu caso, basta "desfazer" o que foi feito. Para entender, veja o caso da letra 'A' (65 ou &41), aplicando a sua fórmula:5*65=325 205+100=425 305%256=169 para desfazer, seguimos do final para o início, todo o processo: 169+256=425 425-100=205 325/5=65 voce pode pesquisar por criptografia. Veja este link CIFRAS DE SUBSTITUIÇÃO - Criptologia Abraços
  10. kartter, dê uma olhada em como está definida a configuração do seu componente IBTransaction. Veja este post.Pode estar relacionado a esta configuração. Confira e dê um retorno. Abraços
  11. por acaso, durante este processo em operação, você não estaria colocando alguma coisa na área de transferência - tipo recortando um texto? De qualquer modo, acho mais seguro não utilizar o clipboard. Dê uma olhada neste código (ref. About .com). É mais seguro. quanto a esta parte do código: DecodeDate(now,ano,mes,dia); DecodeTime(now,hora,min,seg,mseg); jpeg.SaveToFile(ExtractFilePath(Application.ExeName) + inttostr(dia) + '.' + inttostr(mes) + '.' + inttostr(ano) + '.' + inttostr(hora) + '.' + inttostr(min) + '.' + inttostr(seg) + '.jpg'); dê uma simplificada nele, use a função FormatDateTime: jpeg.SaveToFile(ExtractFilePath(Application.ExeName) + FormatDateTime('dd.mm.yyyy.hh.nn.ss', now) + '.jpg'); Abraços
  12. João Paulo, dê uma olhada neste tópico em Tutoriais & Dicas - Construindo Uma Consulta Sql Passo-a-passo, Obtendo uma matriz como resultado É uma explicação passo-a-passo de como fazer este tipo de consulta. O exemplo foi desenvolvido em INTERBASE, mas o conceito envolvido é exatamente o mesmo - uso de sub-selects. Veja se você consegue compreender. Depois podemos ir aparando as arestas. Abraços
  13. Não foi isto que eu perguntei. :huh: Eu perguntei se este processo filho poderia ser uma DLL ao invés de outra aplicação (.exe) É como eu disse, não há qualquer notificação (envio de mensagem) quando o encerramento é feito via gerenciador de tarefa. A aplicação simplesmente é removida da memória. Mas, se você utilizar o segundo processo em uma DLL, e carregá-la em sua aplicação, ela será removida da memória juntamente com sua aplicação. Ou seja, as duas "morrem". Abraços
  14. Maria, se são realmente textos puros, você poderia fazer uso da classe TStringList para isso. Seria mais ou menos assim (não testei): var SR: TSearchRec; TxtLines, TxtFinal :TStringList; NomeArquivo :String; begin // Dir deve ser substituído pelo diretório a pesquisar if FindFirst(Dir+'\*.txt', faArchive, SR) = 0 then begin TxtLines := TStringList.Create; TxtFinal := TStringList.Create; try repeat TxtLines.LoadFromFile(SR.Name); // adiciona conteúdo lido ao final da // lista de concatenação TxtFinal.AddStrings(TxtLines) until FindNext(SR) <> 0; FindClose(SR); // grava arquivos concatenados TxtFinal.SaveToFile('Arquivos Contatenados.txt'); finally TxtLines.Free; TxtFinal.Free; end; end; end; Abraços
  15. mauricio, baseado na mensagem/situação que você postou encontrei algumas opções (ref. MyWay) 450: Recipient address rejected: Domain not found (domínio não encontrado) 500: Recipient address rejected: Recipient mailbox is full (caixa de mensagens cheia) 540: < email@domain.com >: Recipient address rejected: Your email has been returned because the intended recipient's email account has been suspended. The account must be re-activated to receive incoming messages. (teria sido retornado porque a conta estaria suspensa) mas, por citar eidProtocolReplyError, olhando nos fontes do Indy, tem o seguinte comentário para esta classe de erro: // This exception is for protocol errors such as 404 HTTP error and also // SendCmd / GetResponse Ou você não colocou ou a exception não mostra, mas tem um código de erro retornado que talvez possa dizer algo mais. É acessível através da propriedade ReplyErrorCode Este provedor vivax, permite acesso smtp/pop?
  16. Acho que vai ser difícil de o 4njo responder, pelo que consta no perfil dele, a sua última atividade foir em 30/Jun/2007. :mellow: então, faça o seguinte, apenas acrescente o nome a unit jpeg à cláusula Uses do seu da unit do form em que você vai utilizá-la: unit uFrmCadstro; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ..., jpeg; ... Abraços
  17. Micheus

    between com datas

    serginho_pv, observe como a sua string está ficando... Ela contém as aspas na data. Não é para ter. Observe como eu havia dito que a consulta deveria ficar: Como eu disse, o # é o delimitador de datas - não aspas. Abraços
  18. Cinthia, eu reforço a pergunta do colega rafhael_suporte. Pelo menos, com a estrutura que você apresentou. 1º) na estrutura CASE é obrigatório que haja uma expressão/variável a ser a ser avaliada (case selectorExpression of). Logo, não dá para por apenas um CASE e mais nada; 2º) a lista de itens a serem "comparados", devem ser valores staticos. Ou seja, variáveis e a maioria das funções não podem ser utilizadas ali; O único modo de implementar algo parecido com o que você quer utilizando case, seria algo mais ou menos assim: ... case (a>b) and (a>c) of True : Label1.Caption := 'o primeiro é maior!'; else case (b>a) and (b>c) of True : Label1.Caption := 'o segundo é maior!'; False : Label1.Caption := 'o terceiro é maior!'; end; end; Abraços
  19. Otávio, foi mau. :blush: Eu acabei interpretando errado seu problema. Eu sei desse lance de overload. É que como você não colocou a mensagem original, eu acabei me precipitando e achando que você estava usando um compilador C (não é bem a minha área, mas que saiba overload só no C++). Daí olhando melhor sua mesagem agora parece-me que seja apenas uma questão de indicar corretamente o caminho do seu header.Então, é questão de você incluir, nas configurações do compilador, o caminho onde está localizado o seu header. Ou copiá-lo para a pasta padrão dos heades (include). Ou, ainda, indicar o caminho relativo a pasta include. Por ex., supondo esta estrutura de diretórios: <instalação do C++>\include <instalação do C++>\projetos\teste (pasta dos meus projetos) daí, no fonte, a inclusão do reader ficaria assim: #include <stdio.h> #include <..\projetos\teste\testes.h> ...
  20. Eder, não falta nada, aliás nem precisa das duas units que você acrescentou.O que ocorre é que você utilizou QRPrint ao invés de QRPrinter. ;) Pode alterar que o relatório será lido perfeitamente em "widescreen" (landscape) Abraços
  21. Só para comentar... Depende do que você pretendo atualizar.Se for mudança na estrutura de dados do banco (novas tabelas, campos, ...), isto não deverá interferir com os dados do cliente, a menos que você esteja removendo tabelas ou colunas. Se for alteração dos dados, algum tipo de script com instruções UPDATE, o mais aconselhável é que, se você vai mexer nos valores de determinada coluna, você deve utilizar da cláusula WHERE para alterar as informações de acordo com o que deve ser. Por ex., se você for inicializar uma coluna que estava inicialmente ficando com alguns valores nulos, mas você não quer que isto ocorra mais. Então, você corrige isto no seu programa (evitando que os novos registros fiquem nulos) e executa uma instrução de UPDATE na tabela, setando o valor desta coluna, mas apenas para as que forem = NULL. Este cuidado, também é muito importante quando utilizada a instrução DELETE. Quanto a forma de fazer isto, sem complicar muito, eu citaria duas possibilidades (haveriam outras): - implementar dentro do seu programa, a execução destas instruções SQL para serem executadas ao clicar de um botão - por exemplo. Mas terá que fazer os devidos tratamentos de erros, visto que se executado um segunda vez, ocorrerão exceções; (é o que você está implementando) - (especificamente na sua cituação) instalar a ferramente IBExpert no cliente e utilizá-la para aplicar as correções. Uma vez que você a utilize para fazer as modificações na sua base de dado (de desenvolvimento), você teria como copiar os scripts de alterações, guardá-los em um arquivo para depois se utilizado no IBExpert de seu cliente. Acho esta última forma a mais simples. É questão de explorar os recursos da ferramenta. ;) Abraços
  22. slinkkkk, acho que a coisa deveria funcionar deste modo (se entendi o que você pretende):para você saber, no servidor, quem enviou a mensagem (comando, ou que quer que venha pelo socket) você deverá montar uma estrutura de dados de tal modo, que quando uma conexão for estabelecida, você guarde uma referência ao usuário conectado. A partir daí, você já teria condições de saber a origem da informação (no seu caso o jogador). Mas indiferente disto, se você pretende trocar informações, onde nelas estão contidos vários campos, você deve precisa implementar algo como o que já citei em outro tópico: Você pode encontrar algumas informações a este respeito neste outro tópico Comunicação entre PCs em uma rede (tem um exemplo no post#7) Dê uma olha e veja se lhe clareia as idéias. Qualquer coisa, é só perguntar. ;) Abraços
  23. Tatiane, que ferramenta você utilizou para criar as tabelas no seu banco de dados? Voce faz uso do IBExpert?Quanto a solução utilizada, também é válida, mas fazendo uso adequado dos componentes, você precisa programar menos e ter menos pontos de manutenção. ;) Eu lhe aconselharia a, antes que avance muito no seu sistema com tantas "gambiarras", tentar resolver o problema - vai lhe poupar muito trabalho futuro e manter seu código mais enxuto e, diga-se de passagem, mais profissional. Se for uma questão de instalação do banco, e como supostamente você já tentou reinstalá-lo - sem resolver o problema, talvez valesse a pena você pensar em utilizar o FireBird. Uma vez que você utiliza os componentes da paleta IB, não terá qualquer problema com o código, a não ser, apenas, com relação a retirada dos campos "enjambrados" (readicionando os corretos) e removendo as "papagaiadas". Eu acredito que isso vala à pena! Abraços
  24. O problema deve ser porque as duas tem o mesmo nome (há uma redefinição). se você alterar no header e no programa para: float cube_number_f(float num); int cube_number_i(int num); o erro deve sumir.
  25. que eu me lebre, basta que você adicione 128 ($80 em hexa) ao valor da cor do texto que você quer setar. tipo: Yellow +128 ou 12+128 ...
×
×
  • Criar Novo...