In der folgenden Lektion werden Sie eine Anwendung entwickeln, die genau das gut, was man von Computern ursprünglich erwartete, nämlich rechnen. Das Projekt und auch das spätere Programm sollen den Namen GeoConverter tragen und dieser beschreibt auch schon die Funktion sehr gut. Die Anwendung wird nichts anderes tun, als Koordinatendaten von Längen oder Breitengraden in Dezimalzahlen umwandeln, da sich diese für mathematische Berechnungen besser eignen. In einer späteren Lektion werden Sie mit Hilfe dieser Werte den Abstand zwischen zwei Städten berechnen. Um diese Anwendung zu erstellen, erzeugen Sie ein neues Xcode Projekt vom Typ Cocoa Application. Es soll den Namen GeoConverter tragen.
Wie auch in der letzten Lektion benötigen Sie eine neue Objective-C Klasse, die Sie MyController nennen.
Öffnen Sie anschliessend die MyController.h-Datei, falls sich diese nicht selbstständig geöffnet hat. In diesem Controller benötigen Sie zwei Action. Eine Action, um die Berechnung auszuführen, und eine weitere Action, um die Eingabefelder wieder zu leeren und sie somit für weitere Eingaben vorzubereiten. Nennen Sie diese Action deshalb calculate und clearFields. Obwohl der Name etwas verwirrend sein mag, kann man mit einem Outlet mehr tun als nur Text ausgeben. Genauso gut können mit einem Outlet, zum Beispiel einem NSTextField, Eingaben in das Programm eingelesen werden. Die Verbindung eines Outlet funktioniert also in beide Richtungen. Für die Umrechnung von Koordinaten in Längen- oder Breitengraden brauchen Sie drei Eingabefelder. Ein Feld für Grad, ein Feld für Minuten und ein weiteres für Sekunden. Dementsprechend sollten Sie dieses Outlet auch benennen. Natürlich wäre das ganze Programm nutzlos, würden die umgerechneten Werte nicht auch auf irgendeine Art angezeigt. Dafür benötigen Sie zwei weitere Outlet. Ein Outlet für die Umrechnung in RAD und ein Outlet für den dezimalen Wert Grad. Verwenden Sie als Outlet Type NSTextField und schreiben Sie einen Stern direkt vor den Name des Outlet. Der Stern bestimmt, dass dieses Outlet ein Zeiger ist. Zeiger sind eine besondere Art von Datentypen, die keine Werte beinhalten, sondern auf bestimmte Positionen im Arbeitsspeicher zeigen. Mehr dazu in späteren Lektionen.
#import <Cocoa/Cocoa.h>
@interface MyController : NSObject {
IBOutlet NSTextField *inputGrad;
IBOutlet NSTextField *inputMinuten;
IBOutlet NSTextField *inputSekunden;
IBOutlet NSTextField *outputGrad;
IBOutlet NSTextField *outputRAD;
}
- (IBAction)calculate:(id)sender;
- (IBAction)clearFields:(id)sender;
@end
- (IBAction)clearFields:(id)sender
{
[outputGrad setStringValue: @""];
[outputRAD setStringValue: @""];
[inputGrad setStringValue: @""];
[inputMinuten setStringValue: @""];
[inputSekunden setStringValue: @""];
}
Das war sicherlich nicht schwer, aber jetzt ist der Zeitpunkt, wo Sie wirklich rechnen müssen. Der ganze Vorgang besteht aus mehreren Schritten. Erzeugen Sie am besten zuerst eine komplett leere Methode für die calcualte-Action.
- (IBAction)calculate:(id)sender
{
}
Nun werden wir die Methode langsam mit Inhalt füllen. Zuerst benötigen Sie zwei Variablen, welche die Rechenergebnisse aufnehmen können.
double outGrad = 0;
double outRAD = 0;
Anschließend definieren Sie Variablen, welche die Werte aus den NSTextfield speichern können, also die Eingaben.
double inGrad = [inputGrad doubleValue];
double inMinuten = [inputMinuten doubleValue];
double inSekunden = [inputSekunden doubleValue];
Um die Eingabe eines Textfeldes als Zahl in den Programmcode zu bekommen, ist es ausreichend die Nachricht doubleValue an das Steuerelement zu senden. Die Konvertierung geschieht dabei automatisch. Lässt sich die Eingabe nicht in den Typ double umwandeln, weil es vielleicht Buchstaben sind, erhält man eine 0 als Wert. Hat man alle Eingaben eingelesen, kann gerechnet werden.
outGrad = inGrad + (inMinuten / 60) + (inSekunden / 3600);
outRAD = outGrad / 180 * M_PI;
Der Bezeichner M_PI ist nur ein Platzhalter für eine Zahl, die von Apple als 3.14159265358979323846264338327950288 hinterlegt wurde. Zum Schluss müssen noch die Rechenergebnisse in die NSTextfield für die Ausgabe eingetragen werden. Auch dafür gibt es passende Nachrichten.
outGrad = inGrad + (inMinuten / 60) + (inSekunden / 3600);
outRAD = outGrad / 180 * M_PI;
Und jetzt noch einmal die ganze Methode im Zusammenhang.
- (IBAction)calculate:(id)sender
{
double outGrad = 0;
double outRAD = 0;
double inGrad = [inputGrad doubleValue];
double inMinuten = [inputMinuten doubleValue];
double inSekunden = [inputSekunden doubleValue];
outGrad = inGrad + (inMinuten / 60) + (inSekunden / 3600);
outRAD = outGrad / 180 * M_PI;
[outputGrad setFloatValue:outGrad];
[outputRAD setFloatValue:outRAD];
}
Damit ist die Programmierarbeit getan. Der Rest der Anwendung muss im Interface Builder erstellt werden.
Geschrieben am: 09.11.2007 Technologien: Xcode, Objective-C, OS X