• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Edit_Digit_Virg

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
O exemplo a seguir leva um Edit (que, via teclado, aceita apenas valores numéricos e backspace) e dois RadioButtons no Form. Quando o usuário dá um clique no RadioButton1, o programa providencia a colocação de uma vírgula a duas casas decimais do final da string numérica. O evento OnKeyPress do Edit possui um código para providenciar o acerto constante da vírgula a duas casas decimais, sempre que houver a inserção ou exclusão de dados.



nota: esse código é apenas exemplificativo, carecendo de alguns acertos para um uso mais profissional.


Virgula_decimal_htm_9ba48ce.gif
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
// vetor para receber a string
char buffer[100];

/*variável para trabalhar na alteração da posição da vírgula*/
char buf;

/*booleana para desabilitar a inclusão de uma segunda vírgula*/
bool virgula = true;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
if(virgula == true && Edit1->Text != "")
{
char buffer[100];
strcpy (buffer, Edit1->Text.c_str()); // converte Text de AnsiString para char*
buffer[(Edit1->Text.Length()) + 1] = buffer[(Edit1->Text.Length())];
buffer[(Edit1->Text.Length())] = buffer[(Edit1->Text.Length())- 1];
buffer[(Edit1->Text.Length()) - 1] = buffer[(Edit1->Text.Length())- 2];

/**************************************************************
Para colocar a vírgula a quatro casas decimais do final,
acrescente as linhas de código que estão na forma de comentários
e substitua os valores na forma de comentários no final de
algumas das linhas de código abaixo: os valores -4, -5 ou -6.
***************************************************************/

// buffer[((int)Edit1->Text.Length()) - 2] = buffer[((int)Edit1->Text.Length())- 3];
// buffer[((int)Edit1->Text.Length()) - 3] = buffer[((int)Edit1->Text.Length())- 4];

buffer[(Edit1->Text.Length()) - 2] = ','; // - 4
Edit1->Text = buffer;
virgula = false;
}
else
return;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
// coloca o cursor no final do Edit
Edit1->SelStart = (Edit1->Text.Length());
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{

/*** O código abaixo faz que o edit aceite
apenas valores numéricos através do teclado */

// (backspace == 8)
if(Key != 8)
{
// (valor 1 == 48) .. (valor 9 == 57)
if((Key < 48) || (Key > 57))
{
Key = 0;
}
}

/*O código abaixo mantém a vírgula a duas casas
decimais (...,00) do final da string *********/
if(RadioButton1->Checked == true)
{
if (Key != VK_BACK) // Key != backspace
{

saida:
// converte Text de AnsiString para char*
strcpy (buffer, Edit1->Text.c_str());
buf = buffer[(Edit1->Text.Length()) - 2]; //-4
buffer[(Edit1->Text.Length()) - 3] = buf; //-5
buffer[(Edit1->Text.Length()) - 2] = ','; //-4
Edit1->Text = buffer;

// coloca o cursor no final do Edit
Edit1->SelStart = (Edit1->Text.Length());
}


if (Key == VK_BACK)
{
// converte Text de AnsiString para char*
strcpy (buffer, Edit1->Text.c_str());
buf = buffer[(Edit1->Text.Length()) - 4]; // -6
buffer[(Edit1->Text.Length()) - 3] = buf; // -5
buffer[(Edit1->Text.Length()) - 4] = ','; // -6
Edit1->Text = buffer;

// coloca o cursor no final do Edit
Edit1->SelStart = (Edit1->Text.Length());
}

}

}
//---------------------------------------------------------------------------
 
Topo