Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Erso, a palavra chave é Drag and Drop (arrastar e soltar).Dei uma olhada e achei um exemplo prontinho no Chami.com Tips: Let them drag and drop files on your program Abraços Motivo da Edição: Link do iMasters não era mais válido, sendo substituído pelo do Chami.com Tips - dica do colega Lugão
  2. Acrescentando um exemplo ao que o colega Erso já mencionou, você pode dar uma olhada neste post que utiliza basicamente a mesma idéia. Abraços
  3. Usar a propriedade Page->Columns do seu QuickRep não será uma boa para este caso (explicação neste post). Denis Courcy, você poderia ajudá-la a construir uma consulta onde as duas informações sejam fundidas, gerando colunas iguais mas acrescentando um campo indicativo Entrada/Saída? Isto simplificaria o processo de criação do relatório. Abraços
  4. Ele está especificamente na 12 coluna. :D O seu código completo está neste post - eu lembrei dele. Uma saída simplista (não a melhor) seria você deixar exatamente como está e acrescentar o teste após a leitura da UF. Uma vez testado, você cancela a inserção e volta ao início do while, caso não seja SC, ou continua e grava o resgistro: ... Table1.FieldByName('cidade_destino').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1); Delete(Entrada, 1, Pos(PathSep, Entrada)); Table1.FieldByName('uf_destino').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1); if Table1.FieldByName('uf_destino').Value <> 'SC' then Begin Table1.Cancel; // cancela inserção Continue; // volta para o While lá em cima End; Delete(Entrada, 1, Pos(PathSep, Entrada)); Table1.FieldByName('qtde_volume').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1); Delete(Entrada, 1, Pos(PathSep, Entrada)); ... Há uma outra possibilidade, mas agora não dá para exemplificar - tentarei postar mais tarde. ;) Abraços
  5. Micheus

    Consulta na TQuery

    Se você está importando a informação, então apenas remova os caracteres durante o processo - vai facilitar bastante sua vida. ;) Se for necessário manter a coluna importada como está, talvez fosse interessante criar uma nova coluna e por nelas os valores sem os caracteres não numéricos. Abraços
  6. João, e isto não está funcionando?Se não, por acaso o campo Tipo_fatura seria numérico? Se for faça um CAST e converta para VARCHAR: Nome +" "+CAST(Tipo_fatura as VARCHAR(2)) "Histórico da Movimentação" Com isto, você estará obtendo o resultado concatenado em sua consulta SQL, não tendo qualquer relação com o componente TDBGrid que apenas mostrará o resultado desta consulta. Abraços
  7. Micheus

    Do Delphi para Access

    Como disse o Jhonas, isto já é assunto específico sobre Access - e uma dúvida sua mesmo, já que diz não fazer idéia de como reaproveitar as informações (esta questão, só você poderá responder) Movendo para sessão Access... Abraços
  8. Micheus

    HORA e MINUTO

    procedure TForm1.Timer1Timer(Sender: TObject); begin label1.caption := FormatDateTime('hh:mm:ss',now); end; Apenas uma pequena correção: no lugar de mm use nn, do contrário será mostrado o número do Mês ao invés do Minuto.
  9. Carlo, basicamente você deverá "varrer" esta pasta estilo, e suas sub-pastas, e adicionar os nomes em seu listbox. Dê uma olhada neste tópico: Vários Arquivos Em Um Listbox - já deve servir de ponto de partida. Outros posts relacionados podem ser encontrados se pesquisar por FindFirst: ver resultados Abraços
  10. Carlos Rocha, experimente substituir este TQRExpr por um TQRSysData e, então, altere sua propriedade Data para qrsDetailCount. Isto deve servir. Abraços
  11. Micheus

    Consulta na TQuery

    Eder, este tipo de situação deveria ser evitado. Campos chave de relacionamento devem ser iguais. Esta questão de mostrar com formatação seria apenas uma questão de mascarar o resultado - pense na possibilidade de modificar isto futuramente. Voce deverá notar que isto vai prejudicar um pouco a performance da consulta. Quanto a uma possível solução, experimente desta forma: Select Dt_Emissao, Nr_ctrc, Pg_Cnpj, Cnpj_cpf, substring(Ctrc.Pg_Cnpj from 1 for 2)+substring(Ctrc.Pg_Cnpj from 4 for 3)+substring(Ctrc.Pg_Cnpj from 8 for 3)+substring(Ctrc.Pg_Cnpj from 12 for 4)+substring(Ctrc.Pg_Cnpj from 17 for 2) From Ctrc, Clientes Where substring(Ctrc.Pg_Cnpj from 1 for 2)+substring(Ctrc.Pg_Cnpj from 4 for 3)+substring(Ctrc.Pg_Cnpj from 8 for 3)+substring(Ctrc.Pg_Cnpj from 12 for 4)+substring(Ctrc.Pg_Cnpj from 17 for 2) = Clientes.Cnpj_Cpf Eu adicionei a "encrenca" lá no SELECT para que você possa acompanhar o resultado e ver que está ficando correto - depois você pode remover. Mas isto só deve funcionar se os dados estiverem formatados corretamente.
  12. Apesar do que eu sugeri como possibilidade de utilização do que o colega Jhonas lhe apresentou, na verdade não deveria deletar mesmo (como mencionei, no Windows não vai funcionar) - você precisará de algum outro artifício para isto. Talvez, adicionar a um arquivo de recursos um pequeno programa que delete o seu programa: - Voce testa a data, como já faz; - se venceu, extrai o pequeno programa para uma pasta temporária; - o coloca em execução e encerra o seu programa; este programa temporário, verifica que seu programa não está mais rodando e o exclui; Ele poderá ficar lá mesmo na pasta temporária, já que não terá qualquer utilidade. Abraços
  13. Marcio, acho que o que você precisa está neste outro tópico: Relatório Duplicado, Quick Report Abraços
  14. Renatosky, nestes dias acompanhando este tópico, havia lembrado de que o uso de BPL's poderia ser a possível solução, já que trata-se de um tipo especial de DLL criada pela Borland. Se você observar, as BPL's ao serem instaladas (no caso dos componentes visuais) interagem com a aplicação Delphi, sem qualquer efeito colateral. Pensando nisto, estava a procura de um artigo na Developer Network (Code Gear). O link está neste post da sessão links é este:Dynamic packages in Delphi . Então, tentei fazer uns testes antes de posta-lhe algo. O resultado foi positivo - tudo normal com os forms filhos. :D Mas, não consegui implementar o código utilizando a função GetClass como é sugerido lá, pois por algum motivo ela retorna NIL indicando que a classe da janela não tenha sido registrada na inicialização da BPL. Entretanto, tentei utilizar a função FindClass e, com ela, obtive a classe registrada (as duas basicamente fazem a mesma coisa). :blink: No meu exemplo, o form Child ficou com esta estrutura mínima: unit uChild1; ... var FrmChild1: TFrmChild1; implementation {$R *.dfm} procedure TFrmChild1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; initialization RegisterClass(TFrmChild1); finalization UnregisterClass(TFrmChild1); end. O form MDI principal, ficou assim: unit uMainForm; interface uses Windows, Messages, SysUtils, Classes, ... StdCtrls; type TMainForm = class(TForm) ... private PckChild1 :HModule; public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.FormCreate(Sender: TObject); begin PckChild1 := 0; end; procedure TMainForm.FormDestroy(Sender: TObject); begin if PckChild1 > 0 then UnloadPackage(PckChild1); end; procedure TMainForm.MDIChild11Click(Sender: TObject); var AClass: TPersistentClass; begin if PckChild1 = 0 then PckChild1 := LoadPackage('MDIChild02.bpl'); if PckChild1 > 0 then begin AClass := FindClass('TFrmChild1'); // este teste a seguir, nem seria necessário porque a // função FindClass gera uma exceção no caso de não // encontrar a classe que estamos procurando. // Ele é válido no caso de uso do GetClass if AClass <> nil then TComponentClass(AClass).Create(Application) else ShowMessage('Classe não foi encontrada!'); end else ShowMessage('Módulo não foi encontrado!'); end; end. Por fim, nas opções do projeto, como indica o artigo, deve-se habilitar na Packages, groupbox Runtime packages a opção Build with runtime packages e selecionar os pacotes a serem utilizados em run-time, no meu caso, foi apenas MDIChild02. Como as janelas filhas não são mostradas "Modais", optei por carregar a BPL no momento de criá-la, mas a descarga da BPL só poderá ocorrer ao sair do program ou quando tiver certeza de que fechou a janela filha. No exemplo isto fica bem claro, porque a janela utilizada não é MDIChild e ela é apresentada com ShoModal, de modo que ao ser fechada a BPL pode ser descarregada. Aparentement não houveram efeitos colaterais. É questão de implementar e testar mais. Abraços
  15. seria mais ou menos o que o TMaskEdit faz quando você informa uma máscara como: 99/99/0099;1;_;Onde o "9" representa que um número deve ser informado nesta posição, mas não é obrigatório. Porém, o "0" significa que um número deve ser informado e que é obrigatório, nesta posição. Vai ter que queimar umas pestanas, então. :D E não esqueça do que eu disse sobre o evento OnChange. Abraços
  16. Jhonatas araujo, é só combinar o que o Jhonas citou sobre arquivos de recursos com programação. Nunca passou por meus olhos, um componente que implementasse estas funcionalidades. Voce terá que criar o arquivo de recursos com tudo que precisar; Adicioná-lo ao seu projeto; Programar os eventos que deseja dispara um som (p.e., no OnEnter) e então carregar o respectivo recurso de sua aplicação e tocá-lo. Imagens, podem ser carregadas diretamente para um TImage via métodos LoadFromResourceName ou LoadFromResourceID. Para outros, acredito que não haja outro meio que não seja extraindo para um arquivo no disco (p.e. temporário). Abraços
  17. Isto não funciona tão bem quanto parece. Se eu tiver a instalação de um programa e após um tempo ele se auto-deletar, eu simplesmente o instalaria novamente e alteraria sua data antes de usá-lo (tem vários programinhas na net para esta finalidade) Eu não faço uso deste tipo de recurso, mas talvez o componente TmxProtector que mencionei neste post possa vir a servir como meio de proteção do software - dê uma olhada nos recursos que ele oferece. No Windows (o que não ocorre no Linux), quando o programa está em uso, não é possível excluí-lo! (ao menos, foi o que apurei há algum tempo, justamente tentando retirar esta dúvida) para funcionar corretamente, este teste deveria manter a verificação fazendo uso do "<=" (como postado inicialmente) e, ainda, não poderia avaliar a data no formato string. Observe o que ocorreria se tivéssemos as datas:Criação do arquivo: 23/2/2008 Data Atual: 13/3/2008 no teste do primeiro caracter das datas convertidas para string, "1" é menor que "2", logo já se passaram 19 dias e a data atual seria erroneamente considerada menor que a de criação. Devemos ter em mente que, em ordenação de datas no formato string, devemos formatá-la como yyyy/mm/dd para uma correta comparação. Também acrescentaria que seria mais interessante utilizar apenas a data, deixando de fora a parte correspondente à horas. Então, temos duas opções: if FormatDateTime('yyyy/mm/dd', data+ 60) <= FormatDateTime('yyyy/mm/dd', Date) then ou if Trunc(data+ 60) <= Trunc(Date) then Jhonas, eu lhe diria que é uma questão de tempo (ou melhor processamento). Aparentemente, o programa a ser executado via WinExec demora um pouquinho para ser "startado", dando a chance de o nosso programa encerrar e então ser excluído.Exagerando um pouquinho, faça você o seguinte teste: coloque um Sleep(1000) logo após o WinExec e antes do Close. Talvez uma alternativa seja executar este procedimento o mais próximo possível do encerramento do programa (ou antes mesmo de criar qualquer tela). Jhonatas araujo, experimente mover o código do Jhonas para o fonte (source) do projeto. Possivelmente você deverá acrescentar a cláusula uses as units: Windows, SysUtils e Classes. Ficaria algo assim: program Project1; uses Forms, Windows, SysUtils, Classes, unit1 in 'unit1.pas' {Form1}; {$R *.RES} var Data: TDateTime; Lista : TStringList; function DataDeCriacao(Arq: string): TDateTime; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin ... end; begin Data := DataDeCriacao(Application.ExeName); if Trunc(data+60) <= Trunc(Date) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); // Sleep(10); // usado o para teste end else begin // continua com programa normalmente Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; end. Na máquina em que testei, 10 milisegundos foi o tempo máximo que pude colocar para que a aplicação pudesse ser excluída. Logo, acredito que possa funcionar para você - experimente. Abraços
  18. Acho que dá para ser mais simples: RichEdit1.Lines.Clear; RichEdit1.Lines.LoadFromFile('c:\temp\Blackle.txt'); Abraços
  19. Jhonatas araujo, com certeza este teste dará erro já que você está comparando um string (Edit1.Text) com um número (2). O correto seria utilizar a função Length: if Length(Edit1.Text) <>2 then Isto resolveria o problema do erro, mas não o de lógica. Em teoria, a barra seria concatenada ao seu texto na posição 3 e 6: 99/99/9999 Fazer o auto-preenchimento irá requerer um pouco mais de cuidado: - o usuário pode digitar 1 número e a seguir a barra, logo, não dá apenas para testar o tamanho do texto porque estará com 2 e a concatenação de uma barra gerará algo como: 4// (uma barra extra). - a atribuição como posta (Edit1.Text := ...) não pode ser feita no evento OnChange do componente Edit1 sem alguns cuidados, já que esta atribuição (mudança ou change) irá gerar uma nova chamada ao evento (recursividade). Será necessário remover o tratador de evento antes da atribuição e restaurá-lo após - veja este post Você poderia utilizar os componentes para data como TDateTimePicker (paleta Win32) ou TDateEdit (paleta RX Control, se instalada). Sem falar no mais simples: TMaskEdit (paleta Aditional) Abraços
  20. Robinhocne, parece-me que quando você fala "dados dos clientes" está se referindo a "dados dos alunos", certo?! Primeiramente, você tem que lembrar que as informações tem que ter uma certa relação, não é mesmo?! Voce tem um consulta que retorna todos os alunos cadastrados em um período e uma outra que retorna todos os lançamentos gravados em seu banco de dados - sem qualquer restrição/relação com os alunos. :blink: Voce quer um relatório que mostre os dados dos alunos filtrados no período e que, para cada aluno, liste suas respectivas parcelas. Não é mesmo?! Se é (e acredito que deva ser), para cada aluno que tiver sua informação impressa, deverá ser feita a consulta nos lançamentos e localizadas suas parcelas. Como fazemos isto? Justamente utilizando o campo de relacionamento como filtro na cláusula WHERE da consulta nos lancamentos, é claro. Seguindo esta abordagem, o dataset origem dos dados de seu relatório deverá ser o que lista os alunos. Acredito que não apareceu nada em seu relatório, justamente porque você pode não ter inicializado a propriedade DataSet do QuickReport (acho que é este que você está utilizando). Este dataset, será origem dos dados apresentados na sua banda detalhe, enquanto que o dataset de lancamentos será a origem dos dados para a banda sub-detail (utilize a propriedade DataSet desta banda para "dizer" isto). Dicas: 1) na consulta por período de datas, dê preferência a utilizar between ao invés de ">=" e "<="; 2) na passagem de parâmetros, force o tipo de dados do parâmetro fazendo uso de As<tipo>; ... Sql.Add ('where DtCadastro between :d1 and :d2'); ParambyName('d1').AsDate := StrToDate (TxtDataInicial.Text); ParambyName('d2').AsDate := StrToDate (TxtDataFinal.Text); ... Veja se você avança um pouco mais.
  21. Aleksander, dá para utilizar a mesma imagem. Basta fazer um flip horizontal da mesma. O procedimento é o mesmo: ao atingir a margem direita ou esquerda é só inverter a imagem - veja como with Image1.Picture.Bitmap do Canvas.CopyRect(Canvas.ClipRect, Canvas, Rect(Width-1, 0, -1, Height)); O código é só este para as duas situações. Abraços
  22. Michaels :blink: Carlos, pressupondo que você adicionou em design-time a instrução SQL que seleciona os dados do cliente na propriedade SQL do componente QryClientes e como não sei exatamente o que lá tem, vou exemplificar apenas (não siga ao pé da letra). Acrescente à sua instrução SQL esta parte: SELECT .... WHERE MelhorDia = :Dia AND ReceberCasa = "SIM" ORDER BY .... depois no código, você inicializa o parâmetro Dia do modo como sempre aparece por aqui no forum: begin with frmRelatorio do begin // inicializamos o parâmetro QryClientes.ParamByName('Dia').AsInteger := Dia; // usar o Open aqui, caso você não o coloque na inicialização do relatório QryClientes.Open; // mostramos o relatório QuickRepListagem.PreviewModal; Free; end; Abraços
  23. A título de sugestão a todos que lêem este tópico, e procurando facilitar futuras pesquisas por outros colegas em busca de solução, eu sugeriria que quando as dúvidas forem de assuntos distintos que sejam postadas separadamente. ;) 1899-12-30 é a data quando o campo tipo DATE está nulo ou é 0 (zero), o que implica que esta atribuição não está sendo aplicada. É estranho que num segundo cadastro funcione, já que esta atribuição ocorrerá sempre após um Insert ou Append. Deve haver algum detalhe que você esteja esquecendo... Como disse o Jhonas, é só um aviso. E se você olhar bem para o código, você realmente não faz nada com elas. Até está atribuindo um valor a Dia, mas não a usa para mais nada, logo, o compilador lhe adverte (warning) para que você verifique de que é realmente isto que você quer. Esta questão do filtro, me parece estar sendo mau compreendida. Observem que a propriedade Filter é sobre-escrita a cada atribuição, logo, apenas a última será aplicada. Para aplicar mais que uma condição, seria necessário fazer a composição delas em uma única atribuição. Algo como: frmRelatorio.QryClientes.Filter := '(MelhorDia = ' + IntToStr(Dia) + ') AND (ReceberCasa = '+'''SIM'')'; Mas, se você está utilizando esta query apenas para o relatório (é o que parece), prefira fazer este filtro utilizando a cláusula WHERE da instrução SQL. Assim, você estará restringindo o resultado, retornando apenas os registros que satisfazem esta condição. Da forma como está, você busca muito mais registro e depois aplica um filtro em run-time sobre o resultado. O Filter é bastante útil quando você trabalha com componentes do tipo Table. Abraços
  24. Elói, em meios eletrônicos (posts, messengers,...) escrever em caixa alta significa gritar - este até poderia ser o contexto desta última frase. Espero que não. ;) Mas, a questão em si não me parece tão simples quanto você coloca. Ocorre que os SGBDs como MySQL (3306) ou Firebird/Interbase (3050) utilizam uma porta específica para ficarem "ouvindo" (listen) as requisições via socket. Outros aplicativos "ouvem" outras portas (alguns exemplos). Tentar estabelecer uma conexão com o banco por outra porta que não seja a que ele esteja "ouvindo", resultará em erro. e pelo que já mencionei, não deveria mesmo. você muda a porta padrão, desde que não conflite com outra em uso. o localhost (127.0.0.1) que você está utilizando refere-se a conexão em sua própria máquina onde, muito provavelmente, encontra-se instalado o servidor do banco. Mudar para outra coisa, é meio relativo. No acesso via socket, ou você vai usar o nome da máquina (ex., localhost) ou o endereço IP (ex. 127.0.0.1).Se você for tentar usar seu programa em outra máquina, em uma rede, não poderá utilizar o localhost na conexão, pois implica que o servidor do banco esteja instado no mesmo local em que o programa "roda". Não posso afirmar que minhas colocações estejam 100% corretas, mas são baseadas no pouco que penso conhecer. Vamos ver mais alguém nos auxiliar. Abraços
  25. se não ficou legal por conta do "pisca-pisca", quem sabe essa dica do Churc lhe ajude. Abraços
×
×
  • Criar Novo...