Newbie-Frage: Wie Button mit Carbon verbinden ?

Flupp

Flupp

Aktives Mitglied
Thread Starter
Dabei seit
27.07.2004
Beiträge
1.780
Reaktionspunkte
15
Entschuldigt die simple Frage, aber ich habe den Dreh noch nicht raus.

Ich übe gerade an einer vom Button ausgelösten Messagebox:
Die main.m ist leer und im MainMenu.nib habe ich einen Button platziert.

Wie weiter (wie baue ich den Button ins main.m ein) ?

Was mache ich nun, damit wenn der Button geklickt wird, eine kleine Box sich öffnet und scheibt "Hallo" ?
 
Ich nehme mal an du meinst Cocoa und nicht Carbon. Denn main.m und .nib sagt aus das du Cocoa benutzt. ;)

OK. Ist nicht ganz so leicht für Anfänger zu verstehen. Cocoa arbeitet strikt nach dem Model-View-Controller-Prinzip. D.h. ein Schalter ruft dann nur eine Methode auf, und ist nicht selbst die Methode, wie es z.B. in Borland C++ oder Delphi so ist.

Gute Anlaufstellen sind:

http://www.osxentwicklerforum.de
und
http://www.macentwicklerwelt.net

Aber nun zu deinem Problem:

- Schalter platzieren
- Auf Tab Classes wechslen
- NSObject anklicken
- Enter drücken
- Name vergeben (z.B. MyController)
- Info Fenster aufrufen (Tools->ShowInfo)
- MyController anklicken
- Im Info-Fenster im Tab "Action" auf Add klicken
- der Methode einen Namen geben, wie z.B. "showHello"
- Jetzt auf den Menüpunkt (obere Leiste) "Classes" gehen und dann "Create Files for MyController"
- jetzt noch mal MyController im Tab Classes anwählen (falls es nicht ist)
- danach noch mal auf Menüpunkt "Classes" und sagen "Instantiate MyController"
- Jetzt den Schalter im Fenster anklicken, "Strg"-Taste gedrückt haltenm klicken und mit der Maus auf den blauen Würfel im Tab "Instances" ziehen.
- "showHello auswählen und auf den Schalter "Connect" klicken
- speichern
- Interface Builder beenden

- In Xcode mal kurz zwischen den Ordnern klicken, damit die Dateiliste aktualisiert wird
- MyController.m auswählen
- in die Methode "showHello" z.B. sowas schreiben:

Code:
NSAlert *msg = [NSAlert alertWithMessageText:@"Hallo" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Ein Schalter sagt Hallo"];
[msg runModal];

NSAlert gibt es aber erst seit OS X 10.3. Falls du 10.2 hast, geht das nicht. ;)
 
Zuletzt bearbeitet:
Vielen Dank für die tolle Anleitung !

Aber Verglichen mit Delphi (ich habe nicht damit angefangen) ist es gar nicht "Apple-like".
Ich meine es ist weder einfach und schon gar nicht intuitiv.
Im Gegenteil es ist aufwendig und sehr Fehleranfällig !
( Wer hat sich so eine umständliche Konstruktion ausgedacht, Pat & Mat ? )

All die Definitionen und Deklarationen und das Interface (myController) muss ich selber machen, wofür habe ich dann einen Computer...

Nicht mal den Currency Converter habe ich nach Anleitung hingekriegt, irgendwas kleines fehlt, aber der Compiler läuft ohne Probleme durch. Den Fehler finde ich nie, und damit ein grosses Projekt machen, no way!

Ist das nur ein falscher Eindruck oder ist das wirklich so ?
 
Das Ding ist sehr wohl Apple-Like. Die erzeugten Programme sind schließlich ziemlich effizient, und du kannst du Userinterface per Maus designen. Im Prinzip ist das GUI-Design genau wie bei Delphi: du erzeugst die Elemente, stellst die Eigenschaften ein, und fügst Aktionen hinzu, in denen du deinen Code schreibst ;)
 
Flupp schrieb:
Ist das nur ein falscher Eindruck oder ist das wirklich so ?

Klingt jetzt vielleicht doof, aber:

Du musst hier in anderen Dimensionen denken. Klar ist es für den Delphi-Programmierer ne Qual, der Umstieg. Ich kenn das. Ich bin/war was ähnliches. ;)

Cocoa ist strikt MVC. Model-View-Controller. DAS muss einem erst mal klar werden. Dann hat man schon 50% hinter sich. ;) In kurz (und ungenau): Oberfläche, Daten und "Quellcode" sind von einander getrennt.

Mal ehrlich. Dein "Test-Programm" kommt im normalen Umfeld doch gar nicht vor. Darum ist es auch so "schwer".

Du musst jetzt das MVC-Prinzip verstehen. Dazu mehr bei MacEntwicklerWelt.net.

Was machst du in diesem Beispiel? Ist eigentlich ganz einfach. Du fügst dem Controller eine Methode hinzu. Dann sagst du dem Schalter er solle diese Methode aufrufen. Fertig. Du kannst jetzt aber auch andere Schalter und Menü-Punkte mit dieser Funktion verbinden. Die machen dann Haar genau das gleiche.

In Delphi kann man ähnlich Programmieren. Nur ist das da ein Beinbruch. ;)

