Jump to content
Fórum Script Brasil

Micheus

Veteranos
  • Content Count

    3209
  • Joined

  • Last visited

Everything posted by Micheus

  1. Obrigado Jonas. Vou dar uma lida mais a fundo naquele site. Talvez eu tenha que mudar o tipo de encriptação que uso na versão desktop para poder usar aquele recurso de verificação da validade da senha. Em um primeiro teste eu não obtive resultados.
  2. Olá pessoal. Faz tempo que não dou as caras por aqui. :) Volto hoje com uma dúvida. Já há algum tempo meu programa desktop armazena a senha encripitada utilizando o componente TLbSHA1 TurboPower LockBox (LockBox 2). Só que recentemente eu estou fazendo uma pequena implementação em PHP onde utilizo a função sha1 para codificar a senha de entrada, porém ela nunca é igual àquela que foi armazenada via app desktop. já tentei utilizar outro código de emcriptação no Delphi (Crypt.SHA1.pas), mas segue com o mesmo problema. Assim, minha pergunta é: tem alguém aqui que utiliza ou já utilizou desta combinação (BD acessado via Delphi e PHP) incluindo a criptografia sha1 e teve sucesso na validação por ambas as aplicações? Se sim, o que é que eu estaria deixando de fazer o como deveria proceder para resolver este problema? Grato pela atenção Micheus
  3. Para indicar uma porta de acesso em determinado endereço você a acrescenta dois pontos [:] seguido do número da porta. 127.0.0.1:80 Observe que este endereço (127...) diz respeito ao "identificador" localhost - ou seja a própria máquina. Qualquer browser que receba este endereço tentará estabelecer uma conexão com a máquina onde ele esteja sendo executado. Assim, se de um computador você quizer acessar o aplicativo que está em outro, você terá que informar o endereço IP (ou identificação) deste servidor na rede. Talvez você tenha implementado sua aplicação em um dos formatos que embute o servidor na aplicação (Stand Alone Server), conforme pude observar na explicação Mini-Curso / Video-Aula de IntraWeb - a partir dos 14:45s (Recomendo assistir)
  4. Meu conhecimento nesta área é minúsculo, mas considerando que você tem acesso ao servidor, perguntaria se não seria possível fazer uso de "aliases" (apelidos). No IIS voce utilizaria os tais diretórios virtuais: Usando diretórios virtuais ou Criando um diretório Virtual com o IIS No Apache voce utiliza o alias: Alias no Apache (ou Apache Module mod_alias) Seu celular poderia sempre acessar a aplicação via http://servidor/alias
  5. anabon, código é específico do banco de dados. Talvez o mais relevante aqui fosse voce postar o código Delphi para executar estas instruções no banco. Se for um erro relacionado ao Delphi, será aí que vamos poder ajudar.
  6. Experimente utilizar o tratamento de exceção da forma apropriada para este caso: ... with dm.ZC do begin ... try Connected:=True; except ShowMessage('Erro de conexão'); end; end; end; Quando você utilizar o finally, o bloco de código dentro dele é executado havendo ou não uma exceção. Já quando você usa o except, o bloco de dados dentro dele será executado apenas quando ocorre a exceção. Nesta condição, quando você estiver depurando o código, pode até ser que a mensagem de exceção do banco seja apresentada, seguida pela sua. Mas executando fora do ambiente de desenvolvimento (o executável gerado) voce deve observar apenas a mensagem que voce programou. Faz tempo que não programo Delphi, então, dê uma testada para ver se é isto mesmo. :)
  7. Consegui alguns comentários também no forum do Lazarus (Wrong character displayed) Uma solução que resolve meu problema facilmente (não definitivamente) foi a sugestão de mudar na conexão do banco o parâmetro lc_ctype de WIN1252 para UTF8. (este post) Funcionou imediatamente. Questionei sobre algum efeito colateral, já que o banco ainda está configurado para WIN1252 e, segundo outro usuário, a possibilidade existe se eu usar algum caracter que não esteja no conjunto UTF8. Bom, consideranda a aplicação atual, só mesmo os caracteres "comuns" entre os dois estão sendo utilizados. Isto vai me dar um bom tempo para pensar em como fazer a bendita migração. Abraços
  8. Obrigado pelas respostas. É... Parece que não tem jeito mesmo. Mas acho uma baita sacanagem, considerando que a ferramenta se propõe a ser uma alternativa ao Delphi, no mímino deveria permitir algum tipo de compatibilidade. Depois que eu tiver conseguido resover este problema eu posto os procedimentos aqui - para o caso de mais alguém precisar.
  9. Olá Jhonas Voce está me dizendo que vou ter que mudar todos os char set e collate no meu banco de dados? Que bucha! :angry:
  10. Olá pessoal, Estou convertendo um antigo projeto do Delphi 7 para o Lazarus. Do ponto de vista do código e telas os problemas tem sido contonados. Meu problema diz respeito à visualizão de informações cadastradas em um banco de dados. Como voces podem observar na figura, os caracteres acentuados são suprimidos ou substituídos por "?". Algum de voces saberia como contornar este problema?
  11. Afinal, quem está chamando quem?É uma tela com DBGrid que você chama outra tela para editar os dados deste com DBGrid; ou é uma tela de cadastro em que você chama outra tela com o DBGrid para selecionar alguma informação? Entenda, a atribuição ModalResult := mrOk fará com seu form feche - só isto.
  12. É uma pena. :blush: Sugiro que dê uma procurada em componentes com o código fonte, de forma que você possa compilá-lo na sua versão de Delphi. Dê uma olhada neste que encontrei - link
  13. É isto mesmo robinhocne. Setar o valor para ModalResult (seja, mrOk ou mrCancel) faz com que o loop de processamento da janela seja encerrado e com isto a janela é fechada. Não daria erro mesmo. Mas, a propósito, os blocos try...except...finally tem a finalidade de tratar excessões (ou os erros/falhas). O finally será sempre executado ocorra ou não uma exceção. O bloco que você codificou não está coerente. Se voce deseja validar uma terminação normal do seu formulário (verificando o valor de ModalResult), com certeza não deveria utilizar o finally para isto. A aplicação mais comum para ele é liberar qualquer memória que tenha sido alocada ou desfazer alguma ação realizada anteriormente ao procedimento que possa causar uma falha. No seu caso, o finally poderia (deveria) ser utilizado para remover o formulário que você criou no with...do: procedure Tfrmcontas_apagar.cmdeditarClick(Sender: TObject); begin with Tfrmeditar_apagar.Create(Self) do begin try ShowModal; if ModalResult = mrOk then begin if not(Table_APagar.State in [dsInsert, dsEdit]) then Table_APagar.Edit; frmeditar_apagar.txtnro_doc.text := Table_APagar.FieldbyName('nro_documento').AsString; //Table_Entregador.FieldByName('Placa').AsString := Table_Veiculo.FieldByName('Placa').AsString; end; finally Free; end; end; end; É muito útil (e até importante) o tratamento de exceções, porém temos que estar cientes de como aplicá-lo. ;)
  14. danielrgoes, isso vai ficar difícil de eu responder - eu não tenho mais o Delphi instalado para poder testar por aqui. Mas, voce já experimentou fazer a alteração no arquivo WebCamMainForm.pas que um cara sugeriu lá: // introducing the RGB array and a buffer TVideoArray = array[1..PICHEIGHT] of array[1..PICWIDTH] of TRGBTriple; PVideoArray = ^TVideoArray; TForm1 = class(TForm) [...] FBuf24_1: TVideoArray; [...] function FrameCallbackFunction(AHandle: hWnd; VIDEOHDR: TVideoHDRPtr): bool; stdcall; var I: integer; begin result:= true; with form1 do begin try if ConvertCodecToRGB(FCodec, VideoHDR^.lpData, @FBuf2, PICWIDTH, PICHEIGHT) then begin for I:= 1 to PICHEIGHT do FBuf1[I]:= FBuf2[PICHEIGHT- (I- 1)]; SetBitmapBits(FBitmap.Handle, PICWIDTH* PICHEIGHT* SizeOf(DWord), @FBuf1); end else begin // assume RGB for I:= 1 to PICHEIGHT do FBuf24_1[I] := PVideoArray(VideoHDR^.lpData)^[PICHEIGHT-I+1]; SetBitmapBits(FBitmap.Handle, PICWIDTH* PICHEIGHT* SizeOf(RGBTriple), @FBuf24_1); end; [...] Ainda, a título de teste, se a tal alteração não mudar nada, voce poderia modificar a callback (FrameCallbackFunction) grando o bitmap original (lá ele é convertido para jpg): ... FBitmap.Canvas.Font.Color:= clRed; FBitmap.SaveToFile('c:\webcam.bmp'); // <<==== AQUI FJpeg.Assign(FBitmap); FJpeg.CompressionQuality:= 85; FJpeg.ProgressiveEncoding:= true; FJpeg.SaveToFile('c:\webcam.jpg'); ...
  15. Tá bom, eu compliquei. Baixa o Zip que tem no link lá no início onde aparece: "a zip file is available here"
  16. Voce chegou a testar este: Getting a snapshot from a webcam with Delphi ? O exemplo está em uma pergunta em um forum, referente ao fato de o cara não usar uma câmera real (sim uma simulada), mas o código deve funcionar. Eu já o utilizei há algum tempo com o D7 e pelo que consta na 2ª resposta que deram a ele, o programa funciona no Win7 com Delphi 2010, fazendo apenas alguns ajustes (colocados lá) - acredito que você seja capaz de entendê-lo e adaptá-lo. A vantagem seria o fato de ele não utilizar componentes. Observe que estão todos os códigos fonte em sequência. Voce deve separá-los e adaptar o código fonte do seu form de acordo com o que ele usou no dele (WebCamMainForm).
  17. Para o Delphi 7 e anteriores basicamente são estes os significados. Em negrito, o que é indispensável ser mantido: .dcu (Delphi Compiled Unit) -> este é gerado a cada compilação;.ddp (Delphi Diagram Portifolio) -> não sei afirmar nada a respeito;.dfm (Delphi Form file ) -> contém o layout - dados do seu form;.pas -> É o código fonte.dpr (Delphi Project) -> é o arquivo do projeto, responsável pela obtenção do executável.res (Resource file) -> é o arquivo de recursos. É onde costumam ficar icones, bitmaps - o que você adiconar a ele.para as versões mais recentes do Delphi existem mais extensões. Há uma lista neste link (Delphi File Extensions), indicando quais devem ser mantidos ou não.
  18. Sem dúvidas. Se voce realmente precisa processar as linhas deste jeito mesmo, então este seria o exemplo. var SomeTxtFile : TextFile; buffer : string; begin AssignFile(SomeTxtFile, 'c:\arquivo.txt'); // aqui você vincula o nome à variável do tipo textfile Reset(SomeTxtFile); // aqui estamos abrindo para leitura apenas while not Eof(SomeTxtFile) do begin ReadLn(SomeTxtFile, buffer); // lendo uma linha inteira - até o &13&10 (aquele "Ln" diz isto) end; CloseFile(SomeTxtFile); // fechando o arquivo end; Se não me engano estas funções estão na unit SysUtils. Caso tenha erro de compilação, verifique se ela está na cláusula "uses". Se estiver e ainda assim as procedures não forem reconhecidas, então estou errado e você deve acionar o help para descobrir onde encontrá-las - tarefa fácil, apenas posicione o cursor no meio do nome da função e acionde Ctrl+F1. Há outras funções para manipular arquivos, mas acredito que este conjunto lhe sirva, já que é o mais parecido com o que você está acostumado a trabalhar. Dica: Se voce não tem problemas em ler em Inglês, use muito o Help - O Delphi tem um help muito completo, bem documentado e com fraguimentos de código exemplo. (aprendi Delphi usando o Help, não livros)
  19. Com certeza uma "gambiarra". A pior opção que podemos fazer é utilizar as tabelas de sistema do banco (rdb$...), pois deixamos a aplicação amarrada a determinado banco de dados e porque nunca podemos ter certeza de que o "dono" do banco não mudará a estrutura interna de dados do mesmo.
  20. Samara, o colega vms não deseja saber em qual registro esle "se encontra". Em tabelas como Parados existe um tipo de campo(field) chamado de AutoInc. São campos que a cada novo registro recebem um novo número, sequencial, e que nunca se repetirá. Estes campos são gerenciados pelo driver do paradox, de modo que quando você grava o registro (post) o seu dataset estará paradinho no registro recém salvo e voce poderá obter o valor que este campo recebeu do "banco" (paradox não é exatamente um bando de dados - na minha opinião). Nesta condição, se voce colocar este dataset em um DBGrid (mostrando este tal campo) e usar o seu código, voce observará que são coisas diferentes. RecNo representa o número do registro sequindo a ordem em que ele se encontra no dataset. Assim, se voce mudar o índice (tabela) ou ordenação (query), voce provavelmente notará que um registro com RecNo = 10 é diferente para cada ordenação. O que o colega vms quer é obter do banco de dados (Firebird), o valor daquele campo "autoinc", que no firebird é obtido através da definição de um Generator e sua utilização através de uma trigger (exemplo). Este valor está no domínio do banco de dados e não é retornado quando o post/applayupdates é utilizado. Uma alternativa a isto é não utilizar o generator e sim gerar o código ("manualmente" usando um select max(campo)+1) dentro do programa no momento imediatamente antes da gravação no banco. O problema com isto é que para tabelas com muitos acessos, pode ocorrer de mais que um usuário obter o mesmo número (código sequencial) e na hora de comitar os dados o banco rejeite aqueles que ficariam duplicados. Quando usamos o generate, o próprio banco usa seus mecanimos para retornar apenas um código de cada vez, sem qualquer possibilidade de duplicação. Espero ter ajudado a exclarecer a diferença entre os itens citados.
  21. É, esta é (digamos assim) uma desvantagem de gerar o Id pela trigger - voce não tem como saber diretamente qual foi o valor gerado. Voce poderia usar uma combinação de alguns campos (que voce acabou de cadastrar) para identificá-lo. Se não me engano, há alguns anos, enquanto eu monitorava as atividades em um banco de dados (utilizando o SQL Monitor que acompanha o D7), era este o procedimento que os drivers do BDE utilizavam para encontrar o registro após sua inserção (na verdade, ele usava na cláusula where todos os campos ainda no cache). Ou talvez voce possa querer testar esta alternativa (nunca testei): Auto Incremento: Firebird
  22. só para confirmar, o QRGroup1 deve ter as propriedades Expression contendo o campo de quebra do dataset (CodCli) e a propriedade FooterBand apontando para a QRBand que você definiu para rbGroupFooter.No QRExp além de configurar a Expression e setar ResetAfterPrint = True. Estamos chegando naquele ponto em que eu não vendo o seu código, não consigo depurá-lo. A lógica é esta ai que discutimos aqui. que traz o numero da parcela, é um campo numeric, coloquei ele e o CodCli como order by também, ai deu certo.Ficou então order by A.CodCli, A.NomCli, A.NumParc Se voce quer que a listagem seja ordenada pelo nome do cliente, então aquele CodCli não deve ser colocado. No caso de voce querer ordenar pelo CodCli mesmo, então retire NomCli porque ele torna-se redundante e também, pelo fato de que se a sua tabela tiver um índice contendo os campos CodCli + NunParc, este índice será utilizado na ordenação agilizando-a.
  23. Não, não deve dar erro. Procure algum material sobre SQL para você aprender mais sobre as consultas - é importante que você procure conhecer a respeito. Isto facilitará muito a voce e a alguém que tente lhe ajudar. ;) Boa sorte.
  24. Pela imagem daquele relelatório inicial, parece que este campo é string e não numérico. Sendo string, dependendo como está o texto isto poderia acontecer. Vai ficar de eu avaliar isto daqui. Eventualmente, voce não poderia utilizar a data? Em teoria, a ordem de vencimento é a orde das parcelas - crescente
  25. A banda sumário, é como diz o nome: sumariza/totaliza tudo! Ou seja, soma todos os registros que ele mostrar na banda detalhe. Isto que voce quer está claramente relacionado à quebra do cabeçalho, não é mesmo. Vinculada à uma GroupBand voce terá uma GroupFooter (ou apenas footerband - já não lembro, mas você a achará). Esta banda deverá ser vinculada à group em questão. Isso é necessário porque o QuickReport tem que saber a quem ela "pertence" para imprimí-la na hora certa. Lembre-se que voce poderia ter vários destes conjuntos em um relatório mais compléxo. Observe ainda, que há uma propriedade nos componente de totalização (TQrExpr) que voce usará onde você diz que ele deve ser zerado após impresso (acho que é algo como ResetAfterPrint). Do contrário, ele poderá funcionar como um sumario. Abraços
×
×
  • Create New...