Ir para conteúdo
Fórum Script Brasil
  • 0

"desafio" De Formatação


Hudson Cavazin

Pergunta

Estou querendo formatar um campo em que será colocado um preço de produto. Gostaria que quando a pessoa começassee a digitar o valor fosse colocando a vírgula e também o ponto automaticamente

Um exemplo: http://www.correios.com.br/encomendas/precos/default.cfm

Será que alguém pode me ajudar? ;)

Editado por Hudson Cavazin
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Opa

Na biblioteca RxLib possue um componente chamado TCurrencyEdit que faz isto que

você quer, não sei se faz "exatamente" como você quer, mas é um Edit que formata

o que é digitado em modo de dinheiro (currency), da uma olhada se não for podemos

te ajudar com outros métodos...

Rxlib Download

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Na biblioteca RxLib possue um componente chamado TCurrencyEdit que faz isto que

você quer, não sei se faz "exatamente" como você quer, mas é um Edit que formata

o que é digitado em modo de dinheiro (currency)

Voce está correto Churc. O componente está na paleta RX Controls e para a função que o colega pretende fazer dele, é necessário habilitar (deixar true) a propriedade FormatOnEdit. A formatação é definida através da propriedade DisplayFormat.

Entretanto, este é um componente tipo TEdit - não tem uma versão DataWare, ou seja, que possa ser ligado a um campo de um dataset. A medida que o tempo permita, eu comecei adaptar um componente que eu tenho, que simplesmente posibilita o alinhamento de números pela direita (TAlignedEdit), para que possa ser utilizado como um DataWare já que achei a idéia interessante. Qualquer hora dessas, eu posto aqui. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

pra instalar os componentes do rx lib no delphi 2005 eu me bati um pouco e não consegui, mais mesmo conseguindo, eu prefiro que seja alguma coisa no evento onchange, pois o componente faz ligação direta com o banco de dados, já o componente o rxlib não como o micheus comentou ;x

ty

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Entendi, só que tem um problema, os eventos onKeyUp, onKeyDown, onKeyPress

se você manipular o texto digitado o cursor volta para o primeiro caracter, no que

atrapalha e não da certo da maneira que você deu como exemplo, agora a não ser

que haja como impedir isto...

Sei que se fosse "internamente" ou seja, no componente não haveria este problema,

agora usando eventos seria "externamente" então vai ocorrer este problema...

Usando os eventos externos da pra fazer mais acontece o que eu te falei...

Sem dar este problema, eu não sei como te ajudar, espero que o Micheus ou alguém saiba ;)

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Entendi, só que tem um problema, os eventos onKeyUp, onKeyDown, onKeyPress

se você manipular o texto digitado o cursor volta para o primeiro caracter, no que

atrapalha e não da certo da maneira que você deu como exemplo, agora a não ser

que haja como impedir isto...

É isto mesmo Churc e o meio de impedir que isso ocorra é salvar a posição do cursor (propriedade SelStart do edit) antes da alteração e ajustar sua posição caso seja realizada alguma alteração no sentido de incluir os caracteres de pontuação da formatação. Tem outra coisa em questão ainda, para definir o alinhamento do edit para outra que não a esquerda, faz-se necessário manipular a criação do componente, visto que é necessário definir em seu estilo que tráestá-se de um componente multi-linha, bem como o tipo do alinhamento (ver comentário no help Win32API - CreateWindow - EM_RIGHT).

Disto resulta que a melhor saída seria realmente utilizar/criar um componente para este fim (minha opnião).

Em meu componente (mencionado anteriormente), eu utilizo o evento OnKeyPress, mas é um controle chato de ser feito (pelo menos ainda não consegui deixar redondo). Deve ser observado também, a questão de modificar a propriedade Text, como resultado do processamento, pois resultará na ocorrência de um evento OnChange (se não me falha a memória). Neste caso, faz-se necessário ainda salvar e remover o evento (atribuir nil a OnChange) e restaurá-lo depois do processamento - isso no caso de haver qualquer processamento no referido evento.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Entendi, só que tem um problema, os eventos onKeyUp, onKeyDown, onKeyPress

se você manipular o texto digitado o cursor volta para o primeiro caracter, no que