Wenn du dahinter gekommen bist, wirst du merken das Cocoa einen Haufen Entwicklungs-Zeit spart, gegenüber Delphi.

Bindings usw. sind noch ganz andere Geschichten. Schon gewusst, das du durch die Fähigkeiten von Cocoa und Nutzung des WebKits einen simplen WebBrowser Programmieren kannst OHNE AUCH NUR EINE ZEILE CODE zu schreiben?

Das nur mal als Beispiel.
 
Zuletzt bearbeitet:
Naja, das mit dem Webbrowser geht bei Borlands C++ Builder auch ;)
Aber in der Tat ist Cocoa deutlich eleganter. Leider ist der Weg dahin sehr lang um das alles zu verstehen. Mir gebricht es immer wieder schlicht an Zeit dazu. Der Hillegass ist jedoch ein super Buch, um das alles zu lernen und anzuwenden! Den kann ich besten gewissens empfehlen (obwohl ich erst die ersten 100 Seiten geschafft hab). Kann man den Tag irgendwo auf 26 Stunden erweitern lassen?
 
wegus schrieb:
Kann man den Tag irgendwo auf 26 Stunden erweitern lassen?

Ziehe auf den Mars. Da hat der Tag, glaube ich, über 40 Stunden. ;)

Das mit dem C++ Builder ist mir nicht bekannt (ich kenne nur die ActiveX-IE-Komponente, da schriebt man aber Code). Fragt sich nur, ob einem der C++-Builder die Zeilen Code schreibt, oder ob es nach dem selben Prinzip läuft.

Würde mich mal Interessieren.

Denn der Sinn hinter diesem Prinzip ist ja die Fehlervermeidung. D.h. findet Apple später irgend einen Fehler in diesem Ablauf, so beheben sie diesen und alle Anwendungen haben den Fehler auch nicht mehr.
Bei kompilieren Code ist das ja nicht so.
 
Sodele, ich habe es fast so hingekriegt wie es soll.
Sobald man die Idee dahinter verstanden hat gehts, aber bei den Apple Dokumenten gibts wohl eine Lücke zwischen "Ohne Vorkenntnisse" und "Profi" ;)


Habe doch noch Fragen (scheinen wohl zu primitiv zu sein für's osxentwicklerforum.de :eek: )

1) Die Tabulator-Reihenfolge kann ich nicht ändern. Mit jedem Betätigen der Tabulatortaste springt er von oben nach unten und beginnt wieder oben. Ich möchte aber, dass er nicht wieder an den Anfang springt sondern zum Wertfeld.
Die Vorgabe "nextKeyView" wird ignoriert ?

2) main.m bleibt leer und unberührt, warum den das, sollte da nicht wenigstens irgendwas aufgerufen werden ?

3) Eine Funktion wird nicht mal ausgeführt, gibt aber keinen Compilerfehler sondern nur ein falsches Resultat:

----
ConverterController.m:

#import "ConverterController.h"
#import "Converter.h"

@implementation ConverterController
- (IBAction)convert: (id)sender
{
float rate, amt, total;
...
total = [converter convertAmount:amt atRate:rate];
...
}
@end

----
Converter.m:

#import "Converter.h"

@implementation Converter
- (float)convertAmount: (float)amt atRate: (float)rate
{
return (amt * rate);
}
@end
----
(Ich habe ein Leerzeichen zw. : und ( machen müssen, sonst gibts ein Smiliy )

Was stimmt hier nicht ?
Müsste ...=[converter convertAmount... nicht gross geschrieben sein =[Converter - genau wie Converter.m ? kopfkratz
 
Flupp schrieb:
1) Die Tabulator-Reihenfolge kann ich nicht ändern. Mit jedem Betätigen der Tabulatortaste springt er von oben nach unten und beginnt wieder oben. Ich möchte aber, dass er nicht wieder an den Anfang springt sondern zum Wertfeld.
Die Vorgabe "nextKeyView" wird ignoriert ?

2) main.m bleibt leer und unberührt, warum den das, sollte da nicht wenigstens irgendwas aufgerufen werden ?

3) Eine Funktion wird nicht mal ausgeführt, gibt aber keinen Compilerfehler sondern nur ein falsches Resultat:

(Ich habe ein Leerzeichen zw. : und ( machen müssen, sonst gibts ein Smiliy )

Was stimmt hier nicht ?
Müsste ...=[converter convertAmount... nicht gross geschrieben sein =[Converter - genau wie Converter.m ? kopfkratz


1. Sorry, kA.

2. Also in main.m sollte zumindest die Standard int main(...) mit dem Inhalt [NSApplication run] oder so stehen. Das macht Xcode aber automatisch. Sollte aber trotzdem drinnen stehen.

3. Also irgendwie verstehe ich den Sinn hinter dem nicht. ;) Außerdem fehlen noch die .h-Dateien. Die sind auch wichtig.
Hast du denn schon ein Objekt von der Klasse "Converter" angelegt? Also Converter *converter = [[Converter alloc] init]? z.B.?

edit:
Achja. In Objecvtive-C gibt es meist nur Warnung, statt Compiler-Fehler. Diese Warnungen sind meist die "Fehler". ;)
 
Zuletzt bearbeitet:
Zurück
Oben Unten