Eingabe überwachen (TEdit)

andreas_gierisch

Erfahrenes Mitglied
Hallo, ich möchte bei der Eingabe einer Gleitkommazahl über ein TEdit-Feld diese überwachen. Genaugenommen möchte ich, wenn der Benutzer eine Zahl mit "." eingibt, diese umwandeln in eine Zahl mit ",".
Ich habe dies bis jetzt mit einer OnChange - Methode des Edit-Feldes gelöst:
Code:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
int length = Edit1->GetTextLen(); //Länge des eingebenen Strings
Edit1->SelStart = length -1;	 */Markieren des zuletzt eingegeben
Edit1->SelLength = 1;		 Zeichens im Edit-Feld*/
AnsiString buffer = Edit1->SelText; //Speichern des Zeichens
if(buffer == ".")			 //Überprüfen des Zeichens
{
buffer = ",";			 //eventuell Zeichen ändern
Edit1->SelStart = length - 1;	 /*Erneutes Markieren des
Edit1->SelLength = 1;		 Zeichens im Edit-Feld*/
Edit1->SelText = buffer;		 //Zeichen gegebenenfalls ersetzen
}
length = Edit1->GetTextLen();	 /*Cursor wieder ans Ende
Edit1->SelStart = length;		 der Eingabe setzen*/
}
Kennt jemand vielleicht eine elegantere Lösung?
 

BadMourning

Erfahrenes Mitglied
Ich versteh nicht ganz, warum du das mit SelStart und SelEnd machst.

so sollte es auch, und wesentlich kürzer gehen :

Code:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  int Pos;
  AnsiString buffer = Edit1->Text;

  Pos = buffer.Pos( "." );

  if( Pos )
  {
    buffer[ Pos ] = ',';    
    
    Edit1->Text = buffer;
  }
}

Es kann allerdings sein, daß diese Methode wieder ein OnChange auslöst,
aber dann ist ja kein '.' mehr drin, und alles ist in Ordnung...

Außerdem: Ich weiß nicht genau, aber es kann sein du brauchst nicht mal buffer,
da du Edit1->Text direkt bearbeiten kannst, aber mit Properties ist das immer so
eine Sache...

BadMourning
 

andreas_gierisch

Erfahrenes Mitglied
@BadMourning

Der Code funktioniert gut, musste nur am Ende noch eine Zeile einfügen:

Edit1->SelStart = Pos;

sonst steht der Cursor nach dem ändern des Zeichens am Anfang des Feldes. Ich hatte das mit SelStart und SelLength gemacht, weil ich nicht wusste, wie ichs sonst machen sollte, an die Pos-Methode von AnsiStrings hab ich gar nicht gedacht. Deine Variante sieht auf jeden Fall besser aus (kürzer und somit übersichtlicher), als meine, vielen Dank!


mfg, Andreas Gierisch
 

aton

Grünschnabel
Das wäre idealerweise die Aufgabe eines MaskEdit-Feldes, es gehört zu den Standardkomponenten so viel ich weiss . . .