Ereignissteuerung




Währungsumrechnung

Erstelle ein Programm, das von Euro in Schilling, Schweizer Franken und Dollar umrechnen und von diesen zurück in Euro umrechnen kann.
Das Programm soll gegen Fehleingaben abgesichert werden und zur Auswahl der Währung Radiobuttons benutzen.

Funktionen und Ereignismethoden

Der Kern der Grundversion des Programms besteht aus einer Funktion, die den eingegebenen Eurobetrag in die entsprechende Fremdwährung umrechnet. Der aktuelle Kurs wird aus dem Kurs-anzeigenden Label entnommen.

Die Berechnung soll immer dann starten, wenn eine Taste gedrückt wurde und wieder ausgelassen wird (Edit1KeyUp-Ereignis).

float rechneEF(float euro)
{float fremd, kurs;
 kurs=StrToFloat(Form1->Label4->Caption);
 fremd=euro*kurs;
 return fremd;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{float fremd;
 fremd=rechneEF(StrToFloat(Edit1->Text));
 Edit2->Text=FloatToStrF(fremd,ffFixed,6,2);
}
//---------------------------------------------------------------------------

Die Funktionen, die beim Klicken auf einen Radiobutton ablaufen, sind der Edit1KeyUp-Funktion sehr ähnlich und untereinander fast identisch.

void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{float fremd;
 Label4->Caption="13,7603";
 Label2->Caption="Schilling";
 fremd=rechneEF(StrToFloat(Edit1->Text));
 Edit2->Text=FloatToStrF(fremd,ffFixed,6,2);
}
//---------------------------------------------------------------------------

Nähere Erklärungen zum Befehl FloatToStrF gibt es hier: AnsiString Konvertierungsfunktionen

void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
{float fremd;
 Label4->Caption="1,4659";
 Label2->Caption="Schweizer Franken";
 fremd=rechneEF(StrToFloat(Edit1->Text));
 Edit2->Text=FloatToStrF(fremd,ffFixed,6,2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
{float fremd;
 Label4->Caption="1,36168";
 Label2->Caption="Dollar";
 fremd=rechneEF(StrToFloat(Edit1->Text));
 Edit2->Text=FloatToStrF(fremd,ffFixed,6,2);
}
//---------------------------------------------------------------------------

Nutzung des Parameters Sender

Die drei Ereignismethoden für die Radiobuttons können auch zu einer gemeinsamen Methode zusammengefasst werden. Die Methode wird RadioButtonClick genannt. Dabei verwendet man den Parameter Sender.

void __fastcall TForm1::RadioButtonClick(TObject *Sender)
{
float fremd;
 if (Sender==RadioButton1)
 {Label4->Caption="13,7603";
  Label2->Caption="Schilling";
 }
 if (Sender==RadioButton2)
 {Label4->Caption="1,4659";
  Label2->Caption="Schweizer Franken";
 }
 if (Sender==RadioButton3)
 {Label4->Caption="1,36168";
  Label2->Caption="Dollar";
 }
 fremd=rechneEF(StrToFloat(Edit1->Text));
 Edit2->Text=FloatToStrF(fremd,ffFixed,6,2);
}
//---------------------------------------------------------------------------

Im Objektinspektor stellt man für jeden Radiobutton für das Standardereignis OnClick die Methode RadioButtonClick ein. In dieser Methode wird nun der Parameter Sender abgefragt. Je nachdem, von welchem Radiobutton die Ereignismethode nun aufgerufen wird, erhält die Variable Kurs den richtigen Wert und die Umrechnung wird gestartet.

In den Eingabefeldern sind nur ganz bestimmte Tasten sinnvoll (die Ziffern von 0 bis 9, das Komma und die Backspace-Taste. Um nur diese Tasten zuzulassen, kann das KeyPress-Ereignis benützt werden. Werden andere als die vorgesehenen Tasten gedrückt, wird der Parameter Key auf Null gesetzt.

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{if (!((Key>='0')&&(Key<='9')||(Key==',')||(Key==8))) 
 {Key=0;
 }
 if (Key==',' && Edit1->Text.Pos(",")!=0) {  //verhindert 2 Kommas!
  Key=0;       
 }
}

Besser lesbar wird der Quelltext, wenn die verwendeten Spezial-ASCII-Werte wie Backspace zuvor mit #define als Konstante definiert werden, z.B.

#define BS   8
#define LEER 0

Die obige Funktion sieht damit folgendermaßen aus:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{if (!((Key>='0')&&(Key<='9')||(Key==',')||(Key==BS))) 
 {Key=LEER;
 }
 if (Key==',' && Edit1->Text.Pos(",")!=0) {  //verhindert 2 Kommas!
  Key=0;       
 }
}