Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. se quiser arriscar, apenas duplique o código do TTransMemo e o descenda da classes em questão. Tipo, TTransMemo = class(TRichEdit). Não é garantido que funcione, experimente. Abraços
  2. só para não gerar confusão para o robinhcne, vamos esclarecer que o relevante no exemplo é o SELECT, ou seja fazer um SUM na tabela em questão, com os campos desejados e filtrando na cláusula WHERE as informações necessárias como a data desejada. É que commandtext é propriedade dos componente TClientDataSet e TADOCommand (por exemplo) e o robinhocne utiliza componentes ZeosLIb. Abraços
  3. João, seu problema é um só: você está tentando fazer operações matemáticas com variáveis tipo texto e não numéricas. Não vai resolver 100% sua questão, mas resolve este que você postou: TFrm_Produtos.Txnumedit_aprazoExit(Sender: TObject); var um, dois: Double; begin um := StrToFloat(Txnumedit_aprazo.Text); dois := 1 + StrToFloatDef(TEdit_Margem.Text, 0); Txnumedit_Custo.Text := FormatFloat('#0.00', um /dois); end; Considerações: - StrToFloat fará a conversão do texto digitado para um número de ponto flutuante. Entretanto, vale observar que a conversão ocorre corretamente quando você tem no texto o "." como separador de decimal e não a ",". Há outros posts que falam a respeito de como contornar isto; - StrToFloatDef faz exatamente a mesma coisa que StrToFlat, com a diferença que se a conversão não puder ser realizada (texto nulo ou inválido) será retornado o valor passado no 2º parâmetro; - FormatFloat converte um número para um string (texto) no formato definido no 1º parâmetro. Observe que se for necessário apresentar o separador de milhar, você deverá mudar a máscara para '#,##0.00' (ele usa a notação americana). As posições onde coloquei os "0", aparecerão no texto final, mesmo que você passe um valor como 0.2, o resultado será "0,20". Se precisar que apareça o símbolo da moeda, é só acrescentá-la a máscara: 'R$ #,##0.00'; - Em uma divisão como a que você está fazendo, deve ser utilizado a "/" para divisão com resultado fracionário. O Div é utilizado para divisões de inteiros, o que não cabe ao seu caso. Abraços
  4. Muito boa explicação Jhonas. É exatamente isto.Mas vamos tentar apresentar uma opção ao questionamento do colega darth_ivan: Faça o seguinte: - crie sua classe descendente da classe TThread: --> declare na sua classe a variável da classe de objeto que você pretende manipular; --> redeclare o constructor (Create) para inicializar (setar Nil) esta variável; --> redeclare o destructor (Destroy) para garantir a finalização desta variável (chamar Free se não for nil); --> crie um método onde você passa o seu objeto a ser copiado para a variável local à sua thread. Eventualmente você pode utilizar o próprio create para isto - fica a seu critério. No método, você deve "instânciar" sua variável e inicializá-la como o conteúdo do seu parâmetro (copiar). A classe TObject e seus descendentes, possui o método que supri esta necessidade - chama-se Assign. Vecê deve chamar este método a partir da sua variável, passando como parâmetro o objeto que você quer copiar. Se por algum motivo, não for possível utilizá-lo, então você terá que copiar as propriedades de um objeto em outro "na mão". - tenha sempre o cuidado de não reinstanciar sua variável, sem que antes ela seja desalocada; - sempre que a variável for desalocada em qualquer ponto da thread que não seja na sua destruição, é conveniente que você a inicialize com Nil, para que ao ser executado o Destroy, não ocorra uma exceção. É mais ou menos isto. Tente implementar neste conceito - deve funcionar. Abraços
  5. Quanto a esta questão, pode ser resolvida tratando a exceção. Modifique esta parte do código: ... URL := MidStr(URL, 1, POS-1); //pega somente o host, exemplo: www.meusite.com SVERIFY.Close; SVERIFY.Host := URL; try SVERIFY.Open; SOCKTXT := 'GET '+GETVAR+' HTTP/1.0'+chr(13)+chr(10)+chr(13)+chr(10); //inicilizando variável para RECEIVEDANSWER := False; SVERIFY.Socket.SendText(SOCKTXT); //aguardando pela resposta ou desconexão do socket while SVERIFY.Active and not RECEIVEDANSWER do Application.ProcessMessages; // evita que a aplicação congele except // se precisar por alguma mensagem sobre o erro na conexão // é aqui que você a coloca, do contrário, basta colocar nada end; end; end; end; Sobre estas linhas:SVERIFY.Active := False; SVERIFY.Close;Estas operações fazem a mesma coisa, apenas que uma você atua sobre a propriedade (Active) e outra você usa um método (Open). Então você precisa apenas utilizar uma delas. Talvez, fosse conveniente que você colocasse as strings que você está processando (o conteúdo de seu memo) para que alguém possa testar com mais "realismo" a sua situação. Bom, de minha parte é só. Espero que o colega Jhonas possa continuar lhe auxiliando. (retorno apenas 17/12/07) Abraços
  6. Micheus

    OPC e Delphi

    Saulo, as regras do forum não permitem que você crie posts do tipo UP. Criar um tópico como este tem a mesma função. (próximos serão excluídos) Se não foi respondido, provavelmente é porque ninguém se dispôs, não tem tempo ou não sabe. Abraços
  7. Thieres Tembra, observe os comentários do colega Jhonas e, de minha parte, deixo algumas sugestões que eventualmente podem ajudar a sanar algum problema. - Evite a possibilidade de haver qualquer caracter inesperado, como espaço no início e fim da linha sendo processada já que você testa especificamente sequencias nestes extremos; (pode influenciar em um endereçamento incorreto) - Enxugue seu código utilizando um for..to..do no lugar de um while..do; - Ajuste a lógica de modo a utilizar if's úteis. Contornando o teste, você pode evitar aquele if onde você faz nada; Segue uma sugestão. Acho que pode funcionar: type TForm1 = class(TForm) ... private { Private declarations } ReceivedAnswer :Boolean; end; ... procedure TForm1.VERIFICARClick(Sender: TObject); var I : integer; URL, SOCKTXT : string; begin for I := 0 to LISTA.Lines.Count -1 do begin URL := Trim(LISTA.Lines.Strings[I]); // ** retire qualquer caracter espaço no início ou fim if RightStr(URL, 1) = '=' then begin if (LeftStr(URL, 7) <> 'http://') then URL := 'http://'+URL; VERIFY.Close; VERIFY.Host := URL; VERIFY.Port := 80; VERIFY.Active := True; SOCKTXT := 'GET '+URL+' HTTP/1.0'; // inicializamos variável para controle ReceivedAnswer := False; VERIFY.Socket.SendText(SOCKTXT); // após enviado o comando, aguardamos pela resposta ou desconexão do socket while VERIFY.Active and not ReceivedAnswer do Application.ProcessMessages; // evita que sua aplicação congele end; end; end; procedure TForm1.VERIFYRead(Sender: TObject; Socket: TCustomWinSocket); var ReceivedCmd :String; begin // armazena na variável o texto recebido e faz algo com ele... ReceivedCmd := Socket.ReceiveText; // Seta variável indicando que a resposta foi recebida ReceivedAnswer := True; end; Jhonas, eu já observei em outra oportunidade que o erro citado pelo colega não necessariamente ocorre de primeira. Neste seu exemplo, após ocorrido este erro que você citou, se você tentar uma conexão seguida, o tal erro deverá ser retornado (pelo menos, isto ocorreu comigo).Assim, parece que nosso colega pode estar recebendo um outro erro antes deste e não mencionou. Abraços
  8. MXVinícius, segue uma sugestão para dar uma enxugadinha no seu código. Utilizando AsDateTime no if, você não precisará fazer a conversão da data para string, livrando-se de problemas de formatação. Também, dê preferência ao uso da função Date quando tratar de datas apenas, já que Now retorna data+hora que em alguns casos pode gerar problema, como por exemplo numa condição de igualdade onde você teria armazenado na sua tabela apenas uma data. Ex.: '29/11/2007' e Now lhe retornaria '29/11/2007 13:06:15', que não seria uma igualdade (coloquei como string apenas para ilustrar melhor). Também, poderia ocorrer de você ter na sua variável dias, um resultado com decimais (onde ficam armazenadas as horas), o que também poderia ser problema, pois num caso como:'10/11/2007' e Now lhe retornaria '29/11/2007 13:00:00', a diferença resultaria em 19,541666 e que seria assim mostrado por seu ShowMessage. (este você consegue testar) procedure TForm1.BitBtn20Click(Sender: TObject); Var dias: real; begin if TPagarDataVencimento.AsDateTime < Date then begin TPagar.Edit; TPagarSituacao.Value:= 'Pendente'; TPagar.Post; end else begin dias := TPagarDataVencimento.Value - TPagarDataEmissao.Value; ShowMessage('Você têm + ' + FLoatTOStr(dias) + ' de prazo'); end; end; Abraços
  9. Apenas completando... Fechar a conexão, deve implicar no fechamento automático de qualquer dataset aberto e ligado a ela. Mas, acho que o problema pode estar no fato da possibilidade de haverem vários usuários acessando o banco. Neste caso, este procedimento funciona se todos os usuários estiverem desconectados. Talvez você possa utilizar o programa de linha de comando mysqldump. Veja estes artigos: - Backup MySQL com mysqldump (ref. ) - A Database Backup Program (ref. MySQL Reference Manual) - Técnicas de backup e restauração de dados no MySQL (ref. Forum DevMedia) e por último, talvez este endereço seja o mais útil: Problemas para usar o mysqldump via Delphi. Acompanhe o desenvolvimento dele, no início da segunda página, a solução está próxima. Abraços
  10. Bem observado Jhonas. Agora em casa, conferindo em meus exemplos, posso ainda acrescentar, ao que já sugeri, que se você optar pela forma como eu reapresentei o seu código, e mantendo a propriedade DefaultDrawing = True, não há necessidade da linha (teste): DBGrid1.Canvas.FillRect(Rect); Abraços
  11. José, vai anexo um exemplo que talvez lhe ajude. Ele consiste de dois programas: um Server e outro Client. Já estão no anexo, os executáveis, mas se abrir os projetos fontes e receber mensagem de que não foram encontrados os componentes socket, clique em "Ignore" e saia do projeto sem salvá-los. Em seguida proceda a instalação dos componentes: No menu Components->Install packages, botão "Add..." localiza a pasta "Bin" no diretório de instação do Delphi, nela você deve encontrar o arquivo "dclsockets70.dcl" - Selecione-o para instalação. O Server simula um programa que mostra em um letreiro o texto enviado pelos programas Client. Quando o Server recebe os texto, estes são tratados de modo que aparecendo as iniciais "CMD:", ele entende que o texto na sequencia é o conteúdo a ser mostrado no display. Já se não contiver, é apenas uma mensagem qualquer sendo trocada entre Client e Server, sendo que apenas é adicionada ao log (memo). No Client, faz necessário informarmos o nome do servidor ao qual queremos nos conectar. Eu implementei apenas o uso do "Host Name" (propriedade Host), mas poderia ser feito uso de endereço IP (propriedade Address). A simulação do envio de mensagem fica por conta de um Timer que viabizará o envio de 5 mensagens ao servidor. Para testar, você pode executar tudo em um só compudador - não há problemas. Sugiro que execute o servidor e duas instâncias do client. Faça toda a combinação de testes possíveis. Voce observará que estando todos conectados, ao desconectar o Server, automaticamente os Client passarão ao modo desconectados. Que a cada server conectado ao server, sua informação será mantida em uma lista de clients (ComboBox) onde inclusive o Socket desta conexão é guardada para que possamos enviar mensagem para qualquer client na lista. A troca de texto entre Server e Client é feito através de uma caixa de texto e botão de envio. A lista de comandos a serem executados pelo server, é armazenada num ListBox em tela, logo se o programa for encerrado, não há como continuar com a lista de onde ela estava. Se coisa deste tipo for necessária, talvez seja conveniente utilizar, então, uma tabela para armazenar os comandos para posterior utilização. Espero que você consiga dar um start no seu projeto. Abraços Socket_Demo.zip
  12. Acredito que você deva testar em State o estado gdSelected ao invés de gdFocused: if gdSelected in State then Sobre a linha: Dbgrid1.Fields[1].Alignment := taCenter; Evite fazer este tipo de atribuição neste tipo de evento. Observe que o evento ocorre para cada linha desenhada e esta atribuição pode ser feita apenas uma vez (não a cada pintura) em design-time ou após aberto o dataset (caso as colunas não tenham sido adicionadas no DBGrid em design-time). Observe que, para o evento que você está tratando (OnDrawColumnCell), voce deveria estar chamando o método padrão deste evento - DefaultDrawColumnCell, e não DefaultDrawDataCell (para OnDrawDataCell) ou então utilize este último evento. Alias, mão me recordo agora, mas um deles está obsoleto (acho que o primeiro). Também, você deve passar como parâmetro, os mesmos que são recebidos no evento tratado: procedure TFormCagesys.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin If odd(DM.SDSagesys.RecNo) then DBGrid1.Canvas.Brush.Color:= cl3dlight else DBGrid1.Canvas.Brush.Color:= clWhite; if (gdSelected in state) then DBGrid1.Canvas.Font.Color:= clred else DBGrid1.Canvas.Font.Color:= clBlack; DBGrid1.Canvas.FillRect(Rect); // Dbgrid1.Fields[1].Alignment := taCenter; Dbgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; Abraços
  13. você pode utilizar o evento KeyPress. Dê uma olhada neste post. Apenas você deverá acrescentar os caracteres "." e/ou "," ao conjunto no teste do if: ['0'..'9', '.', ',']
  14. Nestes casos de quebra, normalmente você utiliza uma banda tipo Group, então basta habilitar a propriedade ForceNewPage (True)
  15. José, no caminho para casa esta manhã, refletindo sobre o exemplo que postei, observei que deixei de fora a forma como você deve concatenar o comando a ser enviado. Eu exemplifiquei apenas o envio do nível operativo, que são enviados nos 2 bits menos significativos. Porém, o comando vai nos 4 bits mais significativos. Como o comando vai em 4 bits, sabemos que podemos representar apenas valores entre $0 e $F, ou seja 0 a 15. O fato de serem posicionados nos 4 bits mais significativos do BYTE, significa que se partirmos destes valores (0 a 15), teremos que deslocá-los 4 bits à esquerda e agregá-los aos 4 bits menos significativos do nível operativo. Fazemos isto utilizando o operador de bit SHL (Shift Left - deslocamento à esquerda) seguido de uma operação binária OR (OU): procedure TForm1.BtnSendCommand(Sender :TObject); var Header, Command, Source, Destination :string; CmdByte :Byte; begin Header := Char($AA) +Char($55); // define o nível operativo - observe que apenas os 4 bits menos significativos tem valor case RadioGroupLevel.ItemIndex of 0 : CmdByte := $01; // Vídeo 1 : CmdByte := $02; // Áudio 2 : CmdByte := $03; // Áudio/Vídeo 3 : CmdByte := $FF; // Blank end; // agrega o comando, nos 4 bits mais significativos case RadioGroupCommand.ItemIndex of 0 : CmdByte := ($00 SHL 4) or CmdByte; 1 : CmdByte := ($01 SHL 4) or CmdByte; 2 : CmdByte := ($02 SHL 4) or CmdByte; 3 : CmdByte := ($03 SHL 4) or CmdByte; 4 : CmdByte := ($04 SHL 4) or CmdByte; 5 : CmdByte := ($05 SHL 4) or CmdByte; 6 : CmdByte := ($06 SHL 4) or CmdByte; 7 : CmdByte := ($07 SHL 4) or CmdByte; 8 : CmdByte := ($08 SHL 4) or CmdByte; 9 : CmdByte := ($09 SHL 4) or CmdByte; 10 : CmdByte := ($0A SHL 4) or CmdByte; 11 : CmdByte := ($0B SHL 4) or CmdByte; 12 : CmdByte := ($0C SHL 4) or CmdByte; 13 : CmdByte := ($0D SHL 4) or CmdByte; 14 : CmdByte := ($0E SHL 4) or CmdByte; 15 : CmdByte := ($0F SHL 4) or CmdByte; end; Command := Char(CmdByte); Source := Char(RadioGroupSource.ItemIndex +1); // 01-08 Input selection Destination := Char(RadioGroupDestination.ItemIndex +1); // 01-08 Output selection ComPort1.Send(Header +Command +Source +Destination); //Envia a string de comandos end;Também corrigi o Source e Destination, somando um ao ItemIndex, já que este começa em 0 e as entradas/saídas em 1. OBS: O anexo foi corrigido e se faz necessário adicionar o componente pois eu não o possuo. Abraços SendCom.zip
  16. José, neste post inicial vemos que o item <IL> na sua sequência é do tamanho de 01 BYTE, mas fiquei confuso lendo... ...neste último exemplo aparece um <5L>. Bom, não dá para entender a função do "L" já que não faz parte do "alfabeto" hexadecimal. Bom, no caso do 1º exemplo citado, será que algo como o código abaixo ajuda. É um exemplo que usa a seleção realizada através de alguns RadioGroup colocados em um form: procedure TForm1.BtnSendCommand(Sender :TObject); var Header, Command, Source, Destination :string; begin Header := Char($AA) +Char($55); case RadioGroupCommand.Index of 0 : Command := Char($01); // Vídeo 1 : Command := Char($02); // Áudio 2 : Command := Char($03); // Áudio/Vídeo 3 : Command := Char($FF); // Blank end; Source := Char(RadioGroupSource.Index); // 01-08 Input selection Destination := Char(RadioGroupDestination.Index); // 01-08 Output selection ComPort1.Send(Header +Command +Source +Destination); //Envia a string de comandos end; ainda acho que ficaria mais fácil se soubesse de que equipamento estamos falando, assim quem sabe seria possível encontrar uma instrução como a deste equipamento (projetor de vídeo) com interface serial: http://www.cineversum.com/projection_syste...ads/pc_cmds.pdf READ_MEAS 48H Purpose : questions ACTAS Control Unit measurement values. Cmd Dat1 Dat2 Dat3 Dat4 48H Which Color Type Option Dat4 Option 00H last measured values are returned (immediate answer; 7 byte record) 10H a new measurement is done first; with normal sensitivity (answer is ACTAS’ initiative; full format 9 byte record starting with STX OFFS FEH,…) 11H a new measurement is done first; with sensitivity/10 (answer as for 10H) Dat3 Type 00H default 01H signed long integer (MSB returned in Dat1, .., LSB in Dat4) 02H IEEE 754 floating point (Dat1 Dat2 Dat3 Dat4 return MMMMMMMM MMMMMMMM EMMMMMMM SEEEEEEE) Dat1 Dat2 Dat3 function default type 00H 00H 00H reserved 01H 00H 00..02H full_lux IEEE 754 float 02H 00H 00..02H peak_lux IEEE 754 float 03H 00H..02H 00H lux[Dat2] IEEE 754 float [R, G, B] 10H 00H..02H 00H colval[Dat2] meas. in counts, long int; [R, G, B] 11H 00H..02H 00H colref[Dat2] reference in counts, long int; [R, G, B] Abraços
  17. Robinhocne, a procedure eu já conheço. Como eu disse, você precisa executá-la e verificar como estão o conteúdo dos parâmetros, a string SQL que você monta - Depurar. Dê uma olhada nestes dois posts: http://scriptbrasil.com.br/forum/index.php...st&p=393331 http://scriptbrasil.com.br/forum/index.php...st&p=406052 eles dão alguma informação de como colocar break-points no seu programa para que você possa avaliar (evaluate) o conteúdo das variáveis. Se você se esforçar para aprender a utilizar estes recursos, você conseguirá resolver muitos problemas sozinho. Abraços
  18. dizer "passar o objeto como parâmetro do nome da classe" não é muito apropriado, já que o nome da classe apenas a identifica - não é uma função ou procedimento. Isto está apenas dizendo ao compilador que aquele endereço de memória se refere a um objeto daquela classe, ok?!. Voltando a questão, como já disseram, a diferença está na otimização apenas (apesar, de eu não ver qualquer relação com rede neste caso). Vamos ver na prática como fica este código: procedure TForm1.Button1Click(Sender: TObject); begin (Sender as TButton).Caption := 'Novo nome'; end; procedure TForm1.Button2Click(Sender: TObject); begin TButton(Sender).Caption := 'Novo nome'; end; A diferença está na chamada a uma função AsClass (destaque), com um acréscimo de 12 bytes no executável a cada chamada e um tempinho a mais para o processamento da função. Abraços
  19. aquele com valor fixo, não é?! Se sim, sinal que realmente havia algum problema com todas aquelas funções. Mas utilizando o format, nem será preciso elas. Bom por esse erro que deu, acho que fala que tem mais colunas das quais informada, mais ou menos assim! é isso mesmo, você já passou por este erro anteriormente (se bem me lembro).É interessante, porque desta vez, não estão faltando parâmetros como da outra vez: você adiciona 6 colunas à vcpo e 6 valores à vvlr. :huh: E neste caso, eu diria que: "agora é com voce" Teria que depurar para "ver" o que está acontecendo lá na procedure IncluirRegistro. Verificar como as listas estão quando vão sendo processadas, como fica a string da instrução SQL. Abraços
  20. Adicione a sua tela um SaveDialog (paleta Dialogs) e veja este post do colega Thales Abraços
  21. José, por acaso há algum tipo de documentação sobre como as informações devem ser enviadas para sua matriz. Algo como um manual em PDF, para que possa ajudar melhor. Veja bem, o que faz sentido é que se envie o que o hardware espere receber: sequência de inicialização, texto, parâmetros, o que for. Só com uma documentação dá para explorar melhor. A questão de enviar em Hexa decimal é apenas um detalhe. Se você leu lá em cima quando falei algo sobre ele, você deve ter observado que é apenas uma forma de representação do valor de um byte (8 bits): Hexa-decimal ($00 a $FF), Decimal (0 a 255), Binário (00000000 a 11111111) e até poderíamos citar Caracter (#0 a #255) Assim, mesmo o exemplo que postei acima (em hexa) poderia ser aplicado com caracteres: ... Buffer[0] := 'ª'; // <Aah> - $AA, 170, 10101010 Buffer[1] := 'U'; // <55h> - $55, 85, 01010101 Buffer[2] := 'Ð'; // <D0h> - $D0, 208, 11010000então, se você tiver que concatenar texto à seqüência a ser enviada, não há qualquer problema - concatene o string. O detalhe pode ser apenas a forma como seu hardware espera receber esta seqüência: se deve ser informado o tamanho da sequencia sendo enviada ou se ele utiliza o zero (#0) como terminador. Como disse, mais informação sobre como seu hardware seria bem vinda. Abraços
  22. era o que eu estava suspeitando, já que você citou que havia inicialmente definido ele com valor default CURRENT_DATE e depois alterou isto. Aparentemente pode haver um "bug" no banco, já que uma vez modificado, não deveria mais continuar a ser inicializado.Voce fez exatamente o que eu lhe iria sugerir. beleza. bom, eu não tenho este tipo de problema utilizando o FB, mas faça uns testes:- na linha onde você inicializa o valor deste campo, ao invés de chamar seus procedimentos, coloque um valor fixo e veja como se comporta no banco. Coloque algo assim: ... Add (#39 + tblPar.Fields[00].DisplayText + #39); Add ( '70.5' ); // <=================== AQUI add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39); ... - se a informação agora for gravada corretamente, então tem algum problema com o procedimento que você utiliza para transformar o valor em texto. Se o objetivo é converter o campo que é numérico, para uma string, lembre-se que não deverá estar no formato de milhar - deve apenas conter o separador decimal e que neste caso deverá ser o ponto. Assim, sendo, experimente chamar desta forma: ... Add (#39 + tblPar.Fields[00].DisplayText + #39); Add (Format('%.2f', [tblPar.Fields[02].AsFloat])); // <=================== AQUI add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39); ...onde a string de formatação "%.2f" significa que você estará formatando um float com 2 casas decimais (observe o número 2 após o ".") e a string retornada não fará a substituição do separador decimal. Ou seja, o separador será o ponto ("."), mesmo que esteja configurado em seu Windows para ser a vírgula. Qualquer dúvida quanto a forma de montar esta string de formatação, procure no help por "Format strings". lembra-se do que falei antes sobre a propriedade DisplayFormat? É ela que você deve configurar. Alguns comentários a título de informação (para você e quem mais se interessar): - Na definição da estrutura das tabelas em seu banco, em campos como este que você utiliza para identificação do item, seja ele Aluno, Codigo, ID, normalmente defini-se como um tipo inteiro (não numéric). O INTEGER (pode armazenar um número muito grande). Mas se a intenção é poupar espaço, você pode utilizar outras variantes inteiras como o SMALLINT/TINYINT, é questão de conhecer os tipos oferecidos pelo banco que você utiliza. Apesar que, internamente, aquele seu campo ALUNO NUMERIC(6, 0), será convertido para integer pelo banco. Então, mais um motivo para manter os tipos de acordo com o uso. Se você não vai precisar dos decimais, encontre um tipo inteiro que acomode a quantidade de casas que você precisa. - Se você der uma espiada no help, sobre o TCurrencyField, você verá que ele é exatamente o mesmo que um TFloatField, porém com alguns recursos para tratar o formato Currency: "TCurrencyField differs from its immediate ancestor TFloatField only in having a DataType of ftCurrency, and in formatting the value using a currency format by default." (TCurrencyField difere de seu antecessor imediato TFloatField apenas por ter um a propriedade DataType do tipo ftCurrency, e no formato do valor utilizando o formato currency por padrão); Também lá, é salientado de que não deve ser confundido o TFieldCurrency com o tipo de dados Currency: "Do not confuse TCurrencyField with the Currency data type. Currency fields use the Double data type to store and manipulate their values. This data type is the format used by the physical database tables for currency fields. The TBCDField class uses the Currency data type to store and manipulate its value." (Não confunda TCurrencyField com o tipo de dados Currency. O campo currency (TCurrencyField) usa o tipo de dados Double para armazenar e manipular seus valores. Este tipo de dados é o formato utilizado pelas tabelas do banco de dados para campos currency. A classe TBCDField usa o tipo de dados Currency e manipula seu valor). Motivo pelo qual, considero que não há necessidade de utilizar o AsCurrency, visto que pode dar uma noção errada do tipo de dados que está sendo referenciado. - em campos tipo histórico ou observações, pode ser interessante avaliar o uso de um tipo de dado BLOB no banco de dados, principalmente quando forem relativamente grandes ou de tamanho indefinido. Em alguns bancos (não é o caso do FB), declarar um VARCHAR(200), significa reservar este espaço, mesmo que nunca seja preenchido com algo, bem como trafegar com eles pela rede. Tem um artigo em inglês que faz algumas considerações sobre quando poder ser interessante utilizar um ou outro: To BLOB or not to BLOB, that is the question Quando vier a fazer uso de BLOB no FB, declare o sub-type conforme o uso: 0 - padrão (imagens e outros dados); 1 ou TEXT para campos memo (textos). Segment Size, define não o tamanho do blob, mas o tamanho de cada bloco que será acessado de cada vez. Assim, se for para armazenar imagem, algo como 64K (65536) pode ser mais conveniente (é questão de avaliar o tamanho médio das imagens utilizadas), já para texto 100 poderia ser suficiente , mas segundo li em outro lugar, 2K (2048) é recomendado como padrão - é sempre questão de avaliação do seu uso. Abraços
  23. aparentemente este seu form faz uso de uma tabela onde existe a tentativa de uso de um índice que não existe.Algo como você tentar utilizar o índice na propriedade IndexName de um dataset. Dê uma verificada. Abraços
  24. José, apenas para não lhe deixar sem uma resposta básica (já que estou sem tempo para implementações maiores), vou explorar o exemplo existente no link que o colega Jhonas postou anteriormente: http://www.veloso.kit.net/rs232.html Se você tentar seguir as orientações dele lá, acho que você verá que para a sequencia que você colocou bastaria enviar desta forma? procedure TForm1.BtnSendClick(Sender :TObject); var Buffer :array[0..255]of char; begin FillChar(Buffer, 0, sizeof(Buffer)); // acho que é esta a sequencia Buffer[0] := $AA; // <Aah> Buffer[1] := $55; // <55h> Buffer[2] := $D0; // <D0h> VaComm1.WriteText(Buffer); // se necessário, utilize type-cast para string -> VaComm1.WriteText(String(Buffer)); end; Abraços
  25. Estranho... você utiliza o IBExpert para acessar a estrutura da tabela, parece-me. Se sim, você já olhou como estão os dados na tabela, que valor está preenchido no campo DTPGTO?
×
×
  • Criar Novo...