atrapalha e não da certo da maneira que você deu como exemplo, agora a não ser

que haja como impedir isto...

É isto mesmo Churc e o meio de impedir que isso ocorra é salvar a posição do cursor (propriedade SelStart do edit) antes da alteração e ajustar sua posição caso seja realizada alguma alteração no sentido de incluir os caracteres de pontuação da formatação. Tem outra coisa em questão ainda, para definir o alinhamento do edit para outra que não a esquerda, faz-se necessário manipular a criação do componente, visto que é necessário definir em seu estilo que tráestá-se de um componente multi-linha, bem como o tipo do alinhamento (ver comentário no help Win32API - CreateWindow - EM_RIGHT).

Disto resulta que a melhor saída seria realmente utilizar/criar um componente para este fim (minha opnião).

Em meu componente (mencionado anteriormente), eu utilizo o evento OnKeyPress, mas é um controle chato de ser feito (pelo menos ainda não consegui deixar redondo). Deve ser observado também, a questão de modificar a propriedade Text, como resultado do processamento, pois resultará na ocorrência de um evento OnChange (se não me falha a memória). Neste caso, faz-se necessário ainda salvar e remover o evento (atribuir nil a OnChange) e restaurá-lo depois do processamento - isso no caso de haver qualquer processamento no referido evento.

Abraços

Opa

Então Micheus, sobre o SelStart parece ser uma boa, se der pra salvar a posição do cursor então

acredito que de pra fazer o que ele quer em eventos como onKeyUp...

Eu também acho que a melhor maneira deve ser criar um componente para isto, ou dar um inherit

de um... pode ser que se der um override no create params dele de para ajustar o EM_RIGHT, tem

que ver onde ele fica, Exstyle?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
...

É isto mesmo Churc e o meio de impedir que isso ocorra é salvar a posição do cursor (propriedade SelStart do edit) antes da alteração e ajustar sua posição caso seja realizada alguma alteração no sentido de incluir os caracteres de pontuação da formatação. Tem outra coisa em questão ainda, para definir o alinhamento do edit para outra que não a esquerda, faz-se necessário manipular a criação do componente, visto que é necessário definir em seu estilo que tráestá-se de um componente multi-linha, bem como o tipo do alinhamento (ver comentário no help Win32API - CreateWindow - EM_RIGHT).

Disto resulta que a melhor saída seria realmente utilizar/criar um componente para este fim (minha opnião).

Em meu componente (mencionado anteriormente), eu utilizo o evento OnKeyPress, mas é um controle chato de ser feito (pelo menos ainda não consegui deixar redondo). Deve ser observado também, a questão de modificar a propriedade Text, como resultado do processamento, pois resultará na ocorrência de um evento OnChange (se não me falha a memória). Neste caso, faz-se necessário ainda salvar e remover o evento (atribuir nil a OnChange) e restaurá-lo depois do processamento - isso no caso de haver qualquer processamento no referido evento.

Abraços

Opa

Então Micheus, sobre o SelStart parece ser uma boa, se der pra salvar a posição do cursor então

acredito que de pra fazer o que ele quer em eventos como onKeyUp...

Isto mesmo.

Eu também acho que a melhor maneira deve ser criar um componente para isto, ou dar um inherit

de um...

O que tenho, descende de TEdit.

pode ser que se der um override no create params dele de para ajustar o EM_RIGHT, tem

que ver onde ele fica, Exstyle?

Não no Style mesmo. Veja uma pontinha do código:
procedure TAlignedEdit.CreateParams(var Params: TCreateParams);
const
  AlignOnAPI: array [TAlignment] of DWORD = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited CreateParams(Params);
 // adicionamos Multiline ao estipo para que possa ser aplicados
 // os alinhamentos à Direita e Centralizado - ver help CreateWindow
 // ES_RIGHT e ES_CENTER
  if FEditType <> etText then
    Params.Style := Params.Style or ES_MULTILINE or AlignOnAPI[FAlignment];
 // se o edit ler números inteiros, então definimos para aceitar apenas
 // caracteres numéricos 
  if FEditType = etInteger then
    Params.Style := Params.Style or ES_NUMBER;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...