tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
1015
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    andreas_gierisch andreas_gierisch ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    161
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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?
     

  2. #2
    Avatar von BadMourning
    BadMourning BadMourning ist offline Mitglied Gold
    Registriert seit
    Dec 2003
    Beiträge
    158
    Ich versteh nicht ganz, warum du das mit SelStart und SelEnd machst.

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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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
     

  3. #3
    andreas_gierisch andreas_gierisch ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    161
    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
     

  4. #4
    Avatar von aton
    aton aton ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    9
    Das wäre idealerweise die Aufgabe eines MaskEdit-Feldes, es gehört zu den Standardkomponenten so viel ich weiss . . .
     

Ähnliche Themen

  1. Eingabe im Hintergrund überwachen
    Von bastionmancher im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 20.05.07, 00:55
  2. TEdit nach Eingabe formatieren (reseten)
    Von ab1303 im Forum Borland CBuilder und VCL
    Antworten: 2
    Letzter Beitrag: 22.06.05, 01:51
  3. TEdit Eingabe einschränken?
    Von Snape im Forum Borland CBuilder und VCL
    Antworten: 8
    Letzter Beitrag: 18.10.04, 21:19
  4. TEdit und UNICODE
    Von Loods im Forum Borland CBuilder und VCL
    Antworten: 0
    Letzter Beitrag: 27.07.04, 09:37
  5. TEdit multiline
    Von Interritor im Forum Delphi, Kylix, Pascal
    Antworten: 6
    Letzter Beitrag: 07.05.03, 19:33